Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var X, Xprev, n, l, lMax: integer;

begin

N := 0;

LMax := 0;

Xprev := 1001;

while True do begin

readln(X); { читаем число }

if X = 0 then break; { если 0, то стоп }

N:= N + 1; { увеличиваем счётчик чисел}

if X > Xprev then begin

L := L + X – Xprev; { изменяем высоту подъема }

if L > LMax then LMax := L;

end

else L := 0;

Xprev := X;

end;

writeLn('Получено ', N, ' чисел');

writeLn('Наибольшая высота подъема ', LMax);

end.

Обратите внимание, что обнулять значение L перед началом цикла ввода данных не обязательно. При выбранном начальном значении Xprev условие X>Xprev не может ыть выполнено, и в L запишется 0.

Возможен другой вариант решения (автор О.В. Алимова), который отличается в некоторых деталях:

  • для окончания цикла не используется оператор break (этот оператор не приветствуется теоретиками);

  • запоминается начальное значение возрастающей последовательности (в переменной Xstart), а не текущая высота подъема.

В переменную Xstart в самом начале записывается ноль, поскольку такого «рабочего» значения быть не может.

Xstart:= 0;

Затем, при чтении первого числа из входного потока, сразу записываем это число в Xstart:

readln(X);

if Xstart = 0 then Xstart := X;

Очевидно, что условный оператор выполнится только один раз, при первом чтении.

Обработка очередного прочитанного значения сводится к следующему:

  • увеличить счётчик чисел N

  • если подъем кончился (только что прочитанное значение меньше или равно предыдущему), найти длину полученной цепочки (вычесть из предыдущего значения стартовое) и проверить, не стала ли она больше, чем Lmax; записать последнее прочитанное число в Xstart (эта начала следующего участка подъема)

  • записать последнее прочитанное число в Xprev

Получается такой цикл ввода и обработки данных:

repeat

readln(X);

if Xstart = 0 then Xstart := X;

N:= N + 1;

if X <= Xprev then begin

if Xprev - Xstart > LMax then

LMax := Xprev - Xstart;

Xstart := X;

end;

Xprev:=X;

until X = 0;

Проверим, что будет происходить, когда прочитаем завершающий 0. Счетчик увеличится (это нужно будет учесть), условие X < Xprev выполнится, и программу зафиксирует окончание подъема. Таким образом, последнюю возрастающую цепочку мы не потеряем. Затем в Xstart и в Xprev будет записан 0, но это нас уже не волнует – цикл закончится, поскольку выполнено условие X = 0.

Поскольку мы подсчитали и последний 0, при выводе количество чисел нужно уменьшить на 1:

writeLn('Получено ', N-1, ' чисел');

Вот полная программа:

Var X, Xprev, Xstart, n, lMax: integer;

begin

N:= 0;

LMax:= 0;

Xstart:= 0;

Xprev:= 0;

repeat

readln(X);

if Xstart = 0 then Xstart := X;

N:= N + 1;

if X <= Xprev then begin

if Xprev - Xstart > LMax then

LMax := Xprev - Xstart;

Xstart := X;

end;

Xprev:=X;

until X = 0;

writeLn('Получено ', N-1, ' чисел');

writeLn('Наибольшая высота подъема ', LMax);

end.

  1. С первого взгляда эта задача кажется достаточно простой: нужно ввести две строки, подсчитать количество латинских букв в каждой из них (записав эти данные в два массива счетчиков f1 и f2), затем найти сумму произведений элементов этих массивов и разделить её на произведение длин строк.

В языке Паскаль индексами элементов массива могут быть символы, поэтому можно объявить массивы счетчиков и переменную k так:

Соседние файлы в папке ЕГЗ_2012_Поляков_май