For <параметр_цикла> := <нач.знач.> To < конеч.знач.> Do <оператор>;
где <параметр_цикла> - переменная любого порядкового типа;
<нач.знач.> - начальное значение - выражение того же типа;
<конеч.знач.> - конечное значение - выражение того же типа;
На месте одного оператора может располагаться группа операторов, заключённых в операторные скобки (Begin ... end).
Для более гибкого управления операторами циклов For, While, Repeat в ТР введены две процедуры:
BREAK- реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за после последнего оператора цикла.
CONTINUE- обеспечивает досрочное завершение очередного прохода цикла, что эквивалентно передаче управления в самый конец циклического оператора.
Контрольные вопросы:
1. Определите, сколько раз будет выполнено тело цикла в приведенном фрагменте программы:
s:=0; i:=1; read(n);
while i<=n do;
begin s:=s+i;
i:=i+2;
end;
2. Нарисуйте блок-схему алгоритма, содержащего в цикле два идущих подряд условных блока.
3. Нарисуйте блок-схему алгоритма, содержащего в цикле два вложенных друг в друга условных блока.
4. Установите, какую задачу решают предложенные фрагменты программ (везде n – натуральное число). Ответьте на вопросы.
1) s:=0;
i:=n;
while i>0 do
begin s:=s+i;
i:=i-1
end.
Запишите данный фрагмент с помощью операторов for… и repeat … until.
2) s:=0;
i:=1;
j:=n;
while i<=j do
begin s:=s+i+j;
i:=i+1;
j:=j-1
end;
if n mod 2=1
then s:=s-n mod 2+1.
В каких случаях выполнится условный оператор, записанный после цикла?
3) s:=0; i:=56; j:=1;
while i<=56+2*(n-1) do
begin s:=s+j;
j:=j+1;
i:=i+2
end.
Можно ли в последнем фрагменте переменную j выразить через переменную i и убрать j из программы?
5. Правильно ли записаны на Паскале операторы цикла? Если «Да», то подсчитайте, сколько раз выполняется тело цикла. Если «Нет», объясните ошибки.
1) while true do i:=i+1;
2) for z:=1 to 2*z do i:=i+1;
3) while false do i:=i-1;
4) for u:=2*a downto –1 do i:=i-1;
5) for i:=j to j+1 do s:=s+i;
6) k:=0;
for i:=2 downto k do k:=k*2;
7) j:=56;
for i:=-4 to j div 7 do j:=j-2;
8) j:=56;
i:=-4;
while i<=j div 7 do
begin j:=j-2;
i:=i-1
end;
9) for i:=1 to n do a[i]:=2*i+6;
for a[1]:=1 to n do write(a[a[1]],' ');
10) i:=5;while i>0 do i:=i+1;
11) i:=5;while i<=0 do i:=i-1;
12) i:=5;while i>=0 do i:=i-1;
13) i:=5;while i<=0 do i:=i+1;
14) i:=90;repeat i:=i-1 until i>0;
15) i:=90;repeat i:=i-1 until i<=0;
16) i:=9;repeat i:=i+1 until i>10;
17) i:=9;repeat i:=i+1 until i<=10;
18) i:=9;repeat i:=i-1 until false;
19) i:=9;repeat i:=i+1 until true;
20) i:=9;repeat i:=i*2 until false and not false;
21) i:=9;repeat i:=i/2 until true or false;
22) i:=9;repeat i:=i/2 until true and false;
23) i:=9;repeat i:=i*2 until not (i<9) and (i>=9);
24) i:=9;while (i<=100) and (i>100) do i:=i+1;
25) i:=9;while (i<=100) do i:=i div 2;
26) for i:=9 downto i div 2 do i:=i div 2;
27) while read(x) do write(x);
28) for i:=-1 to –10 do write(i+1);
29) i:=1; while i<2 do i:=j;
30) while x<1 do x:=x>0;
31) k:=0; for i:=1 to 8 do; k:=k+i;
32) g:=9; for i:=1.0 downto –1.0 do g:=g*2;
33) g:=1; for i:=1 downto –16 d0 g:=g*2;
35) for i+j:=1 to n do read(a,b,c);
38) for if:=1 to 10 do write('then 1 else 2');
39) for x>0 to 35 do readln;
41) x:=1; repeat x:=x+1 until 100;
42) repeat true until true;
43) x:=0; repeat x:=x+1 until x<0;
6. Установите, чему равен х:
1) x:=0;
for i:=-5 to 0 do
n:=i*i;
x:=x+n;
2) n:=5;
x:=0;
for i:=1 to n do x:=i;
writeln(x);
3) for i:=1 to 5 do
for j:=1 to 5 do write('x');
Исправьте этот фрагмент так, чтобы вывод составил квадрат размером 5*5;
4) n:=0;
while n<=10 do
begin x:=n*n;
writeln(n:6,' ',x:6)
end;
Как нужно изменить этот фрагмент, чтобы были выведены числа от 1 до 10 и их квадраты. Как ту же задачу можно решить с помощью оператора for?
5) x:=0;
while x<5 do x:=x+1;
6) x:=0;i:=0;
while i<5 do i:=i+1; s:=s+1/i;
7) x:=0;i:=1;
while i>1 do begin x:=x+1/i; i:=i-1 end;
8) x:=0 i:=1;
repeat x:=x+1/i; i:=i-1 until i<=1;
9) x:=1; n:=1;
for i:=2 to n do x:=x+1/i.
7. Определите значение переменной s после выполнения следующих операторов:
s:=0; n:=10;
for i:=2 to n do s:=s+100 div i.
8. Установите, какую задачу решает каждый из предложенных фрагментов программ:
1) readln(n);
s:=0;
while n>0 do
begin s:=s*10+n mod 10;
n:=n div 10
end;
2) s:=0;
for i:=1 to n do
for j:=i+1 to n do s:=s-a[j,i];
3) s:=0;
for i:=3 downto –2 do
if i mod 2=0
then s:=s-i
else s:=s+i;
4) i:=p; j:=q;
while i<j do
begin r:=a[i]; a[i]:=a[j]; a[j]:=r;
i:=i+1;
j:=j-1
end;
5) p:=1; i:=1; y:=x;
while i<=n do
begin y:=sin(y);
p:=p*y;
i:=i+2
end;
6) s:=0;
for i:=n downto 1 do
begin p:=1;
for j:=1 to i do p:=p*j;
s:=s+p
end;
7) i:=1; j:=n;
while i<=j do
begin read(a[i],a[j]);
i:=i+1;
j:=j-1
end.
9. Студент решал задачу: «Натуральные числа вводятся в порядке возрастания до появления нуля (признак окончания ввода). Нужно напечатать факториалы всех введенных чисел. Программа должна быть эффективной, т.е. не повторять вычислений». Ниже приводятся два решения этой задачи – студента и преподавателя. Определите, какое решение удовлетворяет всем условиям задачи.
{Решение студента}
read(a);
while a<>0 do
begin p:=1;
for i:=1 to a do p:=p*i;
writeln(p);
read(a)
end;
{Решение преподавателя}
read(a);
p:=1; k:=1;
while a<>0 do
begin for i:=k to a do p:=p*i;
write(p);
k:=a+1;
read(a)
end.
10. Установите, какую задачу решает приведённый фрагмент программы. Перепишите его с использованием оператора while:
s:=1; max:=a[1];
for i:=n downto 2 do
if max<a[i]
then begin max:=a[i]; s:=1 end
else if max=a[i] then s:=s+1.
11. Установите, что делает фрагмент программы. Перепишите его, используя оператор цикла с постусловием:
s:=0;
readln(a);
while a<>0 do
begin if a mod b=0
then s:=s-a;
read(a)
end.
Задачи:
1. Запишите фрагменты решения следующих задач на Паскале (укажите сходные черты и различия в решениях):
2. 5+6+7+…+(n+5);
3. 1+3+5+…+(2n-1);
4. sin(1)+sin(2)+sin(3)+…+sin(n);
5. сумму натуральных чисел отрезка [a;b];
6. сумму четных чисел отрезка [a;b];
7. 2+22+23+…+2n;
8. ;
9.
10. k×(k+1)×(k+2)×…×2k;
11. (n+m)×(n+2m)×(n+3m)×…×(n+m2);
12. a/(a+1)/(a+2)/(a+3)/…/(a+n).
2. Запишите решения следующих задач на Паскале:
1) (…(x+a)x+a)x+a)x+…+a)x+a;
2) (…(n-p)n-p)n-p)n-…-p)n-p;
3) (…(x+a)9+a)9+…+a)9+a;
4) (…(x+1)x+2)x+3)x+4)x+…+n;
5) (…(y+n)y+(n-1))y+…+2)y+1;
6) cos(1+cos(2+cos(3+…+cos(n)…);
7) sin(n+sin(n-1+…+sin(2+sin(1)…);
8)
9) .
Литература:
1. О.Л. Голицына, И.И. Попов , Основы алгоритмизации и программирования 104-109;