Если вы поняли идею счетчика, то понять идею сумматора вам будет нетрудно. Посмотрим, как будет работать следующий фрагмент:
s:=0; {Обнуляем сумматор. Это не менее важно, чем обнулить счетчик}
m: ReadLn(a);
s:=s+a; {Увеличиваем сумматор}
WriteLn(‘Сумма=’, s);
goto m;
Пусть мы вводим числа 8, 4, 10... В этом случае порядок выполнения операторов будет такой:
Оператор | а | s | Печать |
s:=0 | ? | ||
ReadLn(a) | |||
s:=s+a | |||
WriteLn(‘Сумма=',s) | Сумма=8 | ||
goto m | |||
ReadLn(a) | |||
s:=s+a | |||
WriteLn(‘Сумма=',s) | Сумма=12 | ||
goto m | |||
ReadLn(a) | |||
s:=s+a | |||
WriteLn(‘Сумма=',s) | Сумма=22 | ||
goto m | |||
………. |
Как видите, в ячейке s накапливается сумма вводимых чисел a, поэтому назовем эту ячейку сумматором. Отличие сумматора от счетчика в том, что счетчик увеличивается на 1 оператором c:=c+1, а сумматор - на суммируемое число оператором s:=s+a.
Задача: В компьютер вводится N чисел. Вычислить и один раз напечатать их сумму.
|
|
Программа:
VAR i,N:Integer;
a,s:Real;
BEGIN
ReadLn(N);
s:=0;
for i:=1 to N do begin
ReadLn(a);
s:=s+a
end {for};
WriteLn(‘Сумма равна ',s:20:10)
END.
Задание 49: Пусть N=2, a=5 и 3. Тогда по этой программе Паскаль напечатает 8. Что он напечатает, если:
1) Вместо s:=0 написать s:=10.
2) Вместо s:=s+a написать s:=s+a+1.
3) Строки end {for} и WriteLn поменять местами.
4) Строки s:=0 и for поменять местами.
5) Строки for и ReadLn поменять местами.
6) Строки s:=s+a и end {for} поменять местами.
7) Вместо for i:=1 to N написать for i:=2 to N.
Задания 50-52: Написать программы для следующих задач:
50) Во дворце 40 залов. Известны длина и ширина каждого зала. Вычислить площадь пола всего дворца.
51) Вычислить средний балл учеников вашего класса по физике.
52) Вычислить произведение N произвольных чисел.
Вложение циклов в разветвления и наоборот
Реальная программа на Паскале представляет собой сложную мозаику из циклических и разветвляющихся частей, вложенных друг в друга. Мы уже видели в 5.7, как в оператор case был вложен оператор for. В свою очередь в оператор цикла могут быть вложены другие операторы, как в 7.3, и так до бесконечности.
Для тренировки определите, что напечатает следующий фрагмент:
for i:=1 to 5 do begin
a:=9;
if i*i = a then for k:=5 to 8 do Write(k)
else WriteLn(1997);
end {for}
Ответ: