Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Попов_1.doc
Скачиваний:
6
Добавлен:
25.04.2019
Размер:
668.16 Кб
Скачать

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

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

ИТЕРАЦИОННЫЕ ЦИКЛЫ. В случае, если количество циклов, необходимых для решения задачи, заранее неизвестно, такие циклы называются итерационными. Рассмотрим ряд примеров.

Задача 3. Пусть для некоторого множества чисел Х нужно вычислить и отпечатать функцию 2/Х. Ввод и вычисления следует прекратить после обнаружения первого Х, равного нулю (деление на ноль невозможно).

Программа к задаче 3

3 INPUT x

IF x=0 GOTO 9

y=2/x

PRINT x y

GO TO 3

9 END

ввод X

Очевидна следующая блок-схема (рис. 2.4.1). Блоков ввода, вычисления, печати и анализа столько, сколько чисел в последовательности до первого нуля. Чисел может быть очень много и подобный подход, конечно, неприемлем, не говоря уже о том, что и количество их заранее неизвестно. Такие программы строятся по-иному. Обрабатывающая часть программы записывается только раз, но охватывается петлей возврата (рис. 2.4.2). Тогда одни и те же операторы будут выполняться многократно до тех пор, пока Х0.

Задача 4. Пусть для аргумента Х, находящегося в диапазоне от 3 до 9, требуется вычислить и напечатать значение функции Y=(X–6)2, где Х изменяется с шагом 2 (рис. 2.4.3). Блок-схема алгоритма изображена на рис. 2.4.4.

Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется и указывается значение соответствующей переменной. Выкладки по проверке выполняются сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами. Видим, что заданная последовательность изменения Х (3, 5, 7, ...) наблюдается и последнее значение Y вычисляется для Х=9. При следующем приращении Х оно становится равным 11 и пятый цикл не выполняется, поскольку при Х>9 программа завершается.

Здесь следует отметить, что нет никакого технически простого способа предварительной проверки правильности написанных программ. Для этой цели программисту приходится вручную по тексту программы рассчитывать значения всех переменных и сличать их с желаемыми (известными из условия). Конечно, проверка выполняется не для всей задачи, а только для небольшого числа (например, трех) начальных циклов и при этом тщательно анализируется значение условия выхода из цикла (оператор IF).

 Контрольная задача. Пусть дана функция Y=10–2X. ЭВМ должна вычислить и напечатать значения этой функции для последовательных значений Х: 0, 0.5, 1, 1.5, 2, 2.5, ... и т.д. до тех пор, пока Y не станет отрицательным.

Программа

Проверка

к задаче 4

1 цикл

2 цикл

3 цикл

4 цикл

x=3

2 IF x>9 GOTO 4

y=(x–6)^2

? x,y

x=x+2

GOTO 2

4 END

x=3

x=3<9

y=9

3,9

x=3+2=5

5<9

y=1

5,1

x=7

7<9

y=1

7,1

x=9

9=9

y=9

9,9

x=11

11>9

конец

АРИФМЕТИЧЕСКИЕ ЦИКЛЫ. Если число повторений известно заранее – такие циклы называются арифметическими.

Задача 5. Пусть в условиях предыдущей задачи 4 не известно предельное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку в данном случае не задано последнее значение Х, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов, т.е. счетчик циклов (назовем ее I). В исходном состоянии (рис. 2.4.5) берем его равным 1.

Программа

Проверка

к задаче 5

1 цикл

2 цикл

3 цикл

4 цикл

x=3: i=1

8 IF i>4 GOTO 2

y=(x–6)^2

? x y

x=x+2

i=i+1

GO TO 8

2 END

x=3, i=1

i=1<4

y=9

3, 9

x=5

i=2

2<4

y=1

5, 1

x=7

3

3<4

y=1

7, 1

x=9

4

4=4

y=9

9, 9

x=11

5

5>4

конец

После выполнения очередного цикла счетчик получает приращение, увеличиваясь на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекращается. Ниже приведена программа и выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее. Исходное значение счетчика циклов и его приращения могут выглядеть по-разному. Главное, чтобы было выполнено заданное число циклов. В нашем примере был использован счетчик на возрастание I=1,2,3, ... до N (N – число шагов). Можно начинать счетчик с нуля: I=0,1,2, ... до N-1. Возможен счетчик на убывание: I=N–1, ... 3,2,1 до 0 и т.д. Обычно, если нет оснований для другого, используется счетчик на возрастание с шагом единица от 1 до N.

