Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ОАП.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

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;

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

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

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

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

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

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

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

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

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