Синтаксис оператора 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;BeginWrite('Начало счета ');f:=3;m1: if f<=9 then goto m3else goto m2;m3: Write(f,' ');f:=f+2;goto m1;m2: Write(' Конец счета')End. | Var f: Integer;BeginWrite('Начало счета ');f:=3;while f<=9 dobeginWrite(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является универсальным. Им можно заменить любой циклический оператор. Имейте это ввиду.
Сумма и произведение заданных чисел
Задача:
Найдите сумму всех введённых чисел с клавиатуры.
Эта задача является типовой в программировании, чтобы с ней справиться нужно знать следующее:
- Если в задании не указано сколько чисел вводить, то принято осуществлять ввод до оговоренного числа (символа, строки).
Вопрос из зала: Кто решает какой символ выбрать?
Ответ: Программист.
В данном случае воспользуемся нулём. - Сумму мы будем складывать в переменную, например 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 - Самоучитель
Лукин С.Н.