Оператор повтора
while состоит из заголовка и тела цикла.
Ключевые слова
while и do обозначают "до тех пор, пока" и "выполняй" соответственно.
while Условие выполнения цикла do
{ Инструкции }
end;
Оператор while аналогичен оператору
repeat, но проверка Условие выполнения цикла
производится в самом начале оператора — если значение условия равно true (истина),
то выполняются инструкции цикла, находящиеся между begin и
end и снова вычисляется выражение Условие выполнения цикла. Так продолжается
до тех пор, пока значение Условие выполнения цикла не станет равно false (ложь).
На рис. 3.3 приведена блок-схема оператора повтора while.
Рис. 3.3. Условное обозначение на схемах алгоритмов оператора while
Например, рассмотрим фрагмент программы суммирования чисел от 1 до 10. В данном примере использование всех видов цикла равноценно:
…
s:= 0; i:= 1;
while i<=10 do { находим сумму чисел от 1 до 10 }
begin
s:=s+1;
i:=i+1; { изменение переменной управления циклом }
end;
…
Следует знать:
• число повторений операторов (инструкций) цикла while
определяется в ходе работы программы и, как правило, заранее неизвестно;
• после слова while записывается условие продолжения выполнения инструкций цикла, в этом
отличие цикла while от цикла repeat;
• условие — это выражение логического типа: простое выражение отношения
или сложное выражение отношения (логическое выражение), которое может принимать одно из двух значений:
true или false;
• для успешного завершения цикла while в его теле
обязательно должны присутствовать инструкции, оказывающие влияние на условие выполнения инструкций цикла;
• цикл while — это цикл с предусловием, т. е.
инструкции тела цикла вообще могут быть не выполнены, если проверяемое условие ложно с самого начала;
• исходя из последнего утверждения цикл while считают
самым универсальным видом цикла;
• цикл while обычно применяется в тех же задачах,
что и repeat (в зависимости от личного вкуса программиста).
Удобнее всего использовать его в тех случаях, когда возможны ситуации невыполнения цикла;
• в операторе цикла while точка с запятой никогда не ставится после зарезервированного слова do.
Листинг 3.17 содержит программу "Тест по таблице умножения", измененную таким образом, чтобы,
при необходимости, можно было отказаться от выполнения теста и корректно выйти из программы. Такая ситуация
может возникнуть, например, при случайном запуске программы, не преследующем цель проверки знаний.
ЛИСТИНГ 3.17. Тест по таблице умножения (вариант № 3)
uses crt;
var s1,s2,otvet,kol,prav: integer; yn: char;
begin
    randomize; { инициализация датчика случайных чисел }
    clrscr; { очистка экрана }
    write('Начнем тест?(Y/N)'); readln(yn);
    while (yn<>'n') and (yn<>'N') do
      begin
        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);
      end; { конец цикла }
    if kol>0 then
      begin
        clrscr; { очистка экрана }
        writeln('Результаты теста: ');
        write('Задано вопросов: ',kol);
        writeln('. Правильных ответов: ',prav,'.');
        readln;
      end; { выводим результаты, только если тест состоялся }
end.
Листинг 3.18 содержит программу, которая производит суммирование произвольного количества
целых чисел, вводимых с клавиатуры. Концом последовательности служит ввод отрицательного числа.
ЛИСТИНГ 3.18. Суммирование произвольного количества
целых чисел
var count,item,sum: integer;
begin
    count:=0; { счетчик чисел }
    sum:=0; { сумма чисел }
while true do { бесконечный цикл }
    begin
        count:=count+1;
        write('Введите ', count, ' -e целое число: ');
        readln(item); { ввод очередного числа }
        if item<0 then break; ( выход из цикла }
        sum:= sum+item;
    end;
writeln('Сумма введенных чисел равна ', sum);
end.
Листинг 3.19 содержит программу, которая выводит на экран таблицу значений функции. Вывод
выполняется в два столбца: первый — значения аргумента, второй — значения функции при изменении аргумента
от 0,3 до 3,7 с шагом 0,4.
ЛИСТИНГ 3.19. Таблица значений функции
uses crt;
var х, у, z, lg3, a,b,dx: real;
begin
   clrscr;
   write('Введите начальное значение аргумента: '); readln(а),
   write('Введите конечное значение аргумента: '); readln(b);
   write('Введите шаг табулирования: '); readln(dx);
   writeln('---------------':20);
   writeln('x':9, ' | ':4,'y':4);
   writeln('---------------':20);
   lg3:=ln(3.0)/ln(10.0); { вычисление lg(3) }
   x:=a;
while x<(b+dx/2) do
      begin
        z:=sin((pi*x)/3);
        if(z < 0) then writeln(x:10:3,' | функция не определена':22)
        else
          begin
            y:=lg3+x*sqrt(5.0*z);
            writeln(x:10:3,' | 'y:7:3);
          end;
        x:=x+dx;
      end;
    writeln('---------------':20);
end.
Листинг 3.20 содержит программу, которая представляет заданное натуральное число при помощи римских
цифр. При этом 500 обозначается D, 100 - C, 50 - L, 10 - X, 5 - V, 1 - I.
ЛИСТИНГ 3.20. Запись натурального числа римскими цифрами
var i: integer;
begin
   write('Введите целое десятичное число: '); readln(i);
    write(i,' ');
    while i>=500 do
        begin
            write('D'); i:=i-500
        end;
    while i>=100 do
        begin
           write ('C'); i:=i-100
        end;
    if i>=50 then
        begin
            write('L'); i:=i-50;
        end;
    while i>=10 do
        begin
           write('X'); i:=i-10
        end;
    if i>=5 then
        begin
            write('V'); i:=i-5;
        end;
    case i of
        0:;
        1: write('I') ;
        2: write('II');
        3: write('III');
        4: write('IV');
   end;
   writeln;
readln;
end.
Листинг 3.21 содержит программу, которая наглядно демонстрирует простой алгоритм распознавания текста.
ЛИСТИНГ 3.21. Декодирование римской записи числа
var n,state: integer; symbol: char; ok: boolean;
begin
   state:=1; ok:=true; n:=0;
    while not eoln do
      begin
        read(symbol);
        if((symbol='X')or(symbol='V')or(symbol='I'))
        then
          case state of
            1: case symbol of
              'X': begin n:=10; state:=2 end;
              'V: begin n:=5; state:=3 end;
              'I': begin n:=1; state:=6 end;
            end;
            2: case symbol of
              'X': begin n:=n+10; state:=2 end;
              'V: begin n:=n+5; state:=3 end;
              'I': begin n:=n+1; state:=6 end;
            end;
            3: case symbol of
              'X','Y': ok:=false;
              'I': begin n:=n+1; state:=4 end;
            end;
            4: case symbol of
              'X','Y': ok:=false;
              'I': begin n:=n+1; state:=5 end;
            end;
            5: case symbol of
              'X','Y': ok:=false;
              'I': begin n:=n+1; state:=7 end;
            end;
            6: case symbol of
              'X': begin n:=n+8; state:=7 end;
              'V: begin n:=n+3; state:=7 end;
              'I': begin n:=n+1; state:=5 end;
            end;
            7: case symbol of
              ok:=false;
            end
          else
            begin
              if ok
                then writeln(n:2)
                else writeln('Чмсло введено с ошибкой');
              state:=1;ok:=true;
            end; { else }
          end; { while not }
end.
 предыдущая
        меню
       вверх
        следующая