3.9.1. Оператор REРЕАТ

Оператор повтора rереаt: состоит из заголовка (rереаt), тела и условия окончания (until). Ключевые слова rереаt, until обозначают "повторяй" и "пока" соответственно.

repeat
     { Инструкции )
   until Условие выхода из цикла;

Вначале выполняется тело цикла — инструкции, которые находятся между rереаt и until, затем проверяется значение условия выхода из цикла. В том случае, если оно равно falsе (ложь), т. е. не выполняется — инструкции цикла повторяются еще раз. Так продолжается до тех пор, пока условие не станет true (истина). На рис. 3.2 приведена блок-схема оператора повтора repeat.

Рис. 3.2. Условное обозначение на схемах алгоритмов оператора rереаt

Для примера давайте вернемся к игре "Угадай число" (см. рис. 1.2). Напомним — ее условие состояло в том, что игрок должен угадать число, назовем его соmр, "задуманное" компьютером — случайное число в диапазоне от О до 1000. Процесс продолжается до тех пор, пока значение переменной igrok, которая вводится с клавиатуры, не совпадет со значением переменной соmр (листинг 3.12).

ЛИСТИНГ 3.12.Игра "Угадай число" (Вариант №1)

var
   comp: integer; { число, "задуманное" компьютером }
   igrok: integer; { вариант игрока }
begin
   randomize; { инициализация датчика случайных чисел }
   comp:=random(l000); { компьютер загадал число }
   repeat
      write('Введите число: '); readln(igrok);
      if igrok>comp then writeln('Слишком много...')
        else if comp>igrok then writeln('Слишком мало...')
            else writeln ('Вы угадали!');
    until igrok=comp;
end.

Оператор rереаt может использоваться для проверки правильности ввода исходных данных. Предположим, что по условию задачи исходное данное должно быть двузначным числом. Программа будет повторять запрос на его ввод до тех пор, пока не получит то, что ей требуется. Рассмотрим соответствующий фрагмент программы:

var х: integer;
begin
. . .
repeat
   write('Введите двузначное число ');readln(х);
until (x>9)and(x<100);
. . .
end.

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

uses crt;
var flag: char;
begin
   repeat
        { Повторяемый фрагмент }
        writeln('Повторить (Y/y) ?'); readln(flag);
    until upcase (flag)<>'Y';
end.

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

Следует знать:

число повторений операторов (инструкций) цикла repeat определяется в ходе работы программы и во многих случаях заранее неизвестно;

• инструкции цикла repeat будут выполняться, пока условие, стоящее после until, будет оставаться ложным;

• после слова until записывается условие завершения цикла;

условие — это выражение логического типа: простое выражение отношения или сложное логическое выражение;

• для успешного завершения цикла repeat в его теле обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла, иначе цикл будет выполняться бесконечно — программа зациклится. Другими словами, переменная, которая участвует в условии выхода из цикла, обязательно должна изменяться в теле цикла.

• цикл repeat — это цикл с постусловием (условие проверяется после выполнения тела цикла), т. е. инструкции тела цикла будут выполнены хотя бы один раз;

• поэтому цикл repeat удобно использовать в тех случаях, когда тело цикла гарантированно должно выполниться хотя бы один раз;

• нижняя граница операторов тела цикла четко обозначена словом until, поэтому нет необходимости заключать эти операторы в операторные скобки begin и end. В то же время наличие операторных скобок не будет являться ошибкой.

Листинг 3.13 содержит программу "Тест по таблице умножения", которая уже приводилась в качестве примера при рассмотрении условного оператора (см. листинг 3.4). В результате использования цикла получается полноценная тестирующая программа, которая также будет выводить и результаты тестирования. Обратите внимание, что команда инициализации датчика случайных чисел randomize выполняется до начала цикла, т. к. она должна быть выполнена только один раз. Инструкции для вывода результатов теста выполняются после выхода из цикла.

ЛИСТИНГ 3.13. Тест по таблице умножения (вариант №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;
        write('Сколько будет ',s1,'*',s2,'? '); readln(otvet);
        if otvet=s1*s2 then
          begin
            write('Правильно! '); prav:=prav+1;
          end
        else write('Неверно...');
        write('Продолжим тест?(Y/N)'); readln(yn);
    until (yn='n')or(yn='N');
    clrscr; ( очистка экрана }
    writeln('Результаты теста: ');
    write('Задано вопросов: ',kol,'. Правильных ответов: ',prav,'.');
    readln;
end.

Листинг 3.14 содержит программу, которая имитирует арифметический калькулятор (используются операторы присваивания, условия и выбора).

ЛИСТИНГ 3.14. Арифметический калькулятор

var
    х,у,result: real;
    operation,ans: char;
begin
    repeat { начало цикла с постусловием }
        write('х = '); read(x); { считывание первого операнда }
        write('у = '); readln(y); { считывание второго операнда }
        write('Операция ( + ,-,*,/) > ');
        readln(operation); { считывание знака операции }
        case operation of { выбор арифметического действия }
            '+' : result:=х+у;
            '-' : result:=х-у;
            '*' : result:=х*у;
            '/' : result:=х/у;
        else
            writeln('Ошибка ввода');
        end;
        { вывод арифметического выражения }
        writeln(х:7:3,operation:3,у:7:3,' = ',result:7:3);
        write('Продолжить (у/n)');
        readln(ans); { считывание ответа на вопрос }
    until (ans='n')or(ans='n'); { проверка условия окончания цикла }
end.

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

ЛИСТИНГ 3.15. Суммирование любого количества целочисленных значений

var count,х: integer; sum: real;
begin
   count:=1; sum:=0;
   repeat { повторять }
        { начало тела цикла }
        write('Введите значение ',count,' —го слагаемого: ');
        readln(х); { ввести очередное значение х }
        count:=count+l;
        if х<>999 then sum:= sum+x;
    until x=999; { условие окончания цикла }
    writeln('Сумма введенных чисел = ',sum:7:3);
end.

Листинг 3.16 содержит другой вариант игры "Угадай число". Программа случайным образом выбирает число в диапазоне от 1 до 10 и предлагает пользователю угадать его за 5 попыток.

ЛИСТИНГ 3.16. Игра "Угадай число" (вариант №2)

   const nрор=5; { количество попыток }
var
   comp: integer; { число, "задуманное" компьютером }
   igrok: integer; { вариант игрока }
   n: integer; { кол-во попыток, сделанное игроком }
begin
   n: =0;
   randomize; { инициализация датчика случайных чисел }
   comp:=random(9)+1; { компьютер задумал число }
   writeln('Компьютер "задумал" число от 1 до 10');
   writeln('Угадайте его за ',прор,' попыток');
   writeln('Введите число');
   repeat
        n:=n+1;
        write('->'); readln(igrok);
    until(n=npop)or(comp=igrok);
    if comp=igrok then writeln('Вы выиграли!')
       else writeln('Вы проиграли... Компьютер задумал число ', comp);
end.

 предыдущая         меню        вверх         следующая

Hosted by uCoz