Оператор повтора FOR

FOR - для TO - до DO- делать, выполнять

. Оператор повтора состоит из заголовка (FOR…DO) и тела цикла.

Формат записи:

FOR <имя переменной>:=<выражение1> ТО <выражение 2> DO <тело цикла>

FOR <имя переменной>:=<выражение1> DOWNТО <выражение 2> DO <тело цикла>

выражение1 - определяет начальное значение параметра цикла

выражение2- определяет конечное значение параметра цикла

Тело цикла - это последовательность действий, которая выполняется многократно.

· Тело цикла может быть простым или составным оператором.

· Оператор FOR обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного.

· Значения управляющей переменной изменяется на +1(TO) или -1 (DOWNTO).

· Переменная-счетчик должна быть порядкового типа (чаще- целая, реже- символьная CHAR или логическая BOOLEAN или др. кроме вещественного). Начальное и конечное значения переменной могут быть константами, переменными, выражениями и должны иметь тип, совместимый с типом параметра цикла.

· В теле цикла запрещается явное изменение значения параметра цикла, после завершения оператора цикла значение параметра цикла становится неопределенным, если только выполнение оператора не было прервано оператором перехода.

Пример 1. Сравните программы:


PROGRAM PRIMER1;

VAR N:BYTE;

LABEL M,D;

BEGIN

N:=1;

D:IF N>10 THEN GOTO M

WRITELN(N, ‘ ‘,SQR(N));

N:=N+1;

GOTO D;

M:END;

PROGRAM PRIMER2;

VAR N:BYTE;

BEGIN

FOR N:=1 TO 10 DO WRITELN(N, ‘ ‘,SQR(N));

END;


Пример 2. Что будет выведено на экран?

For i:=10 to 14 do write(i:3);

Выведет на экран последовательность цифр в виде: 10 11 12 13 14

Пример 3. Что будет выведено на экран?

For i:=14downto 10 do write(i:3);

Выведет на экран последовательность цифр в виде: 14 13 12 11 10

Пример 4. Если переменная-счетчик имеет символьный тип Char, то оператор:

For сh:=’a’ to ‘e’do write(ch:2);

Выведет на экран последовательность букв в виде: a b c d e

Пример 5. Если переменная-счетчик имеет символьный тип Char, то оператор:

For сh:=’e’ downto ‘a’ do write(ch:2);

Выведет на экран последовательность букв в виде: e d c b a

Пример 6.

Обратите внимание- Цикл FOR удобно использовать для организации вывода данных программы. Вместе с оператором IF процедурой READLN он позволяет выполнить постраничный вывод. Например, при выполнении следующего цикла программа будет приостанавливать вывод после заполнения экрана столбцом цифр до нажатия клавиши <ENTER>

For i:=1 to150 do

Begin

Writeln(i);

If I mod 24=23 then readln;

End;

Замечание.

Для досрочного выхода из цикла можно использовать оператор GOTO или BREAK. Процедура CONTINUE позволяет прервать выполнение тела любого цикла и передает управление на его заголовок, заставляя цикл немедленно перейти к следующему выполнению (итерации)

Пример 7. Фрагмент программы с досрочным выходом из цикла:

f:=0;

For i:=1 to 45 do

Begin

f:=f+I;

If (f>100)or(i=39) then break;

End;

Пример 8. Дано натуральное n, действительное x. Вычислить

Разработаем алгоритм решения задачи:

1) ввести данные - количество слагаемых n и число x;

2) присвоить переменной, в которой будем хранить степени sin x, значение 1; S:= 0;

3) присвоить параметру цикла значение 1;

4) если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9;

5) вычислить очередную степень sin x;

6) добавить вычисленное значение к сумме;

7) увеличить параметр цикла на 1;

8) перейти к п.4;

9) вывести на печать сумму S;

10) конец.

{Программа вычисления суммы степеней sin x}

Program Summa;

Var S, X, Pr: Real; N, I: Integer;

Begin

Write('Введите число слагаемых и x: '); ReadLn(N, X);

Pr:= 1; {в этой переменной хранятся последовательные степени sin x}

S:= 0;

For I:= 1 To N Do

Begin

Pr:= Pr * Sin(X); {Очередная степень Sin(x)}

S:= S + Pr

End;

WriteLn('Сумма равна ', S: 7: 4)

End.

Функция random ( диапазон)- возвращает случайное число х (0<=x<диапазон). Тип аргумента и результата word. Если нам необходимы целые случайные числа из диапазона a<=x<b, нужно использовать выражение random(b-a)+a. Если параметр диапазонане указан, то random возвращает число х в диапазоне 0<=x<1, тип результата- real. Перед первым обращением к функции random нужно с помощьювызова процедуры randomize инициализировать программный генератор случайных чисел. В противном случае при каждом запуске программы датчик будет выдавать одни и те же числа.

