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

3. Вывод значений X и y

4. Конец цикла x

Пример 2.3. Составить алгоритм для возведения числа x в целую степень k: z=xk.

Решение. Поскольку возведение в целую степень это последовательное умножение, то телом цикла должна быть операция z=z•x. Очевидно, что первое обращение в цикле к этой операции должно дать значение z=x. Поэтому начальное значение z=1. Получим следующий алгоритм:

1. Ввод значений x и k

2. z=1

3. Цикл i=1,k

4. z=zx

5. Конец цикла i

6. Вывод значения z

Пример 2.4. Вычислить z = k! = 1•2•3•••k

Решение. В этом примере мы так же, как и в предыдущем, видим последовательное умножение. Значения множителей составляют закономерную последовательность. Очередной множитель на единицу больше предыдущего. Поэтому мы можем в качестве множителя использовать переменную счетчика. В результате получим алгоритм:

1. Ввод значения k

2. z=1

3. Цикл i=1,k

4. z=zi

5. Конец цикла i

6. Вывод значения z

Пример 2.5. Составить алгоритм для решения следующей задачи. Ввести n чисел ai (i=1,n). Определить, сколько из них положительных, отрицательных и равных нулю.

Решение. На вопрос «сколько» должны ответить счетчики чисел по соответствующему признаку. Ввод чисел и указанный подсчет нужно поставить в цикл. Вначале значения переменных счетчиков нужно сделать равными нулю. Пусть в переменных k,l,m фиксируется соответственно количество положительных, отрицательных и нулевых чисел. Тогда имеем следующий алгоритм:

1. Ввод значения n

2. k=0, l=0, m=0

3. Цикл i=1,n

4. Ввод значения ai

5. Если ai > 0, то k=k+1

6. Если ai<0, то l=l+1

7. Если ai=0, то m=m+1

8. Конец цикла i

9. Вывод значений k,l,m

Заметим, что с введением формы «цикл i=1,n - конец цикла i» исчезла необходимость в номерах строк алгоритма (которые могли использоваться как метки для переходов).

Отметим также, что в этом алгоритме в строках 5,6 и 7 проверки условия записан не переход к другой операции (« идти к »), а сама эта операция. Если условие не выполнено, то указанная справа от него операция не выполняется. Затем выполняется следующая по порядку строка (это так называемая естественная последовательность в алгоритме). Современные алгоритмические языки построены именно таким образом. Поэтому в описании алгоритмов требуется дополнить формальное изображение условного перехода, как это показано в приведенном примере. В противном случае алгоритмы будут очень громоздкими. Например, в последнем алгоритме пришлось бы поставить каждый счетчик в отдельную строку с меткой, а после этой строки ставить строку безусловного перехода на конец цикла. В результате добавились бы лишние строки и алгоритм выглядел бы следующим образом:

1. Ввод значения n

2. k=0, l=0, m=0

3. Цикл i=1,n (цикл будет закончен, когда i=n+1)

4. Ввод значения ai

5. Если ai > 0, то идти к 9

6. Если ai<0, то идти к 11

7. m=m+1 (это случай, когда ai = 0)

8. Идти к 12

9. k=k+1

10. Идти к 12

11. l=l+1

12. Конец цикла i (эта строка производит переход на начало цикла)

13. Вывод значений k,l,m

Конструкция цикла, рассматриваемая до сих пор, не является единственно возможной. Дело в том, что встречаются задачи, где число повторений блока операций - тела цикла - не определено по условию задачи. Выход из такого цикла происходит не по значению переменной счетчика, а по некоторому условию, связанному со спецификой задачи. При этом условие выхода из цикла может стоять как в конце цикла, так и в теле цикла. Рассмотрим следующий пример.

Пример 2.6.

Вычислить сумму для фиксированного значения x>1, определив значение последнего элемента суммы по условию:. Вывести на печать число элементов суммы n.

Решение. Заметим вначале, что возведение числа x в степень i может занять много времени, если i достаточно велико. Может, например, оказаться, что при заданном  последнее значение i равно 100. Тогда совершенно нецелесообразно вычислять очередной элемент суммы по указанной формуле. В самом деле - зачем возводить x в степень 100, если в предыдущем вычислении уже есть значение x в степени 99. Лучше использовать так называемое рекуррентное вычисление, означающее вычисление очередного элемента суммы через значение предыдущего элемента. Выведем соответствующую формулу. Для этого обозначим через ai i-й элемент суммы. Запишем в соответствии с общей формулой:

. Отсюда ясно, что .

Последняя формула называется рекуррентной. В общем случае она может быть получена делением i-го элемента суммы на (i-1)-й. При построении алгоритма опустим номера строк, за исключением тех, которые нужно отметить (то есть поставить метки) для необходимых переходов. Введем переменную s для значения суммы и обратим внимание на то, что a0=1, а индекс i в соответствующих формулах можно опустить. Тогда имеем следующий алгоритм:

Ввод значения x

a=1: s=0: n=0: =0.001: x=2.5

3. Цикл

s=s+a

n=n+1

a=a/x

Если a, то идти к метке 3 (метка 3 - это начало цикла)

Вывод значений s, n

Заметим, что в этом алгоритме счетчик n не участвует в прерывании цикла, хотя и считает число проходов цикла. Условие продолжения цикла контролируется в предпоследней строке. Приведем пример другой конструкции цикла.

Пример 2.7. Вводится пара чисел: a - делимое и b - делитель. Число a делится на число b с точностью до целых последовательным вычитанием a-b. Остаток записывается в переменную d, результат деления – в переменную n. Цикл вычитания продолжается, пока d>b. Затем вводится другая пара a,b. Цикл ввода пар продолжается, покаa>b.

Решение. Здесь необходимо сделать два цикла – один внутри другого. При этом будет подразумеваться, что оператор «конец цикла» автоматически переводит операцию на начало цикла. Слова «выйти из цикла» будут означать переход к следующему оператору после оператора «конец цикла».

Цикл 1

Ввод чисел a и b

Если a < b, то выйти из цикла 1 (это означает - закончить задачу)

n=0

d=a

Цикл 2

d=d-b

n=n+1

если d<b, выйти из цикла 2 (это означает - вывести результат и

перейти к циклу 1)