Задание 2 Вариант 3 Самостоятельная работа 5 ГДЗ Рабочая тетрадь Босова 11 класс (Информатика)
Запишите текст программы.
program s5_v3_2;
const
n = 92; //июнь — 30, июль — 31, август — 31
var
c: array[1..n] of integer;
i, j, l, lmax, k2, k1m, k2m: integer;
begin
writeln(‘ввод массива’);
randomize;
for i := 1 to n do
begin
c[i] := random(2);//получается массив из 1 и 0
write(c[i], ‘ ‘)
end;
writeln;
lmax := 0; i := 1;
while i < = n do
begin
//если встретился 0 и следующий элемент не последний
if (c[i] = 0) and (i + 1 < n) then
begin
l := 1; j := i + 1;
//если следующий тоже 0
while (c[j] = 0) and (j < n) do
begin
l := l + 1;
j := j + 1;
end;
//день завершения текущего периода без осадков
k2 := j - 1;
if l > lmax then
begin
lmax := l;
//последний день максимальной продолжительности без осадков
k2m := k2;
//первый день максимальной продолжительности без осадков
k1m := k2m — lmax + 1;
end;
l := 0; i := j;
end;
//если следующий не 0
i := i + 1
end;
writeln(‘lmax=’, lmax, ‘ k1m=’, k1m, ‘ k2m=’, k2m);
write(‘Месяц начала максимального периода без осадков’);
if k1m < = 30 then writeln(' июнь')
else if (k1m > = 31) and (k1m < = 61) then writeln(' июль')
else if (k1m > = 62) then writeln(‘ август’);
write(‘Месяц завершения максимального периода без осадков’);
if k2m < = 30 then writeln(' июнь')
else if (k2m > = 31) and (k2m < = 61) then writeln(' июль')
else if (k2m > = 62) then writeln(‘ август’)
end.
В программе есть дополнительные выводы промежуточных значений для проверки правильности работы программы. При желании можно их закомментировать – поставить перед ними //.
Нужно просмотреть массив из $$92$$ элементов, где $$0$$ означает день без осадков, а $$1$$ — день с осадками. Затем найти самый длинный подряд идущий участок из нулей и определить, в каком месяце он начинается и заканчивается.
Для этого удобно:
- сгенерировать или считать массив значений;
- последовательно просматривать элементы массива;
- при встрече $$0$$ считать длину текущего участка без осадков;
- если найденный участок длиннее предыдущего максимума, запомнить его длину, первый и последний дни;
- по номерам дней определить месяц: июнь — $$1\ldots 30$$, июль — $$31\ldots 61$$, август — $$62\ldots 92$$.
Текст программы:
program s5_v3_2;
const
n = 92; {июнь — 30, июль — 31, август — 31}
var
c: array[1..n] of integer;
i, j, l, lmax, k2, k1m, k2m: integer;
begin
writeln(‘ввод массива’);
randomize;
for i := 1 to n do
begin
c[i] := random(2); {получается массив из 1 и 0}
write(c[i], ‘ ‘)
end;
writeln;
lmax := 0; i := 1;
while i <= n do
begin
if (c[i] = 0) and (i + 1 < n) then
begin
l := 1; j := i + 1;
while (c[j] = 0) and (j < n) do
begin
l := l + 1;
j := j + 1;
end;
k2 := j — 1;
if l > lmax then
begin
lmax := l;
k2m := k2;
k1m := k2m — lmax + 1;
end;
l := 0; i := j;
end;
i := i + 1
end;
writeln(‘lmax=’, lmax, ‘ k1m=’, k1m, ‘ k2m=’, k2m);
write(‘Месяц начала максимального периода без осадков’);
if k1m <= 30 then writeln(‘ июнь’)
else if (k1m >= 31) and (k1m <= 61) then writeln(‘ июль’)
else if (k1m >= 62) then writeln(‘ август’);
write(‘Месяц завершения максимального периода без осадков’);
if k2m <= 30 then writeln(‘ июнь’)
else if (k2m >= 31) and (k2m <= 61) then writeln(‘ июль’)
else if (k2m >= 62) then writeln(‘ август’)
end.
В программе есть дополнительные выводы промежуточных значений для проверки правильности работы. При необходимости их можно закомментировать.
Ответ
Программа находит самый длинный подряд идущий участок без осадков и определяет месяц его начала и окончания.