Пример 9. Тест по таблице умножения

Uses crt;

Var s1,s2,otvet,k,prav:integer;

Begin

Randomize;

Clrscr;

For k:=1 to 5 do

Begin

S1:=random(18)+2; s2:=random(18)+2;{ чтобы не умножать на 0 и 1}

Write(‘сколько будет’,s1,’*’,s2,’?’);

Readln(otvet);

If otvet=s1*s2 then begin

Writeln(‘правильно!’);

prav:=prav+1;

End

Else write(‘неверно…’);

End;

Clrscr;{очистка экрана}

Writeln(‘Ваша оценка=> ’,prav);

Readln;

End.

Пример 10. Определение максимального, минимального, и среднего числа.

Var

A:real;

N: integer;

Sum,average:real;

Min,max:real;

I:integer;

Begin

Writeln(‘Введите кол-во чисел последовательности’);

readln(n);

Writeln(‘Вводите последовательность’);

Writeln(‘->’); readln(a);

Min:=a;

Max:=a;

Sum:=a;

{Введем остальные числа}

For a:=1 to n-1 do

Begin

Write(‘->’); readln(a);

Sum:=sum+a;

If a<min then min:=a;

If a>max then max:=a;

End;

Average:=sum/n;

Writeln(‘количество чисел=’, n);

Writeln(‘среднее арифметическое=’average:7:3);

Writeln(‘минимальное число=’,min:7:3);

Writeln(‘максимальное число=’, max:7:3);

End.

Домашнее задание:

1. Напишите программу, которая генерирует числа от 1 до 10 и выдает на печать 15 таких чисел.

2. Напишите программу, которая генерирует числа от 1 до 100 и останавливается, если находит число 12.

3. Напишите программу, которая запрашивает целое число от 1 до 100, и печатает целые числа до тех пор, пока не найдет заданное число.

7.3 Итерационные циклы

По сравнению с циклом с параметром итерационные циклы являются универсальными. Для организации итерационных циклов используются операторы цикла с предусловием while и цикла с постусловием repeat..until.

Эти операторы не задают закон изменения параметра цикла, поэтому необходимо перед циклом задавать начальное значение параметра с помощью оператора присваивания, а внутри цикла изменять текущее значение этого параметра.

7.4 Оператор цикла с предварительным условием

Формат оператора цикла с "предусловием":

While <логическое выражение> Do

Begin

<предложения тела цикла>

End;

Здесь While (пока) и Do (выполнить) - служебные слова.

Оператор цикла действует следующим образом. Предварительно проверяется значение логического выражения. Пока оно истинно, выполняются предложения циклической части. Как только оно становится ложным, происходит выход из цикла. Если с самого начала значение логического выражения ложно, то тело цикла не выполнится ни разу.

Обратите внимание на то, что предложения циклической части, заключенные в операторные скобки Begin - End, представляют собой составной оператор.

Возможен случай, когда в циклической части стоит оператор перехода Goto, передающий управление за пределы цикла. В такой ситуации цикл может завершиться до его естественного окончания (при истинном значении логического выражения).

Если в циклической части стоит всего одно предложение, то операторные скобки Begin - End можно не использовать и оператор цикла принимает вид:

While <логическое выражение> Do <предложение>;

· Число повторений цикла While определяется в ходе работы программы и заранее неизвестно.

· Для успешного завершения цикла While в его теле обязательно должны присутствовать инструкции, оказывающие влияние на условие выполнения тела цикла.

· После слова While записывается условие продолжения выполнения тела цикла.

· Условие- это выражение логического типа, которое может принимать одно из двух значений TRUE или FALSE.

· Тело цикла While может не выполниться ни разу, если проверяемое условие ложно с самого начала.

Пример1: Найдем сумму первых ста членов числовой последовательности 1, 2, 3, …

Program Summa;

Var I, Sum: Integer;

Begin

I:=1; S:=0;

While I<=100 do

Begin

S:=S+I;

I:=I+1;

End;

Writeln(S);

End.

Пример 2: Программа, которая печатает строки:

1 2 3 4 5 6 7 8 9 10

10 9 8 7 6 5 4 3 2 1

var i: integer;

вegin

i:=0;

while i<10 do

begin

i:=succ(i); {или штс(i); или i:=i+1}

write(I,’ ‘);

end;

writeln;

i:=10;

while i>0 do

begin

write(I,’ ‘);

i:=pred(i); {или dec(i); или i:=i-1}

