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