61. Анализ работы программ, содержащих циклы с заданным условием окончания работы
61. Анализ работы программ, содержащих циклы с заданным условием окончания работы
Цикл с заданным условием продолжения работы (цикл –ПОКА) программируется в языке Паскаль с помощью оператора while.
Общий вид оператора:
Вайл (условие) ду (оператор)
<условие> - логическое выражение; пока оно истинно, выполняется тело цикла;
<оператор> - простой или составной оператор, с помощью которого записано тело цикла.
Пример
Требуется вычислить наибольший общий делитель двух натуральных чисел А и В.
Для решения воспользуемся алгоритмом Евклида: будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, пока оба числа не станут равны.
program P_1;
var a, b: integer;
begin
write ('введите два натуральных числа');
readln (a, b);
while a<>b do {Пока а не равно b}
if a>b then a:=a-b {Если а больше бэ, тогда а присвоить значение разности а минус бэ}
else b:=b-a; {Иначе бэ присвоить значение разности бэ минус а}
writeln ('НОД=',a);
readln
end.
Проверим.
Мы ввели числа 12 и 15
12 равно 15? Нет, тогда проверяем условие а больше бэ? Нет, значит присваиваем переменной бэ разность чисел 15 и 12, т.е число 3.
Возвращаемся к циклу 12 равно 3? Нет, тогда проверяем условие а больше бэ? Да, тогда присваиваем переменной а значение разности 12 и 3, равное 9.
Возвращаемся к циклу 9 равно 3? Нет, тогда проверяем условие 9 больше 3? Да, тогда присваиваем переменной а, разность 9 и 3, т.е. 6.
Возвращаемся к циклу 6 равно 3? Нет, тогда проверяем условие 6 больше 3. Да, тогда присваиваем переменной а значение разности 6-3, равное 3.
Возвращаемся к циклу 3= 3? Да, выводим на печать а. Цикл завершился.
Программирование циклов с заданным условием окончания работы.
Цикл –ДО программируется в языке Паскаль с помощью оператора repeat.
Общий вид оператора:
репит (оператор1; оператор2; …;) антил (условие)
< оператор1; оператор2;…; > - операторы, образующие тело цикла;
< условие > - логическое выражение; если оно ложно, то выполняется тело цикла.
Пример
Напишем программу, которая будет считывать строку от пользователя до тех пор, пока в строке не встретится точка или количество символом в строке не превысит 20.
program P_2;
var c:char; i:integer; str:string;
begin
i:=0; str:='';
writeln ('Введите текст');
repeat
inc(i);
read(c);
str:=str+c;
until (c = '.') or (i>20);
writeln(str);
end.
Проверим.
Мы ввели строчку: «Служить бы рад, прислуживаться – тошно.
Программа, не встретив точки, оставила только первые 20 символов.
Программа циклов с заданным числом повторений.
Цикл – ДЛЯ программируется на языке Паскаль с помощью оператора for.
Общий вид оператора:
фор (параметр):= (начальное_значение) ту (конечное_значение) ду (оператор)
<параметр> - переменная целого типа;
<начальное_значение> и < конечное_значение > - выражение того же типа, что и параметр, вычисляемые перед началом цикла;
<оператор> - простой или составной оператор – тело цикла.
При выполнении этого оператора после каждого выполнения тела цикла происходит увеличение на единицу параметра цикла; условием выхода из цикла является превышение параметром конечного значения.
Пример
Напишем программу вычисления степени с натуральным показателем n для любого вещественного числа а.
program P_3;
var i, n:integer; a, y: real;
begin
writeln ('Возведение в степень');
write (‘Введите основание а ‘);
readln (a);
write (‘Введите показатель n ’);
readln (n);
y:=1;
for i:=1 to n do y:=y*a;
writeln(‘y= ‘, y)
end.
Проверим.
Возведем число 5 в степень 3. Программа показывает, что это число 125. Проверим. 5*5*5= 125. Все верно.
Цикл с постусловием
Продолжим знакомство с операторами цикла, имеющимися в Паскале. Повторение группы операторов (тела цикла) можно организовать и с помощью оператора, где проверка условия осуществляется после выполнения тела цикла.
1.Оператор цикла REPEAT (цикл ДО).
Формат оператора:
REPEAT оператор; оператор;...оператор UNTIL логическое условие;
Часть программы, заключенная между служебными словами REPEAT и UNTIL, повторяется до тех пор, пока не станет истинным логическое выражение, стоящее после слова UNTIL. Между словами REPEAT (повторить) и UNTIL(до тех пор, пока) можно записать любое количество операторов без использования операторных скобок.
В отличие от оператора WHILE вычисление логического выражения происходит не до, а после очередного повторения цикла. Из-за этого цикл REPEAT обязательно выполнится хотя бы раз, а цикл WHILE может не выполнится ни разу. Если условие в цикле ПОКА является условием продолжения повторений, то условие в цикле ДО - условием выхода из цикла, его завершения. Поэтому для одной и той же задачи эти условия противоположны.
Пример 1. Составить программу подсчета суммы S первых 1000 членов гармонического ряда 1+1/2+1/3+1/4+...1/N используя оператор цикла REPEAT.
Program Summa;
Var S:real;
N:integer;
Begin
S:=0;N:=0;
repeat
N:=n+1;
S:=s+1/n
Until n>1000;
Writeln(s);
Readln
End.
2.Поиск наибольшего числа.
Предположим, нам необходимо ввести с клавиатуры N чисел, найти из них наибольшее и вывести его. Для решения этой задачи предлагается следующий алгоритм:
1. Ввести первое число в переменную Max.
2. Ввести следующее число в переменную Next.
3. Если Next>Max, то Max:=Next.
Пункты 2 и 3 повторять, пока не будут введены все числа.
4. Вывести значение переменной Max.
Действительно ли будет напечатано наибольшее из N чисел? Докажем это.
После выполнения первого пункта в переменной Max находится наибольшее из уже введенных чисел. Это справедливо, т.к. введено лишь одно число.
Повторение пунктов 2 и 3, в сущности, представляет собой цикл, который выполняется, пока не будут введены все числа. Если перед очередным повторением цикла в Max находится наибольшее из введенных чисел, то после выполнения пунктов 2 и 3 там снова будет наибольшее из введенных чисел.
В последнем пункте значение Max будет выведено.
Этот пример показывает, что алгоритм можно доказать, как доказывают математическую теорему. Программируя доказательный алгоритм, можно не опасаться ошибок в алгоритме, конечно, если нет ошибок в доказательстве.
Program maximum;
Var N, max, next, k: integer;
Begin
Write('Введите количество чисел'); Readln(n);
Write('Введите число'); Readln(max);
k:=1;
repeat
Write('Введите число'); Readln(next);
K:=k+1;
If next>max then max:=next
Until k=n;
Writeln(max);
Readln
End.
Тренировочные задания.
1. Введите с клавиатуры 6 чисел и определите их среднее арифметическое.
2. Напишите программу, которая вводит целые числа с клавиатуры и складывает их, пока не будет введено число 0.
3. Напечатайте 20 первых степеней числа 2.
4. Найдите минимальное из N чисел.
5. Дано натуральное число. Выяснить, является ли оно простым, т.е. делится только на 1 и на само себя.
Домашнее задание
Выучить §3.5.2. Программирование циклов с заданным условием окончания работы
Выполнить №6, № 7 к §3.5.2. № 193-194