Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (прогр) 2008июль.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
900.61 Кб
Скачать

5. Организация циклов

В простых примерах, рассмотренных выше, вообще говоря, не требовалось привлечения программирования. Все они легко могли быть решены вручную или с помощью калькулятора. Сила ЭВМ заключается в возможности простыми средствами осуществлять многократное повторение заданных действий – циклов.

Итерационные циклы. В случае, если число циклов, необходимых для решения задачи, заранее неизвестно, такие циклы называются итерационными. Рассмотрим ряд примеров.

Пример 5-1. Пусть для некоторого множества чисел X нужно вычислить функцию 2/X. Ввод и вычисления следует прекратить после обнаружения первого X, равного нулю (днлить на 0 нельзя). Очевидна следующая блок-схема (рис. 5.1а). Блоков ввода, вычисления и анализа столько, сколько чисел в последовательности до первого нуля (показано два). Чисел может быть очень много и подобный подход, конечно, неприемлем, не говоря уже о том, что заранее неизвестно, когда встретится 0. Такие программы строятся по-иному. Обрабатывающая часть цикла записывается только раз, но охватывается петлей возврата (рис. 5.1б). Тогда одни и те же операторы будут выполняться многократно до тех пор, пока X0. Для реализации цикла здесь понадобилась метка (назовем ее буквой m).

Задание 5.1. Наберите программу P5_1. Затем улучшите ее: введите необходимые подсказки, отформатируйте вывод, сделайте очистку экрана, введите подсчет количества точек X, для которых был вычислен Y. Выдайте сообщение “X=0” по завершении программы.

Пример 5-2. Пусть для аргумента X в диапазоне 3÷9, требуется вычислить значение функции Y=(X–6)2, где X изменяется с шагом 2 (рис. 5.2а,б). Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется значение соответствующей переменной. Проверка выполняется сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами. Видим, что заданная последовательность изменения X (3,5,7,...) наблюдается и последнее Y вычисляется для X=9. При следующем приращении X оно становится равным 11 и пятый цикл не выполняется, поскольку X>9. Программа завершается. Следует отметить, что нет никакого технически простого способа проверки правильности написанных программ. Для этой цели программисту приходится вручную по тексту программы рассчитывать значения переменных и сличать их с желаемыми (известными из условия). Конечно, проверка выполняется не для всей задачи, а только для небольшого числа (например, 3-х) начальных циклов и при этом тщательно анализируется значение условия выхода из цикла (здесь оператор IF).

Задание 5.2. Вычислите функцию в обратном порядке. Подсчитайте среднее арифметическое всех X и Y (SX, SY).

Арифметические циклы. Если число повторений известно заранее – такие циклы называются арифметическими.

Пример 5-3. Пусть в условиях предыдущего примера не известно предельное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку в данном случае не задано последнее значение X, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов – счетчик циклов (назовем ее I). В исходном состоянии (рис. 5.3) берем его равным 1. После выполнения очередного цикла счетчик получает приращение на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекращается. Рядом с программой приведены выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее. Очевидно, что счетчик циклов I должен быть целого типа.

Задание 5.3. Напишите программу вычисления функции в обратном порядке. Сделайте число точек не константой (4), а переменной N, вводимой оператором read. При прогоне программы задайте N=100. Поскольку весь результат теперь не умещается на экране, организуйте паузу при выдаче каждых 20-ти строк (понадобится операция mod и readkey).

Оператор арифметического цикла. Принципы построения программ с арифметическими циклами можно проиллюстрировать обобщенной блок-схемой (рис. 5.4). Только обрабатывающая часть программы полезна. Остальные операторы являются обслуживающими, необходимыми для организации цикла. Построение цикла способами, описанными выше, неудобно, поэтому рассмотрим специальные операторы цикла, упрощающие этот процесс.

Оператор цикла for:

FOR переменная цикла := начальное значение ТО конечное значение DO оператор

реализует приращение счетчика циклов на единицу в заданных пределах и контроль его значения. Цикл завершается в момент, когда переменная цикла становится больше конечного значения цикла. Например, оператор:

FOR a = 3 TO 7 DO WRITELN(a);

дословно интерпретируется следующим образом: “Оператор WRITELN после слова DO будет повторяться столько раз, сколько нужно, чтобы переменная А, изменяясь с шагом 1 от значения равного 3, достигла 7”. Т.е.: A=3; 4; 5; 6; 7 и цикл будет выполнен 5 раз.

Если после слова DO поместить конструкцию begin...end, цикл может содержать неограниченное число операторов, например

FOR i = 1 TO n DO BEGIN WRITELN(i); READLN(x) END;

Имеется форма оператора, работающего на убывание (шаг равен –1).