end;

end.

7.5 Оператор цикла с последующим условием Repeat

Формат оператора цикла с "постусловием":

Repeat

< предложения тела цикла >

Until < логическое выражение>;.

Здесь Repeat (повторить) и Until (до тех пор) - служебные слова.

Оператор с "постусловием" работает следующим образом. Предложения циклической части выполняются повторно (по крайней мере один раз) до тех пор, пока значение логического выражения ложно. Условием прекращения циклических вычислений является истинное значение логического выражения. Итак, сначала выполняется циклическая часть, а затем проверяется условие. Обратите внимание, что эти действия прямо противоположны действиям оператора цикла с "предусловием", где сначала проверяется условие, а затем выполняются предложения циклической части.

Заметим, что нижняя граница предложений циклической части четко обозначена словом Until, поэтому нет необходимости заключать предложения циклической части в скобки вида Begin - End. В то же время наличие операторных скобок не является ошибкой.

Если в циклической части встречается оператор перехода, указывающий на метку за пределами цикла, то цикл может завершиться до его естественного окончания.

· Число повторений цикла Repeat определяется в ходе работы программы и заранее неизвестно.

· Тело цикла будет повторяться до тех пор, пока условие, стоящее после until, будет оставаться ложным.

· После слова until записывается условие завершения цикла.

· Условие- это выражение логического типа.

· Тело цикла Repeat выполняется хотя бы один раз.

Пример 1: Найдемсумму первых ста членов числовой последовательности 1, 2, 3,

Program Summa;

Var I, Sum: Integer;

Begin

I:=0; S:=0;

Repeat

I:=I+1; S:=S+I;

Until I=100;

Writeln(S);

End.

Пример 2: Игра «Угадай число». Игрок должен угадать число comp, «задуманное» компьютером- случайное число в диапазоне от 1 до 1000. процесс продолжается до тех пор, пока значение переменной igrok, которая вводится с клавиатуры, не совпадает со значением переменной comp.

Program igra;

Var comp: integer;{ число, задуманное компьютером }

Igrok: integer;{ вариант игрока }

Begin

Randomize; { инициализация датчика случайных чисел }

Comp:=random(1000);{ rкомпьютер загадал число }

Repeat

Write(‘введите число’);

Readln(igrok);

If igrok>comp then writeln(‘слишком много…’)

else If igrok<comp then writeln(‘слишком мало…’)

else writeln(‘Вы угадали!’);

until igrok=comp;

End.

Пример 3. Оператор repeat можно использовать для проверки правильности ввода исходных данных.Предположим, что по условию задачи исходное данное должно быть двузначным числом. Программа будет повторять запрос на его ввод до тех пора, пока не получит то, что ей требуется.

Program vvod;

Var x: integer[

Begin

Repeat

Write(‘введите двухзначное число’);

Readln(x);

until (x>9)and(x<100);

End.

Пример 4. Оператор REPEAT можно использовать для повтора фрагмента или всей программы, для того, чтобы произвести необходимые действия, но уже с другими данными. Чтобы каждый раз не перезапускать программу, необходимо оформить { повторяемый фрагмент} при помощи REPEAT.

Uses crt;

Var flag:char;

Begin

Repeat

{повторяемый фрагмент}

writeln(‘Повторить(y/Y)?’);

readln(flag);

until upcase (flag)<>’Y’;

End.

Функция upcase преобразует строчную букву в прописную, во всех остальных случаях ее результат совпадает с аргументом.(кириллица не обрабатывается). Т.о. вне зависимости от регистра нажатой клавиши у или У, будет выполняться повтор группы операторов {повторяемый фрагмент}. В противном случае программа завершит работу.

Пример 5. Тест по таблице умножения(вариант №2)

Uses crt;

Var s1,s2,otvet,kol,prav:integer; yn:char;

Begin

Randomize;{инициализация датчика случайных чисел}

Clrscr;{очистка экрана}

Repeat

Kol:=kol+1;

S1:=random(18)+2; s2:=random(18)+2;{ чтобы не умножать на 0 и 1}

Write(‘сколько будет’,s1,’*’,s2,

Readln(otvet);

If otvet=s1*s2 then begin

Writeln(‘правильно!’); prav:=prav+1;

End

Else write(‘неверно…’);

Write(‘Продолжим тест?(N\У’); Readln(yn);

Until (yn=’n’)or(yn=’N’);

Clrscr;{очистка экрана}

Writeln(‘Результаты теста:’);

Writeln(‘Задано вопросов:’ kol,’.Правильных ответов:’, prav,’.’);

Readln;

End.

Пример 6. На интервале [2; n ] найти натуральное число с максимальной суммой делителей.

Предлагаемая задача может быть отнесена к классу «задачи целочисленной арифметики», где аргументы, результаты и промежуточные величины относятся к целому типу. Следует заметить, что в такого рода задачах довольно часто используются операции DIV и MOD; наиболее типичной подзадачей является определение количества цифр в записи числа.

Алгоритм решения задачи:

1) ввести число n;

2) переменной для хранения максимальной суммы делителей присвоить

значение 1 (это сумма делителей числа 1);

3) запомнить число с максимальной суммой делителей;

