while i<= n do {пока i<=n выполнить }
begin
sum:=sum+i; {тело цикла}
i:=i+1; {переменная I меняется внутри цикла, и ее
величина определяет очередное повторение цикла
end; или завершение его }
writeln('Sum =',sum);{вывод результата}
end.
Результат выполнения программы в случае ввода n=10:
n=10 Sum =55 |
Цикл в этой программе работает следующим образом:
· вначале i=1,n=10,sum=0;
· условие i<=10 в заголовке оператора while верно, поэтому начинается выполнение тела цикла;
· значение суммы увеличивается на 1: sum=sum+i=0+1=1;
· i увеличивается на 1, то есть i=i+1=1+1=2;
· условие i<=10 вновь верно, поэтому тело цикла выполняется очередной раз;
· значение суммы sum=sum+2=1+2=3, а переменной i=i+1=2+1=3;
· после выполнения данной последовательности действий (sum=sum+i и i=i+1) 10 раз получаем sum=0+1+2+…+10, i=11;
· условие i<=10 ложно, поэтому цикл завершается. Следующим действием будет вывод результата.
Важно помнить:
Ø Если условие сразу оказывается ложным, цикл с предусловием не выполнится ни разу!
Ø В теле цикла должны быть операторы, которые в какой-то момент изменят значение условия, сделав его ложным. Если этого не случится, цикл будет бесконечным, то есть программа «зациклится».
Ø Зациклившуюся программу следует остановить с помощью команды
Программа -> Завершить, иначе она будет выполняться бесконечно
(точнее, до выключения компьютера).
Ø В операторах for и while точка с запятой не ставится ни перед словом do, ни после него!
Решим еще несколько примеров применения оператора while.
Пример 6. Сколько слагаемых должно быть в сумме 2+4+6+8+…., чтобы эта сумма оказалась больше некоторого данного натурального числа N.
Программа решения задачи может иметь вид:
Program Kol_slag;
var i, x,sum, n:integer; {i - счетчик слагаемых, в переменную x
будут записываться слагаемые, в переменной sum будет накапливаться сумма}
begin
x:=2; {первое слагаемое равно 2}
i:=1; {начальное значение счетчика слагаемых равно 1}
sum:=2;
write ('n=');
readln(n); {ввод числа n}
while sum<=n do {пока sum<=n выполнить тело цикла}
begin
x:=x+2;{следующее слагаемое на 2 больше
предыдущего}
i:=i+1; {увеличение счетчика слагаемых на 1}
sum:=sum+x; {прибавление очередного слагаемого к сумме}
end;
writeln (i,' слагаемых');
end.
Результат выполнения программы при N=30:
n=30 6 слагаемых |
Блок-схема алгоритма программы Kol_slag представлена на рисунке 1.12.


Рис. 1.12
C помощью оператора While можно рисовать различное количество графических фигур. Например, заполнять экран кругами различным способом: вдоль верхнего края экрана, вдоль нижнего края, вдоль левого края и т. д..
Пример 6. Нарисовать ряд закрашенных в зеленый цвет кругов радиуса 20 пикселей вдоль верхнего края экрана монитора.
Программа решения задачи может иметь вид:
program krugi;
uses graphabc;
var x, y,r:integer;
begin
clearWindow(clViolet);
setBrushColor(clGreen); {устанавливает зеленый цвет кисти}
x:=22; y:=22; r:=20; {начальные значения x, y,r}
while x<660 do
begin
circle(x, y,r); {рисует очередной круг}
x:=x+40; {смещает координату x для следующего круга}
end;
end.
Результат выполнения программы:

