3.9.2. Оператор WHILE

Оператор повтора 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.

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

Hosted by uCoz