Второй вид циклов, используемых в Pascal - это цикл с предусловием.
Форма записи:
While условие do оператор;
Пока условие истинно, выполняется оператор (или несколько), как только условие станет ложным, произойдет выход из цикла.
Условие проверяется в начале, перед циклом поэтому, если условие сразу же ложно, то цикл не повторяется ни разу.
После do ставить точку с запятой нельзя!
Если в теле цикла несколько операторов, то необходимо их заключить в операторные скобки begin ... end
While условие do begin
оператор 1;
оператор 2;
...
end;
Переменные, участвующие в записи условия, должны изменяться в теле цикла, иначе может произойти зацикливание!
Задание 1. Какое значение примет переменная x в результате выполнения следующих фрагментов программ?
1) x:=1;
while x<10 do
x:=x+3;
x:=x+1;
В теле цикла только один оператор, так как нет скобок begin end. Построим трассировочную таблицу.
Ответ: x=11
2) x:=1;
while x<10 do begin
x:=x+3;
x:=x+1;
end;
В теле цикла только два оператора, так как есть скобки begin end. Построим трассировочную таблицу.
Ответ: x=13
3) x:=1;
while x<>1 do begin
x:=x+3;
x:=x+1;
end;
Построим трассировочную таблицу.
x
1
Условие
1<>1 ложь
Ответ: x=1. Цикл не повторится ни разу, так как условие сразу ложно.
4) x:=50;
while x<100 do
begin
x:=x-10;
end;
Построим трассировочную таблицу.
Ответ: Программа зациклится, так как условие никогда не станет ложно.
Задание 2. Составить программу, вычисляющую сумму натурального ряда чисел от 1 до 100
S = 1+2+3+4+…+100
i 1 2 3 4 100
1 способ: с помощью цикла for
s:=0;
for i:=1 to 100 do s:=s+i;
Параметр i увеличивается автоматически на 1 с каждым шагом.
2 способ: с помощью цикла while
Параметр i необходимо увеличивать на 1 в теле цикла. Также необходимо задать начальное значение параметра
i:=1;
S:=0;
while i<=100 do begin
S:=S+i;
i:=i+1;
end;
Сколько раз выполнится цикл? Для чего необходимо S:=0; i:=1? Что будет, если забудем begin end?
Задание 3. Составить программу для решения следующей задачи: Ввести целое число n с клавиатуры. Подсчитать сумму всех целых чисел от 1 до n с шагом 3.
S = 1+4+7+10+…+n
i = 1 4 7 10
read(n)
i:=1;
S:=0;
while i<=n do begin
S:=S+i;
i:=i+3;
end;
writeln(‘S= ’, S);
Задание 4. Составить программу для решения следующей задачи: Найти наибольший общий делитель NOD по алгоритму Евклида.
Например, NOD(20, 25)= NOD(20, 5)= NOD(15, 5)= NOD(10, 5)= NOD(5, 5)
while m<>n do if m>n then m:=m-n
else n:=n-m;
writeln(‘NOD=’,m)
Задание 5. Составить программу для решения следующей задачи: В первый день пловец проплыл 3 км. В каждый последующий день он проплывал на 10% больше, чем предыдущий.
В какой по счету день пловец начнет проплывать более 5 км?
К какому дню он суммарно проплывет более 30 км?
var n,s:real;
d:integer;
begin
{найдем в какой день пловец начнет проплывать более 5 км}
n:=3; {количество км.}
d:=1; {количество дней}
while n<=5 do
begin
n:=n+0.1*n;
d:=d+1;
end;
writeln('дней - ', d);
{найдем к какому дню он суммарно проплывет более 30 км?}
n:=3; s:=3;d:=1;
while s<=30 do
begin
n:=n+0.1*n;
s:=s+n;
d:=d+1;
end;
writeln('дней - ',d);
end.