Рис. 2.13
С помощью оператора while можно реализовать имитацию движения графических объектов.
Пример 7. Организовать имитацию движения шарика по экрану монитора.
Для того чтобы графический объект двигался по экрану, необходимо организовать повторение следующих команд:
1) Нарисовать объект;
2) Организовать временную паузу;
3) Стереть объект;
4) Изменить координаты объекта.
Программа решения задачи может иметь вид:
program dvigenie;
uses graphabc;
var x, y,r:integer;
begin
x:=22; y:=22; r:=20; {начальные координаты объекта}
while x<800 do {повторение следующих действий}
begin
setBrushColor(clGreen); {задаем цвет объекта}
circle(x, y,r); {рисуем объект}
Sleep (10); {пауза в миллисекундах}
setBrushColor(clWhite); {выбираем цвет фона}
setPenColor (clWhite); {стираем (закрашиваем объект}
circle(x, y,r); {цветом фона)}
x:=x+4; {изменяем координаты объекта}
end;
end.
Реализуйте программу dvigenie на компьютере и увидите результат ее выполнения.
Из рассмотренных выше примеров можно сделать вывод: переменным, входящим в условие заголовка цикла с предусловием должны быть присвоены определенные начальные значения до входа в цикл, а в теле цикла должны быть операторы, которые изменяют значения условия до тех пор, пока оно не станет ложным.
|
1. В каких случаях в программе используется цикл с предусловием?
2. Какой формат записи оператора while?
3. При каком условии происходит выход из цикла с предусловием?
|
1. В каких случаях цикл с предусловием может быть бесконечным?
2. Может ли цикл с предусловием не выполниться ни разу?
Если да, то при каких условиях?
Упражнения
1. Может ли завершиться выполнение цикла while, условие которого выглядит так: a*a+b*b+2>1 ?
2. Cколько звездочек будет напечатано в результате выполнения
приведенного фрагмента программы:
i:=1; readln(n);
while i<=n do
begin
write('*');
i:=i+2
end;
при а) n=5; б) n=o в) n=1 ?
3. Сколько слагаемых должно быть в сумме 1+2+3+4+…., чтобы эта сумма
оказалась а) больше 20; б) больше некоторого данного числа N.
Составьте программы и блок-схемы.
4. Составьте программы, которые рисуют ряд окружностей радиуса 10 вдоль левого края экрана.
5. Составьте программы, которые рисуют ряд квадратиков радиуса 10 вдоль верхнего края экрана.
6. Составьте программу, которая вычисляет сумму натуральных чисел на отрезке [5, 10] с помощью оператора While.
§4. Составление и реализация алгоритмов с повторением
4.1 Составление алгоритмов с повторением
Цикл (повторение) является одной из важнейших алгоритмических конструкций, использующихся в программировании. Алгоритмы, содержащие конструкцию повторения, называют алгоритмами с повторением.
Вы уже знаете, что цикл имеет свои разновидности и особенности при записи на языке программирования Pascal. Для каждой из разновидностей цикла есть свой круг задач, наиболее естественно решаемых именно с ее помощью. Составляя алгоритмы с повторениями для решения задач, следует оптимально выбирать разновидность цикла в каждом конкретном случае.
Пример 1. Составить программу для подсчета суммы вводимых с клавиатуры целых чисел до первого отрицательного.
Так как неизвестно, сколько чисел надо ввести, логично будет использовать оператор While, в заголовке которого условием выполнения тела цикла будет проверка введенного числа на положительность.
Алгоритм решения данной задачи в виде блок-схемы представлен на рисунке 1.14.


Рис. 1.14
Программа, реализующая представленный алгоритм, может иметь вид:
Program Sum_do_otr;
var
sum, a:integer; {в переменной sum накапливаем сумму,
в переменную а вводим числа}
begin
sum:=0; {обнуляем сумму}
write (’введите первое число ’);
readln (a); {вводим первое число}
while a>=0 do {проверка числа на положительность}
{если введенное число отрицательное,
происходит выход из цикла}
begin {начало тела цикла}
sum:=sum+a; {добавляем введенное число к сумме}
write ('введите следующее число ');
readln (a) {ввод очередного числа}
end;
writeln ('sum=',sum) {вывод результата}
end.
Результат выполнения программы при введенных числах 2, 3, 5, -4:
введите первое число 2 введите число 3 введите число 5 введите число -4 sum=10 |
Если первое введенное число окажется отрицательным, то тело цикла не выполниться ни разу и результат будет таков:
введите число -5 sum=0 |
Из программы Sum_do_otr видно, насколько важен порядок выполнения действий в теле цикла. Если переставить местами операторы в теле цикла, программа будет работать совершенно иначе и может привести к логическим ошибкам. Логические ошибки не мешают выполнению программы, но приводят к неверным результатам. Для того чтобы понять, правильно ли работает программа, рекомендуется выполнять вручную несколько шагов цикла с отслеживанием значений всех переменных. Такой метод отладки программы называется трассировкой. Трассировка программы вычисления произведения первых пяти натуральных чисел будет продемонстрирована ниже в таблице 2. А сейчас продолжим учиться составлять алгоритмы с повторением.
Ранее был представлен пример вычисления суммы N первых натуральных чисел. На основе этого алгоритма решим следующую задачу.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


