Задание 1. Разработать программу для вычисления бесконечного ряда с точностью 0 < p < 1, вводимой с клавиатуры, с использованием цикла While-Wend:
.
Выполнение. Для вычисления суммы ряда понадобится переменная, в которой эта сумма будет накапливаться, например s. Чтобы на первой итерации цикла в s было помещено первое рассчитанное значение, начальное значение для s должно быть «нейтральным» для суммирования, т.е. 0. На каждой итерации цикла будет осуществляться расчет заданной формулы, стоящей под знаком суммы (Σ), назовем его «слагаемым», и добавление текущего значения этого слагаемого в переменную s. Количество итераций цикла заранее неизвестно, но сказано, что сумму ряда следует считать с заданной точностью p, которая по условию задачи находится в интервале 0 < p < 1. Поэтому условием остановки цикла будем считать ситуацию, когда модуль слагаемого становится меньше введенной с клавиатуры точности p. По выполнению этого условия итерации цикла завершаются и осуществляется вывод «накопленной» суммы на экран.
Программа
1 Sub While_Wend_1() 'Начало подпрограммы (макроса)
2 p = Val(InputBox("Введите точность:")) 'Ввод точности p с клавиатуры
3
4 s = 0 'Начальное значение суммы задается 0
5 n = 1 'Начальное значение n=1 по заданию
6 A = 1 'Задаем такое число, которое бы позволило выполниться циклу хотя бы первый раз
7 While Abs(A) > p 'Начало цикла и условие продолжения до тех пор, пока модуль слагаемого A больше введенной точности
8 A = 1 / (n * (n + 1)) 'Расчет текущего значения слагаемого при данном n
9 s = s + A 'Добавление слагаемого в сумму s
10 n = n + 1 'Увеличение параметра n на 1
11 Wend 'Конец тела цикла While
12
13 Debug.Print "Сумма ряда ="; s 'Вывод накопленной суммы ряда на экран
14 End Sub 'Окончание подпрограммы
Словесное описание программы
После ввода точности p (с. 2) задаем начальное значение суммы s, которое бы не влияло на результат суммирования, т.е. 0. Далее задаем начальное значение для n=1 по заданию. В цикле мы будем рассчитывать текущее значение слагаемого (с. 8) и помещать результат в переменную a. Условием продолжения цикла будет то, что модуль этой переменной a больше введенной с клавиатуры точности p (с. 7). Однако до начала цикла значение a еще неопределенно, а, следовательно, цикл может не выполниться ни разу. Чтобы этого избежать, в с. 6 присваиваем a=1 (возможно любое число заведомо большее p, с учетом того, что 0 < p < 1 по заданию). В теле цикла рассчитываем очередное значение слагаемого a (с. 8), добавляем его в сумму s (с. 9) и увеличиваем текущую переменную n на 1 (с. 10). После закрытия цикла (с. 11) выводим накопленную сумму ряда на экран (с. 13).
Блок-схема
Задание 2. Реализовать задачу из задания 1 с помощью четырех форм цикла Do-Loop.
Выполнение. Выбор цикла мало влияет на алгоритм программы, потому описание по существу см. в задании 1. Здесь опишем только те изменения, которые потребуется внести:
1 Форма цикла Do-While-Loop полностью совпадает с циклом While-Wend. См. задание 1, поэтому здесь она описываться не будет.
2 Форма цикла Do-Until-Loop имеет только одно отличие: вместо условия продолжения цикла Abs(a) > p используется условие остановки цикла, т.е. Abs(a) <= p:
Программа Do-Until-Loop
15 Sub Do_Until_Loop_1() 'Начало подпрограммы (макроса)
16 p = Val(InputBox("Введите точность:")) 'Ввод точности p с клавиатуры
17
18 s = 0 'Начальное значение суммы задается 0
19 n = 1 'Начальное значение n=1 по заданию
20 A = 1 'Задаем такое число, которое бы позволило выполниться циклу хотя бы первый раз
21 Do Until Abs(A) <= p 'Начало цикла и условие остановки, как только модуль слагаемого A станет меньше либо равен введенной точности
22 A = 1 / (n * (n + 1)) 'Расчет текущего значения слагаемого при данном n
23 s = s + A 'Добавление слагаемого в сумму s
24 n = n + 1 'Увеличение параметра n на 1
25 Loop 'Конец тела цикла Do-Loop
26
27 Debug.Print "Сумма ряда ="; s 'Вывод накопленной суммы ряда на экран
28 End Sub 'Окончание подпрограммы
Отличие блок-схемы тоже только в направлении неравенства и положении надписи «да»:
Блок-схема Do-Until-Loop
3 Формы цикла Do-Loop-While и Do-Loop-Until имеют немного больше отличий. В связи с тем, что условия у этих циклов проверяются после первой итерации, отпадает необходимость в начальном значении для слагаемого a=1. Тело цикла будет выполнено хотя бы один раз при любых значениях a. Между собой эти циклы отличаются также только направлением неравенства в условии:
Программа Do-Loop-While
29 Sub Do_Loop_While_1() 'Начало подпрограммы (макроса)
30 p = Val(InputBox("Введите точность:")) 'Ввод точности p с клавиатуры
31
32 s = 0 'Начальное значение суммы задается 0
33 n = 1 'Начальное значение n=1 по заданию
34 Do 'Начало цикла
35 A = 1 / (n * (n + 1)) 'Расчет текущего значения слагаемого при данном n
36 s = s + A 'Добавление слагаемого в сумму s
37 n = n + 1 'Увеличение параметра n на 1
38 Loop While Abs(A) > p 'Конец цикла и условие продолжения, пока модуль слагаемого A больше введенной точности
39
40 Debug.Print "Сумма ряда ="; s 'Вывод накопленной суммы ряда на экран
41 End Sub 'Окончание подпрограммы
Блок-схемы отличаются тем, что блок условия находится после тела цикла. Между собой блок схемы также отличаются направлением неравенства и положением надписи «да».
Блок-схема Do-Loop-While
Программа Do-Loop-Until
42 Sub Do_Loop_Until_1() 'Начало подпрограммы (макроса)
43 p = Val(InputBox("Введите точность:")) 'Ввод точности p с клавиатуры
44
45 s = 0 'Начальное значение суммы задается 0
46 n = 1 'Начальное значение n=1 по заданию
47 Do 'Начало цикла
48 A = 1 / (n * (n + 1)) 'Расчет текущего значения слагаемого при данном n
49 s = s + A 'Добавление слагаемого в сумму s
50 n = n + 1 'Увеличение параметра n на 1
51 Loop Until Abs(A) <= p 'Конец цикла и условие остановки, как только модуль слагаемого A станет меньше либо равен введенной точности
52
53 Debug.Print "Сумма ряда ="; s 'Вывод накопленной суммы ряда на экран
54 End Sub 'Окончание подпрограммы
Блок-схема Do-Loop-Until
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.