ЗАДАЧИ НА НАКОПЛЕНИЕ. В практике очень распространены задачи на накопление, т.е. на нахождение сумм и произведений последовательности переменных. Такие задачи могут встречаться как в формулировке итерационных, так и арифметических циклов.

Задача 6. Пусть требуется найти сумму N произвольных чисел Х. Блок-схема алгоритма приведена на рис. 2.4.6, а программа ниже. Здесь сумма накапливается в переменной S с помощью оператора S=S+X. Начальное значение суммы берется равным нулю (S=0).

Программа

Проверка для N=3 X=2,4,3

к задаче 6

1 цикл

2 цикл

3 цикл

INPUT “N=”,n

i=1: s=0

3 IF i>n GOTO 8

INPUT “X=”,x

s=s+x

i=i+1

GOTO 3

8 PRINT s

n=3

i=1, s=0

1<3

x=2

s=2

i=2

2<3

4

6

3

3=3

3

9

4

4>3

s=9

ЧИСЛОВЫЕ РЯДЫ. Типичной циклической задачей на накопление является вычисление числовых рядов.

Задача 7. Пусть требуется найти сумму S для N членов геометрической прогрессии вида

A1 A2 A3 A4 N

S = 3 + 6 + 12 + 24 + ... + = АI

1

S1 S2 S3 S4

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

S I = SI–1 + AI, где S0 = 0

AI = 2AI–1 A1 = 3

Или, как принято в программировании

S =0, S=S+A

A=3, A=2A

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

Программа

Проверка

для N=3

к задаче 7

1 цикл

2 цикл

3 цикл

4 цикл

INPUT n

n=3

a=3: i=1: s=0

a=3, i=1,s=0

3 IF i>n GOTO 9

i=1<3

2<3

3=3

4>3

s=s+a

s=0+3=3

3+6=9

9+12=21

a=2*a

a=2*3=6

12

24

i=i+1

i=1+1=2

3

4

GOTO 3

9 ? s

s=21

 Контрольная задача. Составить программу вычисления и выдачи на печать суммы N элементов числового ряда.

Вариант

Вариант

0

y=1+4+7+10+13+...

5

y=–56–54–52–50–48–...

1

y=2+4+8+16+32+...

6

y=18+20+22+24+26+...

2

y=60+53+46+39+32+...

7

y=85+80+75+70+65+...

3

y=–4–8–16–32–64–...

8

y=–42–40–38–36–34–...

4

y=2+6+18+54+162+...

9

y=–20–15–10–5–0+5+...

ОПЕРАТОР АРИФМЕТИЧЕСКОГО ЦИКЛА

П ринципы построения программ с арифметическими циклами можно проиллюстрировать обобщенной блок-схемой на рисунке 2.4.7.

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

Структура вида:

FOR

изменяемая

переменная

=

начальное

значение

TO

конечное

значение

STEP шаг

операторы

NEXT

последовательно выполняет операторы, находящиеся между оператором FOR до оператора NEXT столько раз, сколько нужно для того, чтобы изменяемая переменная от начального значения достигла конечного значения с установленным шагом.

Например:

FOR a = 3 TO 7.5 STEP 0.8

операторы

NEXT a

Здесь группа операторов от оператора FOR до оператора NEXT будет повторяться столько раз, сколько нужно, чтобы переменная А, изменяясь с шагом 0.8 от значения равного 3, достигла 7.5. Таким образом: A=3; 3.8; 4.6; 5.4; 6.2; 7, т.е. цикл будет выполнен 6 раз.

В качестве параметров оператора цикла разрешены выражения. Например: FOR c=b+2 TO k STEP x–2. Если шаг изменения переменной цикла 1, разрешается его не указывать. Так, операторы

FOR i=4 TO k STEP 1 и FOR i=4 TO k

полностью эквивалентны. Дословно такой оператор интерпретируется следующим образом: “Выполнять операторы цикла от оператора FOR до оператора NEXT столько раз, сколько нужно, чтобы переменная I, изменяясь с шагом 1, достигла значения k.” Цикл завершается в момент, когда переменная цикла становится больше предельного значения цикла (k).

