Цикл с постусловием (REPEAT-UNTIL)
Цикл с постусловием в языке программирования Pascal реализуется с помощью оператора REPEAT... UNTIL.
Синтаксис
repeat {Операторы}
until условие выхода из цикла; |
- Условие - это логическое выражение булевского типа (операция отношения или логическая операция)
- Тело цикла выполняется в любом случае, затем проверяется условие.
- Инструкции тела цикла (операторы) выполняются в том случае, если значение логического выражения равно false, в противном случае осуществляется выход из цикла
- Оператор repeat может быть использован для проверки правильности ввода исходных данных
- Нижняя граница тела цикла определена служебным словом until, поэтому операторные скобки begin и end могут быть опущены (однако если операторы тела цикла заключены в операторные скобки - это не является ошибкой).
- Операторы repeat и while взаимозаменяемы. То есть, практически любую задачу можно решить как с помощью цикла с постусловием, так и с помощью цикла с предусловием. Использование того или иного цикла зависит от предпочтения программиста.
Блок-схема
Примеры задач на использование цикла с постусловием
Пример №1
- Постановка задачи:
Выводится на экран последовательность 20 случайных чисел из промежутка [-10,10]. Определить количество отрицательных чисел больших -5 в данной последовательности.
- Блок-схема
- Кодирование
program psldv; var
i,j:integer;
x:real;
begin randomize; {процедура инициализации генератора случайных чисел} i:=20; j:=0; repeat x:=random(20)-10; {генерируем случайное число}
write(x:4:0); {выводим это число на экран}
if (x > -5) and (x < 0) then inc(j); {процедурой inc увеличиваем аргумент на единицу,
считаем найденные числа}
dec(i); {процедурой dec уменьшаем аргумент
на единицу, определяем условие
выхода из цикла}
until i=0; writeln; write('Количество отрицательных чисел больших -5 равно ', j); end. |
- Тестирование
-10 8 -6 1 7 8 -1 1 -5 -5 5 -9 -4 -5 -7 -9 -10
6 9 5
Количество отрицательных чисел больших -5 равно 2
Пример №2
- Постановка задачи:
Определить сумму и количество цифр числа.
- Блок-схема
- Кодирование
program sum; var
s,a:byte;
n:longint;
begin
write('n = '); readln(n); s := 0; a := 0;
repeat
s := s + n mod 10; {Суммируем цифры} a := a + 1; {определяем количество цифр}
n := n div 10; {Уменьшаем разряд,
определяем условие выхода из цикла}
until n = 0; writeln('Сумма цифр числа равна ', s); writeln('Количество цифр в числе ', a); end. |
- Тестирование
n = 12345
Сумма цифр числа равна 15
Количество цифр в числе 5
Пример №3
- · Постановка задачи:
Вычислить сумму бесконечной последовательности
pi/4=1-1/3+1/5-1/7+...+(-1)n-1/(2n-1) с точностью до 1e-7.
- · Блок-схема
- Кодирование
program sum; const
eps = 1e-7; {Точность вычислений} var
s,q,u:real;
n:longint;
k:shortint;
begin
s := 0; n := 1; k := 1;
repeat q := s; {Сохраняем начальное значение суммы}
s := s + k/(2*n - 1); {Получаем очередное слагаемое}
k := k * (-1); {Определение знака следующего
слагаемого}
n := n + 1;
u := s - q; {Текущая погрешность}
until abs(u) < eps; {Выходим из цикла, если погрешность станет меньше eps} writeln('S = ', s:2:8, s*4:15:8); writeln(Pi:29:8) {Для сравнения выводим встроенную константу Pi} end. |
- Тестирование
S = 0.78539821 3.14159285
3.14159265
(Для демонстрации точности вычисления в данной задаче полученная сумма умножается на 4, что дает приблизительное значение числа "пи". Полученное значение числа "пи" сравнивается с выводом встроенной константы Pi.
Примечание: ряд сходится медленно, так что не стоит делать точность больше или eps меньше.)