Series19. Дано целое число $$N$$ ($$> 1$$) и набор из $$N$$ целых чисел. Вывести те элементы в наборе, которые меньше своего левого соседа, и количество $$K$$ таких элементов.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
program Series19; var i,K,N,Num,Num1 :Integer; begin Write('N:'); Readln(N); K:=0; for i:=1 to N do begin write('Введите',i,' элемент :'); Readln(Num); if (Num1>Num) and (i<>1) then begin writeln(Num); inc(K); end; Num1:=Num; end; Writeln(K); readln; end. |
Решение Newton:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
program Series19; label Restart; var Counter, Number, Prev, Curr, Total : integer; begin Restart: write('Enter the number of elements N: '); readln(Number); writeln; Total := 0; Prev := random(50); writeln('Element # 1:', Prev :4); for Counter := 2 to Number do begin Curr := random(50); write('Element #', Counter :2, ':', Curr :4); if Curr < Prev then begin Total := Total + 1; write(Curr :4, Total :4); end; Prev := Curr; writeln; end; writeln; writeln('The K is: ', Total); writeln; goto Restart; end. |
Другие задачи из раздела Series можно посмотреть здесь.
Было:
Стало:
Была ли инициализирована переменная Num1 до ее использования в первом прогоне цикла?
Несколько избыточное ради наглядности решение с элеменами автоматизации:
// на англ — не люблю часто переключаться между раскладками
// знаю, что goto+label — это плохо, использую только чтобы зациклить программу для проверки
> Была ли инициализирована переменная Num1 до ее использования в первом прогоне цикла?
Нет не была.
Что бы её инициализировать надо много писать. А так как компилятор bp позволяет стрелять себе в ногу я не преминул этим воспользоваться.
Дело в том, что паскаль это строго типизированный язык и в Num1 :Integer всегда будет целое число. Любое но всегда целое. :
При первом прогоне:
Num1 не инициализирована (может быть любое число из диапозона целых чисел, дипазон зависит от компилятора)
i =1
И вот такое вырожение:
if (Num1>Num) and (i<>1) then
По правилам логики (i<>1) = лож, следовательно нам без разницы что получилось вот здесь: (Num1>Num).
Выражение при первом проходе будет ложным. И да, так можно делать не везде. И лучше так не делать. И особенно не делить на не инициализированные числа . 🙂
Ну а после того выражения оно сразу приобретает точное значение:
Num1:=Num;
>знаю, что goto+label — это плохо, использую только чтобы зациклить программу для проверки
так зачем? можно заменить конструкцией repeat … until false; или более распростаннёное в других язываках while (true) do begin .. end;
> на англ — не люблю часто переключаться между раскладками
да ещё и не везде этот русский будет корректно отображаться. Пишу на русском, что бы не писать комментариев 🙂
А по решению, так то это тоже самое решение, что и у меня, но первое значение вводиться до цикла.
вывел его в шапку.. чтоб если что был бы пример как можно по разному реализовать один и тот же алгоритм. 🙂