Паскаль. Оператор цикла While

Паскаль. Оператор цикла While

Синтаксис оператора while:

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

Слово while читается «вайл», слово do – «ду», вся конструкция переводится так - Пока условие истинно, делай оператор. Например, while a>b do b:=b+1.

Работает оператор while так:

Сначала компьютер проверяет истинность условия, стоящего после слова while. Если условие истинно, то выполняется оператор, стоящий после do. Затем снова проверяется истинность условия и в случае истинности снова выполняется этот оператор. И т.д. Если условие ложно, то оператор while прекращает свою работу и компьютер переходит к выполнению следующего оператора.

Оператор, стоящий после while, вполне может быть составным, поэтому тело цикла у оператора while, так же как и у оператора repeat, может состоять из многих операторов.

Решим при помощи while ту же задачу о печати чисел 3 5 7 9, что в предыдущей статье решили с помощью repeat. Для того, чтобы точно определить работу оператора while, приведем программу ее решения параллельно с третьим вариантом программы из статьи «Паскаль. Оператор перехода GOTO»:

3 ВариантВариант с While
Label m1,m2,m3;
Var f: Integer;
Begin
         Write('Начало счета ');
         f:=3;
m1: if f<=9 then goto m3
                             else goto m2;
m3: Write(f,' ');
         f:=f+2;
         goto m1;
m2: Write(' Конец счета')
End.

Var f: Integer;
Begin
    Write('Начало счета ');
    f:=3;
    while f<=9 do
        begin
        Write(f,' ');
        f:=f+2;
        end;
    Write(' Конец счета')
End.

Как видите, здесь после do стоит составной оператор begin Write(f,' '); f:=f+2; end. Последовательность исполнения операторов и проверки условий в обеих программах совершенно аналогичны.

Типичная ошибка начинающих - небрежное обращение со знаками сравнения. Многие не видят большой разницы в том, как записать - while f<=9 или while f<9 , а затем, «недополучив» результат, удивляются, почему. И здесь лучшим средством для понимания является отладочный режим. Попробуйте ошибочный вариант последней программы (с while f<9) выполнить в пошаговом режиме с использованием окон «Локальные переменные» и «Просмотр выражений». Для этого введите в окно «Просмотр выражений» выражение f<9 (оно может иметь только два значения: true - истина и false - ложь, другими словами - «условие выполнено» и «условие не выполнено»).

Отличие операторов Repeat и While
  • Компьютер выходит из цикла оператора repeat тогда, когда условие истинно, а из цикла оператора while - когда условие ложно.
  • while может ни разу не выполнить оператор, стоящий после do. repeat же хотя бы раз операторы, стоящие между repeat и until, выполнит.
    Так, фрагмент: k:=8; repeat k:=1 until 3>2; WriteLn(k)  напечатает 1.
    А фрагмент: k:=8; while 2>3 do k:=1; WriteLn(k) напечатает 8.
  • При компиляции оператор while дает несколько более эффективную программу, чем оператор repeat.

Оператор while является универсальным. Им можно заменить любой циклический оператор. Имейте это ввиду.

Сумма и произведение заданных чисел

Задача:

Найдите сумму всех введённых чисел с клавиатуры.

Эта задача является типовой в программировании, чтобы с ней справиться нужно знать следующее:

  1. Если в задании не указано сколько чисел вводить, то принято осуществлять ввод до оговоренного числа (символа, строки).
    Вопрос из зала: Кто решает какой символ выбрать?
    Ответ: Программист.
    В данном случае воспользуемся нулём.
  2. Сумму мы будем складывать в переменную, например sum. Введённые числа будут по очереди помещаться в переменную, например chislo. Также как и со счётчиком, в переменную sum присвоим начальное значение – 0, а в цикле к ней будем прибавлять новые введённые числа sum:=sum+chislo.

Текст программы:

Var sum,chislo: Integer;
Begin
  WriteLn('Чтобы посмотреть результат введите 0');
  chislo:=1; { Иначе в цикл не попадём } 
  sum:=0; { Начальное значение суммы }
  while chislo<>0 do { Пока не ввели 0 выполняем цикл }
    begin
    Write('Введите число: ');
    ReadLn(chislo);
    sum:=sum+chislo; { Подсчёт суммы }
    end;
  Write('Сумма чисел: ',sum)
End.

Усложним нашу задачу. Теперь будем считать ещё и произведение. Произведение вычисляется как сумма, отличие только в арифметическом знаке – p:=p*chislo; Начальное значение равное нулю теперь не подойдёт, т.к. любое число умноженное на ноль равно нулю.
Вопрос из зала: На что нужно умножить заданное число, чтобы оно осталось тем же.
Ответ: На единицу.

Текст программы, которая считает сумму и произведение:

Var sum,p,chislo: Integer;
Begin
  WriteLn('Чтобы посмотреть результат введите 0');
  chislo:=1; { Иначе в цикл не попадём } 
  sum:=0; p:=1; { Начальное значение суммы и произведения}
  while chislo<>0 do { Пока не ввели 0 выполняем цикл }
    begin

    Write('Введите число: ');
    ReadLn(chislo);
    sum:=sum+chislo; { Подсчёт суммы }
    if chislo<>0 then p:=p*chislo; { Подсчёт произведения }
    end;
  WriteLn('Сумма чисел: ',sum);
  WriteLn('Произведение чисел: ',p)
End.

Обратите внимание, что при вводе 0 мы всё еще находимся внутри цикла. Следовательно, 0 прибавится к сумме и добавится в произведение. Сумма останется той же, а вот общее произведение обнулится, т.к. любое число, умноженное на ноль, даёт ноль. Избежать этого нам помогает оператор if, который проверяет введенное число.

Задание 1

Вычислять с использованием while квадратные корни из чисел 900, 893, 886, 879 и т.д. до тех пор, пока это можно делать.

Задание 2

Нам необходимо ввести с клавиатуры N чисел, найти из них наибольшее и вывести его на экран. Решите задачу используя цикл while.

Задание 3

Нам необходимо ввести с клавиатуры N чисел, найти из них наименьшее и вывести его куб на экран. Решите задачу используя цикл while.

Турбо-Паскаль 7.0 - Самоучитель
Лукин С.Н.