FOR переменная цикла := начальное значение DOWNТО конечное значение DO оператор

В качестве параметров оператора цикла разрешены и выражения, например, FOR c=b+2 TO 4*k DO ...

Важно: все параметры в операторе FOR должны быть целого типа.

Задачи на накопление. В практике очень распространены задачи на накопление, т.е. на нахождение сумм и произведений последовательности переменных. Такие задачи могут встречаться как в формулировке итерационных, так и арифметических циклов.

Пример 5-4. Пусть требуется найти сумму N произвольных целых чисел X. В программе P5_4 сумма накапливается в переменной S с помощью оператора S=S+X. Начальное значение суммы берется равным нулю (S=0).

Задание. 5.4. Переделайте программу так, чтобы она вычисляла еще среднее арифметическое и произведение.

Числовые ряды. Типичной циклической задачей на накопление является вычисление числовых рядов.

Пример 5-5. Пусть нужно найти сумму S для N членов геометрической прогрессии:

Здесь каждый следующий член прогрессии Аi равен предыдущему Ai-1, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы:

Si = Si-1 + Ai, где Sо=0 Или, как принято в программировании: S=S+A, S=0

Ai = 2Ai-1 A1=3. A=2A, A=3

Аналогично строятся программы для циклического произведения, однако исходное значение искомого произведения берется равным единице. Если по аналогии с суммой сделать его равным нулю, то результат всегда будет также нулем, поскольку умножение на ноль дает только ноль.

Задание. 5.5. Напишите программу вычисления произведения N элементов числового ряда.

Для формирования изменяющегося знака вводим специальную переменную Z и задаем ей первоначальное значение, совпадающее со знаком первого сомножимого (–1). Далее знак будет изменяться на противоположный при каждом умножении на минус 1 (Z= –Z).

Оператор цикла является сильнейшим средством программиста. Он один заменяет несколько операторов в цикле, построенном обычным образом, а именно: оператор задания исходного значения циклической переменной (или счетчика циклов) и операторы ее приращения и анализа.

program P5_6;

label t;

проверка для n=5 (х=3, –2, 1, –3, 2)

var i,n,kp,x,s,p:integer;

begin

1

цикл

2

цикл

3

цикл

4

цикл

5

цикл

readln(n);

kp:=0; s:=0; p:=1;

for i:=1 to n do begin

readln(x);

if x=0 then goto t;

if x<0 then s:=s+x;

if x>0 then begin

kp:=kp+1;

p:=p*x end;

end;

writeln('0 нет');

t: writeln(s,p,kp);

end.

n=5

i=1<5

x=3

kp=1

p=3

2<5

x=–2

s=–2

3<5

x=1

kp=2

p=3

4<5

x=–3

s=–5

5=5

x=2

kp=3

p=6

6>5

0 нет

–5,6,3

Пример 5-6. Для N произвольных целых чисел X вычислить и отпечатать: 1) сумму отрицательных чисел S, 2) количество положительных чисел KP, 3) произведение положительных чисел P. Все вычисления производить до появления первого нуля в последовательности. Если ноль не встретился, кроме S, KP и P, печатать сообщение Нулей нет. Проверка в программе сделана для N=5 и X=3, –2, 1, –3, 2. В результате: S=–5, P=6, KP=3.

Задание 5.6. Программа имеет один дефект. Произведение положительных элементов может оказаться равным 1, как в случае, если оно действительно таким получилось, так и если положительных чисел не было совсем (ведь исходное значение произведения =1). Исправьте программу.

Задание 5.7. Имеется N произвольных чисел X. Составить программу вычисления суммы S всех положительных чисел меньших 10 и среднее арифметическое SR всех отрицательных чисел.

Задание 5.8. Напечатать цепочку чисел, каждое из которых равно сумме двух предыдущих. Самые первые два числа X и Y задаются произвольно.

Задание 5.9. Напечатать таблицу умножения, так как она изображается на обложках школьных тетрадей.

Задание 5.10. В банке хранится известное количество N срочных вкладов. О каждом вкладе известно его значение на начало года – X. Размер годовой прибыли зависит от величины вклада. Если вклад до 10000 руб. – прирост составляет 10% годовых, если до 50000 руб. – 12%, если больше – 15%. Вычислить и напечатать значение каждого вклада на конец года Y, а также сумму всех вкладов на начало SX и конец SY года. Задачу решить двумя способами – с оператором цикла и без него. Указание. Процент увеличения вклада удобно отобразить в виде коэффициента. Так при 12% годовых, значение вклада Y на конец года соответствует 1.2X.

Пример 5-7. Напечатать все числа, на которые число X делится без остатка.

program P5_7 ;