Оператор цикла For.
Оператор цикла For служит для организации цикла с параметром и используется в тех случаях, когда заранее известно, сколько раз должна повторяться циклическая часть программы.
Синтаксис оператора For по возрастающим значениям параметра:
For I: =N1 to N2 do ST;
и по убывающим значениям параметра:
For I:=N1 downto N2 do ST;
где. 1) I- переменная (параметр) цикла; 2) N1 - начальное значение параметра цикла, a N2 - конечное; 3) ST - оператор (часто составной), составляющий тело цикла.
Замечания:
(1) Переменные I, N1, N2 должны быть одного и того же скалярного(простого) типа, но не типа Real, и значение N2 должно быть больше, чем значение N1 для оператора For по возрастающим значениям параметра (и наоборот, значение N1 должно быть больше, чем значение N2 для оператора For по убывающим значениям параметра). Переменная I принимает последовательные значения данного типа от N1 до N2. В частном случае, когда N1 и N2 -целые числа, а I - переменная типа Integer или Byte, то шаг всегда равен единице;
(2) Значение переменной цикла не рекомендуется изменять (т.е. присваивать новое значение) внутри тела цикла, это может привести к неправильному выполнению количества раз тела цикла;
(3) Следует обратить внимание на то, что перед первым выполнением тела цикла в операторе For вычисляются границы числа повторений тела цикла, поэтому если до этого они были неизвестны, то необходимо указать выражения для их вычисления (или указать значения, предварительно их вычислив).
Например, если
For I:=1 to 20 do A:= A+1;
то для I типа Integer, принимающего значения I = 1,2,3,...,20 (в случае, когда используется downto, то I принимает соответственно последовательные убывающие значения от N2 до N1 I = 20,19,18, … 2,1) будет выполняться оператор А:= А+1. Если же N1 и N2 символьного типа и имеют значения, например, 'А' и 'Z' соответственно, то переменная I принимает последовательные значения в порядке букв алфавита ‘А’;’В’;’C’, ..;’Z’.
Параметр цикла часто еще называют счетчиком цикла.
Процедуры Break и Continue.
Изменения в выполнении циклов в операторах FOR, WHILE и REPEAT можно внести вызовом процедур:
BREAK - реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за концом циклического оператора;
CONTINUE – прерывает выполнение текущего оператора цикла и начинает снова выполнение цикла с самого начала.
Введение в язык этих процедур практически исключает необходимость использования операторов безусловного перехода GOTO.
Демонстрационные примеры
Пример 1. (Алгоритм суммирования или произведения членов ряда)
Вычислить сумму
S=l + 1/2 + 1/3 +
...+ 1/50 (произведение
).
а) с использованием цикла While:
для суммы для произведения
PROGRAM Primer_1W; PROGRAM Proizv_1W;
var n: Integer; var n: Integer;
S: Real; S: Real;
BEGIN BEGIN
S := 0; n := 1; S := 1; n := 2;
While n<=50 do While n<=50 do
begin S := S+1.0/n; n := n+1 end; begin S := S*1.0/n; n := n+1 end;
WriteLn ('S=',S:8:2) WriteLn ('S=',S:8:5)
END. END.
б) с использованием цикла For.
для суммы для произведения
PROGRAM Primer_1F; PROGRAM Proizv_1F;
var I: Integer; var I: Integer;
S: Real; S: Real;
BEGIN BEGIN
S :=0; S := 1;
For I := 1 to 50 do S := S+1/i; For I := 2 to 50 do S := S*1/I;
WriteLn ('Сумма равна:',S:9) WriteLn ('Произведение равно :',S:9)
END. END.
в) с использованием цикла Repeat.
для суммы для произведения
PROGRAM Primer_1R; PROGRAM Proizv_1R;
var n: Integer; var n: Integer;
S: Real; S: Real;
BEGIN BEGIN
S := 0; n := 1; S := 1; n := 2;
Repeat Repeat
S := S+1.0/n; S := S*1.0/n;
n := n+1 n := n+1
until n>50; until n>50;
WriteLn ( ‘Результат: ',S) WriteLn ( ‘Результат: ',S)
END. END.
Пример 2.
Вычислить факториал числа N!=N·(N-1)·(N-2)…3·2·1.
Program Fakt;
var F,N,I:integer;
Begin
writeln;
write('Введите число N='); readln(N);
F:=1;
For I:=2 to N do F:=F*I;
writeln('Факториал‘, N:3,’ N!=', F)
End.
Пример 3.
Программа, моделирующая микрокалькулятор
PROGRAM Primer_2;
var
Operator: Char; { Символ арифметической операции }
n: Real;
Answer: Real; { Результат вычисления }
BEGIN
Answer := 0; { Вначале обнулим результат }
Operator := '+'; { Присвоить операцию ‘-‘,‘*‘ или ‘/‘ нельзя }
WriteLn ('Введите арифметическое выражение ‘);
WriteLn ('(каждый символ - с новой строки)...’);
Repeat
ReadLn (n);
Case Operator of
'+': Answer :=Answer + n;
'-': Answer :=Answer - n;
'*': Answer :=Answer * n;
'/': Answer :=Answer / n
end;
ReadLn (Operator)
until Operator = '=' ;
WriteLn (Answer:8:3)
END.
Пример 4.
Пусть А и В - положительные вещественные числа и А>В Найти такое натуральное m, что т В > А
PROGRAM Primer_3;
var А,В: Real;
m: Integer;
BEGIN
Write (' Введите числа А и В... '); Read (A); Write (' ');
ReadLn (В); m := 1;
While m*B<=A do m := m+1;
WriteLn ('Результат ', m:3, ' * ', В:3:2, ' >’, А:6:2)
END.
Пример 5.
Определение для используемого компилятора TURBO Pascal наименьшего положительного числа Eps такого, что 1+Eps>1
PROGRAM Primer_4;
const
C1 = 1.0;
С2 = 2.0;
var
Eps, Eps1: Real;
BEGIN
Eps := C1; Eps1 := C2;
While Eps1>1.0 do
begin Eps := Eps/2; Eps1 := Eps+1 end;
Eps := Eps*2;
WriteLn (' Приближенное значение Eps равно: ‘, Eps)
END.
Пример 6. Разложение целого числа на простые множители
PROGRAM Primer_5;
var x,m: Integer;
BEGIN
Write ('Введите целое число '); ReadLn (x);
WriteLn ('Разложение числа х на простые множители');
m := 2;
While m<=x do
If (x MOD m)=0
then begin Write (' * ',m); x := x DIV m end
else m :=m+1
END.
Пример 7.
Программа, позволяющая угадать целое число из отрезка [0,99]
PROGRAM Prlmer_6;
var x,z : Integer;
ugadal: Boolean;
BEGIN
Randomize;
WriteLn ('Угадай число' ); WriteLn ('от 1 до 100');
z := Random (100); ugadal := FALSE;
While NOT ugadal do
begin Write (' число='); Read (x);
If x=z
then begin ugadal :=TRUE; WriteLn ('Правильно' ) end
else If x<z
then WriteLn (' Мало ... ')
else If x>z
then WriteLn ('Много.. ')
end
END.
Пример 8.
Вычисление целой части корня квадратного из положительного числа Идея алгоритма заключается в том, что сумма К первых нечётных чисел равна А?, например, 1+3=22, 1+3+5=32 т д.
PROGRAM Primer_7;
var I, J: Integer;
x : Real; { Результат }
BEGIN
Write ('Введите положительное число из которого' );
Write (' хотите извлечь корень '); ReadLn (х);
I := -1; J := 0;
While j<=x do
begin I := I+2; J := J+I end;
Write (' Результат ',(I-1) DIV 2)
END.
Пример 9.
Найти все простые числа на заданном отрезке (использовать цикл с параметром)
PROGRAM Primer_8;
var M : Integer; { Нижняя граница отрезка }
N : Integer; { Верхняя граница отрезка }
i, j : Integer; { Параметры циклов }
kl : Integer;
BEGIN
Write ('Введите нижнюю границу отрезка '); ReadLn (M);
Write ('Введите верхнюю границу отрезка '); ReadLn (N);
WriteLn ('Все простые числа из отрезка [', M, ', ', N, ']');
For i := M to N do
Begin kl := 0;
For j :=2 to i-1 do If (i MOD j)=0 then kl:=kl+1;
If kl=0 then write(i, ' ');
end
END.
Пример 10.
Подсчитайте, сколько палиндромических чисел лежат в промежутке от 100 до 1000 (число М называется палиндромическим, если оно равно своему обращенному) Выведите их на экран дисплея.
PROGRAM Primer_9;
var d: Integer; { Результат работы программы }
x, y, z : Integer; { Параметры циклов }
n : Integer; { Палиндром }
m : Integer; { Вспомогательная переменная }
BEGIN
d:=0;
For х :=1 to 9 do
For у :=0 to 9 do
For z :=0 to 9 do
begin n := 100*x+10*y+z; m := 100*z+10*y+x;
If n=m
then begin d := d+1; Write (n, ', ' ) end
end;
WriteLn; WriteLn ('Результат: ', d)
END.
Контрольные вопросы
Перед выполнением заданий по программированию показать преподавателю умение отвечать на контрольные вопросы
1. Замените оператор «if C then A else B» равносильным ему фрагментом программы, использовав, оператор «while».
2.Написать алгоритм вычисление суммы ряда, описав его каждым из трех вариантов оператора цикла.
2.Написать алгоритм вычисления произведения ряда, описав его каждым из трех вариантов оператора цикла.
3. Вычисление f=10! описать каждым из трех вариантов оператора цикла.
4. Определить значение переменной s после выполнения следующих операторов:
s:=0; i:=0;
while i<5 do i:=i+1; s:=s+1/i;
5. Определить значение переменной s после выполнения следующих операторов:
s:=0; i:=1;
while i>1 do begin s:=s+1/i; i:=i-1 end;
6. Определить значение переменной s после выполнения следующих операторов:
s:=0; i:=1;
repeat s:=s+l/i; i:=i-1 until i<=1;
7. Определить значение переменной s после выполнения следующих операторов:
s:=1; n:=1;
for i:=2 to n do s:==s+1/i
8. var k,i: integer; x,y:real;
Найти ошибки в следующем фрагменте программы:
у:=0; for х:=0.1 to 0.9 do y:=y+sin(x);
9. var k,i: integer; x,y:real;
Найти ошибки в следующем фрагменте программы:
k:=81; y:=l; for i:=l to sqrt(k) do y:=2*y;
10. var k,i: integer; x,y:real;
Найти ошибки в следующем фрагменте программы:
k:=0; for i:=l to 9 do k:=k+sqr(i); k:=k*i;
11. var k,i: integer; x,y:real;
Найти ошибки в следующем фрагменте программы:
k:=l; for i:=l to 64 do begin i:=2*i; k:=k+i end