4) параметру цикла I присвоить значение 2;

5) если I больше n, перейти к п. 13, иначе - к следующему пункту;

6) переменной для хранения очередной суммы делителей присвоить значение 0;

7) параметру цикла K присвоить значение 1;

8) если K больше I/2, перейти к п. 11, иначе - к следующему пункту;

9) если I делится на K без остатка, добавить K к текущей сумме делителей;

10) увеличить K на 1 и перейти к п. 8;

11) сравнить текущую сумму делителей с максимальной, если максимальная меньше,

запомнить новое значение и число, соответствующее этой сумме;

12) увеличить I на 1 и перейти к п. 5;

13) вывести число с максимальной суммой делителей и эту сумму;

14) конец.

Program Sum_Del;

Var N, I, Sum_Max, Sum, K, Ch: Integer;

Begin

Write('Введите число N: '); ReadLn(N);

Sum_Max:= 1; {Максимальная сумма делителей}

Ch:= 1; {Число с максимальной суммой делителей}

For I:= 2 To N Do {Это цикл по количеству чисел}

Begin

Sum:= 0;

For K:= 1 To I Div 2 + 1 Do {В этом цикле находим сумму делителей}

If I Mod K = 0 Then {Если I нацело делится на K, то K - делитель I}

Sum:= Sum + K;

Sum:= Sum + I;

If Sum > Sum_Max Then Begin Sum_Max:= Sum; Ch:= I End;

End;

WriteLn('Максимальную сумму делителей ', Sum_Max, ' имеет число ',Ch)

End.

Пример 7. Дано натуральное число n. Получить все простые делители этого числа.

{Программа отыскания простых делителей данного числа}

Program Pr_Del;

Var N, I, Vsp: Integer;

Log_Per, Priznak: Boolean;

Begin

Write('Введите натуральное число: ');

ReadLn(N);

Priznak:= True; {Признак того, не является ли введенное число простым}

{Пока параметр цикла не превысил квадратного корня из данного числа,

продолжаем поиск простых делителей}

For I:= 2 To Round(Sqrt(N)) Do

If N Mod I = 0 Then

Begin

Priznak:= False; {Введенное число не является простым}

Log_Per:= False; {Логическая переменная, принимающая значение True,

если нашлись делители I, отличные от 1 и I}

Vsp:= 2;

Repeat

If (I Mod Vsp = 0) And (I <> Vsp) Then Log_Per:= True;

Vsp:= Vsp + 1

Until (Vsp > I Div 2 + 1) Or Log_Per;

If Not(Log_Per) Then WriteLn(I) {Если число I простое, печатаем его}

End;

If Priznak Then WriteLn(N)

End.

Предлагаем читателю самостоятельно разобраться с представленным решением.

Контрольные вопросы и задания

1) Назовите отличия итерационных циклов и цикла с параметром.

2) Какова структура оператора цикла с параметром? Как выполняется цикл с парметром?

3) Какого типа должны быть пареметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal?

4) Могут ли параметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal быть разных типов? Обоснуйте ответ.

5) Может ли один цикл быть вложен внутрь другого? Если да, то какова глубина этой вложенности?

6) Какова структура циклов с пред- и постусловием? как выполняются эти циклы?

7) Каково минимальное и максимальное количество исполнений циклов с пред- и постусловием? С чем это связано?

8) Сколько раз исполнится фрагмент программы?

For i:= 1 to -1 Do k:=k*i;

9) Сколько раз исполнится фрагмент программы?

For i:= -1 to 1 Do k:=k*i;

10) Сколько раз исполнится фрагмент программы?

For i:= 1 downto -1 Do k:=k*i;

11) Сколько раз исполнится фрагмент программы?

M:= 123; While M <> 0 Do M:= M Mod 10;

12) Для цикла с параметром запишите его полный эквивалент с помощью циклов с пред- и постусловием.

13) Для цикла с предусловием запишите его полный эквивалент с помощью цикла с постусловием.

14) Для цикла с постусловием запишите его полный эквивалент с помощью цикла с предусловием.

Домашнее задание:



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: