Циклы: While

Аналогом команды цикла For, но с более широкими возможностями в Паскале используется команда While (Пока) Базовая структура команды While

параметр_флаг:=начальное значение
While (условие истинно=true) do
begin
Действия; изменение параметра_флага условия;
end; 

Важные отличия команды While от For
1. Цикл выполняется пока условие истинно=true. (Может выполняться бесконечно, пока пользователь не остановит)
2. Счетчик цикла может быть не только +1 или -1, а произвольным числом, например +0.5, или -1.2
3. Если не менять параметр условия, программа зациклится, то есть будет работать, пока пользователь сам её не остановит. (Как пример — работа операционной системы. Пока не выключил — работает);
Команда For

For i:=1 to 10 do

While

I:=1;
While i<=10 do
begin
i:=i+1
end;

Рассмотрим несколько примеров:

Команда For
Вывести на экран числа от 1 до 10

var i:integer;
BEGIN
For i:=1 to 10 do
write(i:3);
Write('Press Enter to Exit...');
readln;
END.

тоже самое но с While

var i:integer;
BEGIN
i:=1; //начальное значение
While i<=10 do // условие выхода
begin
write(i:3);
i:=i+1; //изменение параметра выхода
end;
Write('Press Enter to Exit...');
readln;
END.

Казалось бы зачем писать больше и придумывать «велосипед», но….
Усложним задачу. Вывести числа на экран с шагом 0.5
1.0, 1.5, 2.0, 2.5 ,… 10.0
Вот тут для команды For нужно что то придумывать, ибо она работает с шагом +1 или -1. A вот While решает эту задачу без всяких проблем
For

var i:integer;
BEGIN
For i:=2 to 20 do
write(i/2:3:2,' ');
Write('Press Enter to Exit...');
readln;
END.

Команда While

var i:real;
BEGIN
i:=1; //начальное значение
While i<=10 do
begin
write(i:3:2,' ');
i:=i+0.5; //изменение параметра выхода шаг 0.5
end;
Write('Press Enter to Exit...');
readln;
END.

Обращаю внимание на объявление переменной i.
В For — переменная счетчик может быть только целого (integer) типа.
В While — она может быть целого(integer), действительного (real) и логического (boolean) типов.
Переменную, которая имеет тип boolean назовем Флагом.
Эта переменная может получать значения True или False
Рассмотрим решение задачи с выводом чисел 1.0, 1.5, 2.0, 2.5 ,… 10.0 с шагом  0.5 3-мя способами


  1. 1 способ

    var i:integer;
    BEGIN
    For i:=2 to 20 do
    write(i/2:3:2,' ');
    Write('Press Enter to Exit...');
    readln;
    END.
    

  2. 2 способ

    var i:real;
    BEGIN
    i:=1; //начальное значение
    While i<=10 do //пока счетчик меньше 10 работаем
    begin
    write(i:3:2,' ');
    i:=i+0.5; //изменение параметра выхода шаг 0.5
    end;
    Write('Press Enter to Exit...');
    readln;
    END.
    

  3. 3 способ

    var i:real;
    f:boolean;
    BEGIN
    i:=1; //начальное значение счетчика
    f:=true;//значение флага - Истина
    While f=true do //пока флаг Истина работаем
    begin
    write(i:3:2,' ');
    i:=i+0.5; //изменение параметра выхода шаг 0.5
    if i=10 then f:=false;//условие выхода из цикла. Флаг - Ложь
    end;
    Write('Press Enter to Exit...');
    readln;
    END.
    


Второе и ВАЖНОЕ преимущество команды While перед For это выполнение некого набора команд заранее неизвестное количество раз (но с условием окончания цикла).
Жизненный пример: мы идем на автобусную остановку и ожидаем автобус. Не всегда автобус приходит вовремя, по этому мы ждем ПОКА автобус не придет.
Готовим чай: ПОКА вода не закипит.
Мы не знаем точных рамок процесса, но мы знаем, при выполнении какого условия он завершиться.
Классическая задача для демонстрации работы While, это поиск наибольшего общего делителя двух чисел (НОД), или алгоритм Евклида.
У нас есть два числа А и В. Нужно найти их НОД.
Евклид говорил так:от большего числа отнимаем меньшее, пока они не станут равны.
А=8 В=6
A=B — нет
А>B — 8-6=2. A=2 B=6
B>A — 6-2=4. A=2 B=4
B>A — 4-2=2. A=2 B=2
А=В да. Значит НОД(8,6)=2
Решим задачу двумя способами:
1 с переменными А и В,
2 способ — с флагом F (boolean)

  1. 1 способ

    var a,b,nod:integer;
    begin
    write('a=');readln(a);
    write('b=');readln(b);
    write('NOD (',a,' ',b,') = ');
    while (a <> 0) and (b <> 0) do
    begin
    if a>b then a:=a-b;
    if b>a then b:=b-a;
    end;
    nod:=a;
    writeln(nod);
    end.
    
  2. 2 способ

    var a,b,nod:integer;
    f:boolean;
    begin
    write('a=');readln(a);
    write('b=');readln(b);
    write('NOD (',a,' ',b,') = ');
    f:=true;
    While f=true do
    begin
    if a>b then a:=a-b;
    if b>a then b:=b-a;
    if a=b then f:=false;
    end;
    nod:=a;
    writeln(nod);
    end.
    

Возникает вопрос: в каких случаях использовать For, а когда While?
Для начинающих можна дать следуюющий ответ (команда While — рассширеный вариант For)
Если программист заранее знает точное колличество повторений (начальное значение и конечное значение счетчика, и сам счетчик измееняется с шагом +1 или -1, то можно использовать For)
Если же вы не знаете колиичества повторений, шаг счетчика не +1 или -1, тогда предпочтительней использовать While.
Вдумчивый читатель может заметить, что в примере, который выводит на экран числа от 1 до 10 с шагом 0.5 мы использовали For и все работало.
Ответ прост — в подобных случаях программист решает сам, что ему удобней использовать For или While.
Можно сказать что в программе можно вообще обойтись одним универсальным While. НО с точки зрения понятности и читаемости программного кода в одних случаях предпочтительнее For в других While.
При решении базовых задач с использованием цикла While нужно запомнить следующее:
1. Переменной параметру-счетчику-флагу присваивается начальное значение
2. В команде While проверяем истинность условия (Пока условие истинно = true — работаем, если условие не сработало = false тогда выходим из цикла)
3. В теле цикла обязательно меняем параметр-счетчик-флаг, что бы когда нибудь наступил момент, что условие в команде While не сработает (станет ложным=false).
4. Переходим к п. 2.
Если все таки пропустили что то и программа зациклилась, то в зависимости от среды написания программы — чаще всего помогает нажатие Ctrl + Break(Pause)

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

0 0 vote
Article Rating
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments