Как мы уже говорили, в паскале существуют 3 способа организации цикла (типа):
2) Цикл с постусловием
3) Цикл с предусловием
WHILE условие DO действие; // тело цикла
Тело цикла выполняется пока условие ИСТИННО.
Если в теле цикла действий несколько — используются операторные скобки begin … end;
WHILE условие do begin действие_1; действие_2; действие_3; ... end;
Рассмотрим пример, аналогичный рассмотренному в теме «Цикл со счетчиком», но реализуем его с помощью цикла WHILE.
Требуется на экране вывести:
Привет
Привет
Привет
Привет
Для реализации данного примера с помощью цикла с предусловием нам потребуется переменная n:
WHILE n<4 do writeln('Привет');
Данный цикл будет выполнять команду writeln(‘Привет’) бесконечное число раз. Почему? Потому что переменная n не изменяется и всегда будет меньше 4. Поэтому необходимо в цикле добавить код, изменяющий переменную n. Например: n:=n+1.
WHILE n<4 do
begin
writeln('Привет');
n:=n+1;
end;
Теперь переменная n будет изменяться с каждым выполнением команд тела цикла (с каждой итерацией).
Нужно запомнить: чтобы не произошло зацикливание в цикле WHILE — необходимо проследить за тем, чтобы переменная из условия изменялась в теле цикла. В цикле со счетчиком такого не случится (зацикливание), т.к. мы указываем точное число итераций.
Рассмотрим несколько задач, где число повторений в цикле явно не известно.
Задача 1.
Считать сумму введенных с клавиатуры чисел до тех пор, пока не будет введен ноль.
Решение.
Решение данной задачи основывается на использовании цикла WHILE, т.к. мы не знаем, когда будет введен ноль и мы перестанем вводить числа.
var a,s:integer; begin s:=0; writeln('Введите число'); readln(a); while(a<>0) do begin s:=s+a; //подсчет суммы S writeln('Введите число'); readln(a); end; writeln(s); end.
Зачем два раза используем ввод числа а (readln(a);)? Первый раз вводим число а для того, чтобы войти в цикл с некоторым значением переменной a, которое будет использоваться в условии цикла WHILE. Второй раз команда readln(a) используется внутри цикла — вводим числа до тех пор, пока не введем ноль.
Задача 2.
Даны два отрезка А и B (A>B). Не используя операции умножения и деления, определить, сколько отрезков В уместится в отрезке А.
Решение.
Рассмотрим изображение:
Т.е. из рисунка видно, что нам нужно складывать длины отрезка A до тех пор, пока сумма не станет больше длины отрезка В. В этом нам поможет цикл с предусловием — цикл while.
var a,b,s,k:integer; begin writeln('Введите длину отрезка А'); readln(a); writeln('Введите длину отрезка B'); readln(b); k:=0; S:=a; while s<b do begin k:=k+1; //переменная k считает количество выполнения тела цикла s:=s+a; //суммирует длину отрезка А end; writeln('В отрезке В содержится ',k,' отрезков А'); end.
Рассмотрим работу программы на примере: А=5, В=21. Рассуждения запишем в таблицу:
Задача 3.
Используя алгоритм Евклида, найти НОД двух чисел.
Решение.
Рассмотрим блок-схему алгоритма Евклида:
Запишем данной алгоритм с помощью Паскаля, опираясь на данную блок-схему. Как видим, у нас имеется цикл с предусловием (M>N). Внутри цикла еще одно условие (M>N), т.е. оператор IF… THEN.
var M, N: integer; begin writeln('Введите М и N'); readln(M, N); while M<>N do begin if M>N then M:=M-N else N:=N-M end; write('Н0Д = ',М) end.
Аналогично задаче 2 можно проверить данный алгоритм, записав рассуждения в таблицу.