Иллюстрированный самоучитель по Tirbo Pascal

       

Операторы повторений


В языке Турбо Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты программ.

Счетный оператор цикла FOR имеет такую структуру: 

FOR <пар_цик> := <нач_знач> ТО <кон_знач> DO <оператор>.

Здесь FOR, TO, DO - зарезервированные слова (для, до, выполнить);

<пар_цик> - параметр цикла - переменная типа INTEGER (точнее, любого порядкового типа, см. гл.4);

<нач_знач> - начальное значение - выражение того же типа;

 <кон_знач> - конечное значение - выражение того же типа; 

<оператор> - произвольный оператор Турбо Паскаля.

При выполнении оператора FOR вначале вычисляется выражение <нач_знач> и осуществляется присваивание <пар_цик> : = <нач_знач>. После этого циклически повторяется:

  • проверка условия <пар_цик> <= <кон_знач>; если условие не выполнено, оператор FOR завершает свою работу;
  • выполнение оператора <оператор>;
  • наращивание переменной <пар_цик> на единицу.
  • В качестве иллюстрации применения оператора FOR рассмотрим программу, осуществляющую ввод с клавиатуры произвольного целого числа N и вычисление суммы всех целых чисел от 1 до N (пример 2.5).



    Пример 2.5

    Program Summ_of_Integer;

    {Программа вводит целое положительное число N и подсчитывает сумму всех целых чисел от 1 до N}

    var

    i, n, s : Integer;

    begin

    Write('N = ');

    ReadLn(n); . {Вводим N}

    s := 0; {Начальное значение суммы}

    for i : = 1 to n do {Цикл подсчета суммы} 

    s : = s + i;

    writeln('Сумма = ',s) {Выводим результат}

    end.

    Отметим два обстоятельства. Во-первых, условие, управляющее работой оператора FOR, проверяется перед выполнением оператора <оператор>: если условие не выполняется в самом начале работы оператора FOR, исполняемый оператор не будет выполнен ни разу. Другое обстоятельство - шаг наращивания параметра цикла строго постоянен и равен (+1). Существует другая форма оператора:

    FOR<пар_цик>: = <нач_знач> DOWNTO <кон_знач> DO <оператор>


    Замена зарезервированного слова ТО на DOWNTO означает, что шаг наращивания параметра цикла равен (-1), а управляющее условие приобретает вид <пар_цик> = <кон_знач>.

    Пример 2.5 можно модифицировать так, чтобы сделать его пригодным для подсчета любых сумм - положительных и отрицательных:

    ..................

    s := 0;

    if n >= 0 then

    for i := 1 to n do

    s := s + i else

    for i := -1 downto n do s : = s + i ;

    ...............

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

    Оператор цикла WHILE с предпроверкой условия:

    WHILE <условие> DO <оператор>.

    Здесь WHILE, DO - зарезервированные слова (пока [выполняется условие], делать);

    <условие> - выражение логического типа;

     <оператор> - произвольный оператор Турбо Паскаля.

    Если выражение <условие> имеет значение TRUE, то выполняется <оператор>, после чего вычисление выражения <условие> и его проверка повторяются. Если <условие> имеет значение FALSE , оператор WHILE прекращает свою работу.

    Рассмотрим пример 2.6, иллюстрирующий использование оператора WHILE. Найдем так называемое «машинное эпсилон» - такое минимальное, не равное нулю вещественное число, которое после прибавления его к 1.0 еще дает результат, отличный от 1.0.

    Пример 2.6



    Program EpsilpnDetect;

    {Программа вычисляет и выводит на экран значение "машинного эпсилон"}

    var

    epsilon: Real;

    begin

    epsilon := 1;

    while epsilon/2 + 1 > 1 do

    epsilon := epsilon/2

    WriteLn('Машинное эпсилон = ',epsilon) 

    end.

    У читателя, привыкшего к непрерывной вещественной арифметике, может вызвать недоумение утверждение о том, что в дискретной машинной арифметике всегда существуют такие числа 0<X<eps, что 1.0+Х=1.0. Дело в том, что внутреннее представление типа REAL может дать «лишь» приблизительно 1014 возможных комбинаций значащих разрядов в отведенных для него 6 байтах. Конечно же, это очень большое число, но оно несопоставимо с бесконечным множеством вещественных чисел. Аппроксимация бесконечного непрерывного множества вещественных чисел конечным (пусть даже и очень большим) множеством их внутреннего машинного представления и приводит к появлению «машинного эпсилон».



    Оператор цикла REPEAT... UNTIL с постпроверкой условия:

    REPEAT <тело_цикла> UNTIL <условие>.

    Здесь REPEAT, UNTIL- зарезервированные слова (повторять до тех пор, пока не

    будет выполнено условие);

    <тело_цикла> - произвольная последовательность операторов Турбо Паскаля; 

    <условие> - выражение логического типа.

    Операторы <тело_цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело_цикла> повторяются, в противном случае оператор REPEAT. . . UNTIL завершает свою работу.

    Для иллюстрации применения оператора REPEAT... UNTIL модифицируем программу из примера 2.3. Модификация (пример 2.7) состоит в том, что программа будет все время повторять цикл ввода символа и печати его кода до тех пор, пока очередным символом не будет символ CR (вводится клавишей Enter).

    Пример 2.7 



    Program Codes_of_Chars;

    {Программа вводит символ и выводит на экран его код. Для завершения работы программы нужно дважды нажать Enter}

    var

    ch : Char; {Вводимый символ} 

    const

    CR = 13; {Код символа CR} 

    begin

    repeat

    ReadLn(ch);

    WriteLn(ch,' = ',ord(ch))

    until ord(ch) = CR

    end.

    Обратите внимание: пара REPEAT... UNTIL подобна операторным скобкам begin. .. end, поэтому перед UNTIL ставить точку с запятой необязательно.

    Для гибкого управления циклическими операторами FOR, WHILE и REPEAT в состав Турбо Паскаля включены две процедуры:

    BREAK - реализует немедленный выход из цикла; действие процедуры заключается в передаче управления     оператору, стоящему сразу за концом циклического оператора;

    CONTINUE - обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора.

    Введение в язык этих процедур практически исключает необходимость использования операторов безусловного перехода GOTO (см. ниже п.2.4.5).


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