Допускается отрицательный шаг и превышение начального значения цикла над конечным, например

FOR i=20 TO 10 STEP -3

Здесь переменная I последовательно получит значения: 20, 17, 14, 11.

После слова NEXT обычно, но необязательно, указывается имя изменяемой переменной цикла (переменной, следующей непосредственно после слова FOR), что позволяет легко контролировать правильное закрытие циклов. Для простых циклов имя переменной можно не указывать.

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

На блок-схемах оператор FOR отображается в виде фигуры “прямоу­гольник в ромбе”, которая имеет два выхода. Выход ДА соответствует случаю, когда переменная цикла меньше или равна своему предельному значению – цикл продолжает выполняться. Выход НЕТ – случаю превышения переменной этой границы – цикл завершается. Иногда можно воспользоваться упрощенным обозначением цикла FOR, когда он включается в виде заголовка в прямоугольник, содержащий операторы цикла. К такой форме возможно прибегать, если тело цикла не содержит разветвлений или собственных циклов.

Решим задачу 7 с применением оператора FOR. Здесь необходимо просум­мировать в переменную S все числа Х из множества N чисел. Блок-схема приведена на рис. 2.4.8 в обоих возможных вариантах. Как видим, второй гораздо более компактен, однако, как уже говорилось, он возможен не всегда.

Программа

Проверка для N=3

к задаче 7

1 цикл

2 цикл

3 цикл

INPUT n

a=3: s=0

FOR i=1 TO n

s=s+a

a=2*a

NEXT

PRINT s

n=3

a=3, s=0

i=1<3

s=0+3=3

a=2*3=6

2<3

9

12

3=3

21

24

4>3

s=21

Если необходимо выйти из цикла FOR до его естественного завершения (до выполнения всех циклов), можно применить оператор GOTO, но удобнее воспользоваться специальным оператором выхода вида

EXIT FOR

который передает управление на оператор, следующий непосредственно за оператором NEXT.

Если нужно, не выполняя до конца текущего цикла, начать следующий, следует перейти оператором GOTO непосредственно на оператор NEXT. В задаче 8, например, это оператор IF x<0 THEN s=s+x: GOTO 9

Тест. 2.4.1. Чему будет равно h после завершения программы? 1). 5.8, 2). 6, 3).6.1.

h=0: k=2: m=7

for i=k*2 to m-1 step 0.5

h=h+1

next

Проверка для N=5

Программа к задаче 8

1

цикл

2

цикл

3

цикл

4

цикл

5

цикл

INPUT n

kp=0: s=0: p=1

FOR i=1 TO n

INPUT x

IF x=0 GOTO 7

IF x<0 THEN s=s+x: GOTO 9

kp=kp+1

p=p*x

9 NEXT

?“Нулей нет”

7 ? s p kp

n=4

i=1<5

x=3

x≠0

x>0

kp=1

p=3

2<5

x=-2

x≠0

x<0, s=-2

3<5

x=1

x≠0

x>0

kp=2

p=3

4<5

x=-3

x≠0

x<0, s=-5

5=5

x=2

x≠0

x>0

kp=3

нулей нет

p=6

6>5

-5,6,3

Задача 8. Для N произвольных чисел Х вычислить и отпечатать: сумму отрицательных чисел S, количество положительных чисел КР, произведение положительных чисел Р. Все вычисления производить до появления первого нуля в последовательности. Если нуль не встретился, кроме S, KP и Р напечатать сообщение НУЛЕЙ НЕТ. Блок-схема алгоритма приведена на рис. 2.4.9. В программе сделана проверка для N=5 и Х=3,–2,1,–3,2. В результате получено S=–5, P=6, KP=3.

Контрольная задача. Имеется N произвольных чисел Х. Составить программу вычисления и напечатать сумму всех положительных чисел S, число отрицательных чисел К и произведение всех чисел, не равных нулю P. Сделать проверочные выкладки для N=5 (аналогичные выполненным выше). В качестве значений Х использовать последовательные цифры натурального ряда с изменяющимися знаками (Х=0, –1, 2, –3, 4, –5).

Задача 9. Для чисел Х и Y найти наибольший общий делитель. Нахождение НОД будем выполнять путем последовательного перебора сверху вниз всех натуральных чисел от максимального из X и Y до 1. Наименьшим делителем считаем первое значение i, которое делит оба числа без остатка.