Паскаль. Основы программирования

       

Цикл с последующим условием Оператор repeatuntil


1. Оператор цикла с последующим условием (постусловием) похож на оператор цикла с предусловием, но условие вычисляется и проверяется после выполнения операторов, составляющих тело цикла.

Общий вид оператора цикла с постусловием такой:

                                                    repeat

s1; s2; s3; ..

                                                    until <условие>,

где s1, s2, s3, ... - операторы тела цикла; <условие> - логическое выражение.

Переводится: repeat

- повторять, until - до тех пор пока.

Как видите, такой цикл начинается с выполнения операторов внутри цикла, а уже затем вычисляется выражение, записанное в условии.

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

Надо сразу заметить, что в отличии от цикла while ... do, в цикле repeat

... until ... операторные скобки begin ... end могут не использоваться, хотя и использование их вреда не принесет. Можно сказать другими словами, что оператор цикла repeat ... until. ...  не требует операторных скобок begin ... end.

Рассмотрим работу этого оператора на примере.



Пример 1. Найти наименьшее натуральное число, дающее при делении на 2, 3, 4, 5, 6 соответственно остатки 1, 2, 3, 4, 5.

Задачу будем решать так: берется наименьшее натуральное число - единица и находятся остатки от деления его на 2, 3, 4, 5 и 6; если остатки будут равны 1, 2, 3, 4 и 5, тогда это число является искомым, его надо выдать на экран и закончить программу, в противном случае, надо брать следующее натуральное число - 2 и проверять его, и так далее.

Программа, составленная по этой идее, очень проста:

Program Problem1;

     uses WinCrt;

     var

        n : integer;

     begin

       n := 0;

       repeat

          n := n + 1;

       until (n mod 2 = 1) and (n mod 3 = 2) and (n mod 4 = 3) and

               (n mod 5 = 4) and

(n mod 6 = 5);

        writeln('Искомое целое число ', n)

    end.


Еще один пример, который демонстрирует работу цикла с постусловием.
Пример 2. Числа, одинаково читающиеся и слева направо, и справа налево, называются палиндромами. Например, числа 42324 или 1331 - палиндромы. Составьте программу, которая будет находить числа - палиндромы из заданного промежутка.
Логика составления программы такова.
Переставить цифры в числе и сравнить полученное число с заданным.
Раньше уже составлялась программа перестановки цифр числа, которая была выполнена с помощью цикла с предусловием
while ... do
...
Как будет построена часть программы о перестановки цифр с помощью цикла
repeat ... until ...
Пусть заданное число a, тогда введем еще одну переменную b, которой будет присвоено значение переменной a (для чего это делается вы узнаете позже): b := a;
Заведем еще одну переменную a1 для нового числа, в котором цифры уже будут переставлены.
Первоначальное значение этой переменной - ноль: a1 := 0;
Почему значение этой переменной равно нулю станет ясно из программы.
Далее организуем цикл repeat, в котором будет происходить перестановка цифр числа b:
                                            repeat
a1 := a1*10 + b mod 10;
                                                           b  := b div 10
                                            until b = 0;
Итак, в цикле, также как и в цикле while ... do ..., отделяется последняя цифра:
b mod
10; (например, 343 mod 10 = 3); переменной a1 присваивается значение:
a1 := a1*10 + b mod
10; 0 * 10 + 3 =3;
"отбрасывается" последняя цифра заданного числа с помощью операции целочисленного деления:
b := b div 10; 343 div 10 = 34;
проверяется условие: b = 0, 34 = 0, условие не выполняется, значит цикл продолжается.
Отделяется последняя цифра уже нового числа:
b mod 10 = 34 mod 10;
новое число a1, уже равное 3, умножается на 10 и к результату прибавляется следующая цифра - 4:
a1 := a1*10 + b mod
10;
"отбрасывается" последняя цифра числа b:
b := b div 10 ; 34 div 10 = 3;


проверяется условие: b = 0, 3 = 0; условие не выполняется, значит цикл продолжается.
Отделяется последняя цифра числа:
b mod 10 ; 3 mod
10 = 3;
формируется новое число:
a1 := a1*10 + b mod 10 ;  34 * 10 + 3 = 343;
"отбрасывается" последняя цифра числа и получается новое число:
b := b div 10 ;  3 div 10 = 0;
проверяется условие: b = 0, 0 = 0; условие выполняется, значит цикл заканчивается.
Теперь становится ясно, почему введена другая переменная b для заданного числа, ее значение в цикле меняется от начального до нуля и, чтобы сохранить заданное число в переменной a, и вводится, так сказать, "рабочая" переменная - b.
После окончания цикла перестановки цифр числа, сравнивается первоначальное число, которое "сохранилось" в переменной a и число, которое получилось после перестановки цифр и "накопилось" в переменной a1.
Если
a = a1, тогда значение a выдается на экран, так как это число является палиндромом.
Далее, значение a увеличивается на 1, т. е. берется для рассмотрения следующее по порядку натуральное число и снова продолжается внешний цикл. Цифры числа переставляются, полученное новое число после перестановки цифр - a1, сравнивается с первоначальным a и так далее.
Внешний цикл заканчивается, когда значение a становится равным правой границе интервала - n.
Составим
программу
Program Problem2;
     uses WinCrt;
     var
        m, n, a, b, a1 : longint;
     begin
        write('Введите левую границу промежутка '); readln(m);
        write('Введите правую границу промежутка '); readln(n);
        a := m;
        writeln('Числа палиндромы из [', m, ';', n, ']');
           repeat
              b := a; a1 := 0;
                 repeat
                    a1 := a1*10 + b mod 10;
                    b  := b div 10
                 until b=0;
              if a1 = a then write(a, ' ');
              a := a + 1
           until a > n;
     end.
 
Программы, составленные с циклом с предусловием (while ... do...), легко можно переделать с циклом с постусловием (repeat ... until ...) и они будут такими:


 
Программа, подсчитывающая сумму цифр числа:
Program Sum;    { Сумма цифр числа }
     uses WinCrt;
     var
        n, s, a : integer;
     begin
        write('Введите целое число '); readln(n);
        a := n; s := 0;
          repeat
             s := s + n mod 10; n := n div 10
          until n = 0;
        writeln('Сумма цифр числа ', a, ' равна ', s)
     end.
Программа
перестановки первой и последней цифр в числе:
Program Transpose;
     uses WinCrt;
     var
        n, n1, p, a, i : longint;
     begin
        write('Введите натуральное число n '); readln(n);
        a := n; i := 1;
        p := n mod
10; {последняя цифра введенного числа}
           repeat
              i := i*10; n := n div 10
           until n<10;
        n1 := a - n*i - p + n + p*i;
       writeln('Число после перестановки цифр ', n1)
    end.
Схематически цикл repeat можно изобразить так (см. рис. 21):

Рис. 21

Содержание раздела