Конспект лекций по программированию для начинающих. Гладков В.П. - 155 стр.

UptoLike

Составители: 

157
if m<s then begin m:=s;j:=n+1-m end;
write('максимальное количество нулей, следующих подряд ',m,' ',j).
Анализируя второй вариант алгоритма, можно заметить, что проверка на
максимум будет осуществляться для каждого ненулевого элемента, однако логика
задачи подсказывает, что такая проверка должна проводиться только по окончании
последовательности подряд идущих нулей. Заметим, что конец
последовательности можно определить, анализируя два рядом стоящих символа.
Если первый символ нуль, а рядом справа стоит не нуль, то это и будет признак
конца последовательности. Это правило определения конца последовательности не
работает для массива, оканчивающегося на нуль. Чтобы исправить этот недостаток,
добавим в конец массива один фиктивный ненулевой элемент. В этом случае для
решения задачи нужна схема перебора массива
по два элемента. Соответствующий
алгоритм приводится ниже:
{пример 11.12, вариант 3 с определением j}
m:=0; {нулей пока не обнаружено}
s:=0;
j:=0;
a[n+1]:=1; { дописали в массив фиктивный элемент для универсального
определения окончания последовательности рядом стоящих нулей }
i:=1;
while i<n+1 do
begin
if (a[i]=0) and (a[i+1]<>0)
then begin
s:=s+1;
if m<s then begin m:=s;
s:=0;
j:=i+1-m
end
else s:=0
end
else if a[i]=0 then s:=s+1;
i:=i+1
end;
write('максимальное количество нулей, следующих подряд ',m,' ',j).
Можно предложить следующий вариант решения этой задачи: дополнить
массив фиктивным ненулевым элементом, просматривать его
по одному элементу.
Ненулевые элементы не будут обрабатываться. Для нулевых организуем
вложенный цикл подсчета подряд следующих нулей. Как только цикл завершится,
а это всегда произойдет, так как в конце массива добавлен ненулевой фиктивный
элемент, проверим подсчитанное количество элементов на максимум. Номер
начала последовательности можно запомнить перед циклом подсчета нулей.
Соответствующий вариант
программы приведен ниже:
{пример 11.12, вариант 4 с определением j}
m:=0; {нулей пока не обнаружено}
j:=0;
                                      157

    if m0)
       then begin
                       s:=s+1;
                       if m