"Программы без ошибок можно написать
двумя способами, но работает — третий"
Алан Джей Перлис

Оператор цикла с постусловием - Repeat

Сегодня будем говорить об операторе Repeat.

В переводе Repeat значит повторение. Давайте рассмотрим общую структуру этого цикла.
структура оператора Repeat в Паскале
где
repeat - зарезервированное слово (повторение);
until - зарезервированное слово (до тех пор пока);
выражение - условие, управляющее повторениями, должно быть логического типа;
оператор - любые операторы языка Pascal

    Принцип действия данного цикла схож с циклом while, но есть некоторые отличия:
  1. Выполняется оператор. Это главное отличие от цикла while, в котором сначало проверялось условие;
  2. После того, как оператор выполнился, проверяется выражение. Если его значение false, то цикл повторяется. В противном случае оператор Repeat завершает свою работу (если условие в цикле While является условием продолжения повторений, то условие в цикле Repeat - условием выхода из цикла, его завершения. Поэтому для одной и той же задачи эти условия противоположны).

В принципе, ничего сложного. Поэтому приступим к разбору задачи с циклом Repeat:

Вычислить факториал целого положительного числа N.

Я надеюсь, что все знакомы с понятием факториал числа. Нет? Тогда вам стоит подучить математику, а затем вернуться сюда и продолжить)) Для ленивых, которые не хотят идти учить математику, напомню в двух словах. Факториа́л числа n - произведение всех натуральных чисел от 1 до n включительно. Обозначается факториал восклицательным знаком (!). Если простым языком то, например, 5! = 1*1*2*3*4*5. А факториал трех 3! = 1*1*2*3. Я думаю принцип понятен, нам нужно перемножить последовательно все члены ряда.

В общем как мы будем решать эту архи сложную задачу при помощи цикла с постусловием? Для начала разберемся с переменными. По условию нам дана переменная N, значит она будет присутствовать в нашей программе. Далее нам нужно ввести некоторую переменную (возьмем F), в которой будет подсчитываться значение факториала. Изначально данная переменная будет равна 1 (потому что самый маленький факториал, учитывая возможное число N будет равен 1). Если посмотреть внимательно чуть выше, там где я расписал факториал пяти, то можно заметить одну особенность - каждый раз мы умножаем на число, которое на единицу больше предыдущего. Какой вывод из этого можно сделать? Правильно, нам нужна некоторая переменная - счетчик (обычно берут i), которая будет с каждой новой итерацией (повторением) цикла увеличиваться на единицу. Изначально данная переменная будет равна 0. Все, больше переменных нам не нужно.

Осталось правильно составить цикл Repeat. Еще разок взгляните на это 5! = 1*1*2*3*4*5. Для начала нам нужно организовать это умножение 1*1. Первая единица - это наша переменная F. Второй множитель это наша переменная i, которая у нас пока равна нулю. Значит перво-наперво в теле цикла Repeat нам нужно прописать строчку i:=i+1;, которая будет каждый раз увеличивать значение множителя на единицу. Хорошо, два первых множителя у нас есть, теперь сделаем так чтобы результат этого умножения сохранился в нашей переменной F. Для этого в блоке операторов цикла Repeat допишем строчку F:=F*i;. Готово, теперь у нас множитель каждый раз будет повышаться на единицу и умножаться на результат предыдущего произведения. Осталось составить условие для выхода из цикла. Цикл прекратит свое выполнение тогда, когда условие станет истинным. Какое бы нам условие написать? Да вот какое - i=N, т.е. пока у нас переменная i меньше заданного с клавиатуры числа N, цикл Repeat будет повторяться. Как только переменная i станет равна N произойдет выход из цикла.

Ну а дальше стандарт - вывод переменной F, содержащей результат на экран и завершение программы. Посмотрим на то, что у нас получилось в итоге:

program factorial;
var
   F,N,I:integer;
begin
   F:=1;
   I:=0;
   writeln('N = ');
   readln(N);
   
   Repeat
     I:=I+1;
     F:=F*I;
   until
     I=N;

   writeln('N! = ',F);
end.

На сегодня это все. Жду вас на следующих занятиях.