Пример 4.6.1-3. Написать процедуры вывода, которые могут использоваться в алгоритмах итеративных циклических структур.




Некоторые процедуры ввода и вывода приведены в Теме 4. Остальные процедуры ввода и вывода, которые используются при написании базовых алгоритмов итеративных циклических структур, представлены на
рис. 4.6.1-3 – 4.6.1-4.6.

 

'Процедура вывода значений переменных Integer и Double в TextBox Sub vivodID11(ByVal n As Integer,ByVal T1 As String _ ByVal a As Double, ByVal T2 As String, _ ByVal T As TextBox) T.Text = T.Text & T1 & CStr(n) & T2 & CStr(a) & vbCrLf End Sub

 

Рис. 4.6.1-3. Программный код процедуры vivodID11()

вывода значений двух переменных типа Integer и Double в TextBox

Примера 4.6.1-3

 

'Процедура вывода целого результата в ListBox Sub vivodIntLs12(ByVal n As Integer, ByRef LB As ListBox) LB.Items.Add(CStr(n)) End Sub

 

Рис. 4.6.1-4. Программный код процедуры vivodIntLs12()

вывода целого результата в ListBox

Примера 4.6.1-3

'Процедура вывода вещественного результата в ListBox Sub vivodDblLs13(ByVal Z As Double, ByRef LB As ListBox) LB.Items.Add(CStr(Z)) End Sub

Рис. 4.6.1-5. Программный код процедуры vivodDblLs13()

вывода вещественного результата в ListBox

Примера 4.6.1-3

'Процедура форматного вывода значений переменных Integer в ТextBox Sub vivodFxn14(ByVal x As Long, ByVal n As Integer, _ ByVal T As TextBox) T.Text = T.Text & Format(x, "0") & Space(8) & _ Format(n, "0") & vbCrLf End Sub

 

Рис. 4.6.1-6. Программный код процедуры vodFxn14()

форматного вывода значений двух переменных типа Integer в ТextBox

Примера 4.6.1-3

 

 

4.6.2. Базовые алгоритмы
итеративных циклических структур
и примеры их программирования

 

Рассмотрим сумму вида S= a1 + a2 + a3 +... пусть имеется положительное число ε > 0, называемое точностью вычислений. Во многих задачах точность вычисления суммы S считается достигнутой, когда выполняется одно из следующих условий:

· разность │Si – Si-1│ < ε, где Si – сумма на i–м шаге цикла (т.е. сумма содержит i слагаемых), а Si-1 – сумма на предыдущем шаге;

· разность │ai – ai-1│< ε, где ai – значение слагаемого на i-м шаге, а
ai-1 – на предыдущем шаге цикла;

· значения │Si│ < ε и значение │ai│ < ε.

 

Абсолютное значение (модуль) условия обычно требуется для знакопеременных рядов. Следует заметить также, что приведенные выше условия во многих задачах практически эквивалентны.

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

При описании базовых алгоритмов регулярных циклических структур мы приводили примеры вычисления сумм и произведений конечного (заранее известного) числа членов последовательности (Примеры 4.5.2-3, 4.5.2-4, 4.5.2-5).

Рассмотрим теперь некоторую последовательность, содержащую бесконечное число членов: a0, a1, a2, a3,…, ai,…, an,… В таких задачах требуется вычислять члены последовательности до тех пор, пока очередной вычисленный член не будет удовлетворять некоторому условию.

Если задано некоторое число ε, условия окончания итерационного процесса могут, например, быть следующими:

· для убывающей последовательности an < ε;

· для возрастающей последовательности an > ε ( примеры 4.6.2-1, 4.6.2-3,
4.6.2-5 );

· для убывающей знакопеременной последовательности |an| < ε
(
пример 4.6.2-4);

· для некоторых других последовательностей | an+1 -an|<ε (пример 4.6.2-2).

 

Пример 4.6.2-1. Написать процедуру-Function, которая среди последовательности чисел (факториал n! =1*2*3*4*... n) находит первое число, большее заданного значения переменной a.

Алгоритм решения данной задачи относится к алгоритмам вычисления членов бесконечных последовательностей (рис.4.6.2-1).

Этот алгоритм использует итеративный цикл с предусловием и реализуется с помощью конструкции Do While... Loop.

Для решения данной задачи проведем формализацию. Для этого введем следующие обозначения: b – очередной член бесконечной последовательности; n – номер этого члена, который в данной задаче совпадает со значением знаменателя дроби, добавляемой к предыдущему члену для получения значения очередного члена последовательности. Таким образом, итерационная формула вычисления очередного члена последовательности будет иметь следующий вид: (т.е. должны выполняться условия n>=1 AND n<=15), где n – номер члена.


 

Function Pr621(ByVal a As Double)As Double Dim b As Double Dim n As Integer b = 1 n = 1 Do While b <= a n = n + 1 b = b + 1 / n Loop Return b End Function

Рис. 4.6.2-1.Схема алгоритма и программный код процедуры Pr621(),
которая среди последовательности чисел находит первое число,
большее заданного значения, используя оператор Do While...Loop

Примера 4.6.2-1

 

Процедура-функция Pr621() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-2.

 

Dim aa, bb As Double aa = vvodDbl2("Введите значение a=", TextBox1) bb = Pr621(aa) vivodDbl1(bb,TextBox2)

 

Рис. 4.6.2-2. Пример обращения к процедуре Pr621()

 


 

Решение данного примера может быть реализовано также с использованием конструкции Do Until…Loop (рис. 4.6.2-3), а цикл с предусловием можно заменить на цикл с постусловием и соответствующим ему изменением настройки цикла (рис. 4.6.2-4).

 

Function Pr623(ByVal a As Double) As Double Dim b As Double Dim n As Integer b = 1 n = 1 Do Until b > a n = n + 1 b = b + 1 / n Loop Return b End Function  

 

Рис. 4.6.2-3. Схема алгоритма и программный код процедуры Pr621(),
которая среди последовательности чисел находит первое число,
большее заданного значения, и, используя оператор Do Until…Loop

Примера 4.6.2-1

 

Изменим в цикле условие продолжения выполнения цикла
(на рис. 4.6.2-1 заменим условие b <= a на условие b > a), т.е. будем проводить вычисления членов последовательности до тех пор, пока не встретится член, больший заданного числа. Заменим условие b <= a на условие b > a.

Тогда алгоритм и функция будут выглядеть, как на рис.4.6.2-3.

Если вычисление членов последовательности проводится в теле цикла, начиная с первого, то алгоритм и процедура-функция примут вид, показанный на рис 4.6.2-4.

 

Function P624(ByVal a As Double) _ As Double Dim b As Double Dim n As Integer b = 0 n = 0 Do n = n + 1 b = b + 1 / n Loop Until b > a Return b End Function    

 

Рис. 4.6.2-4. Схема алгоритма и программный код процедуры Pr624(),
которая среди последовательности чисел находит первое число,
большее заданного значения, используя, оператор Do…Loop Until

Примера 4.6.2-1

Мы получили структуру итеративного цикла с постусловием, изменив настройку цикла: n = 0, b = 0. В данном случае условием окончания вычислительного процесса служит значение True логического выражения
b > a, а продолжением – значение False (конструкция Do…Loop Until).

Изменив условие на b <= a, получим конструкцию цикла с
Do…Loop Wile.

Следовательно, задача может быть решена с использованием как цикла с предусловием, так и цикла с постусловием.

 

Пример 4.6.1-2. Написать процедуру-Function, которая вводит натуральное число n, значение которого находится на отрезке [1;15], с проверкой ввода (т.е. должны выполняться условия n>=1 AND n<=15).

Вос­пользуемся известной итерационной формулой, где i=0, 1, 2,...; x0=0. Следует закончить итеративный процесс, как только |xi+1-xi| станет меньше ε=10-4.

Для решения этой задачи необходимо из очередного приближения вычисленного корня xi+1 вычитать значение предыдущего приближения корня xi . Для этого при каждом повторении цикла перед вычислением очередного значения корня x сохраняем в переменной a текущее значение x (оно становится предыдущим). Цикл прекращаем, если разность между a (т.е. xi) и x (т.е. xi+1) станет меньше e=10-4.

 

Алгоритм решения данной задачи относится к итерационным алгоритмам (рис. 4.6.2-5) и может быть реализован, например, с помощью конструкции Do... Loop Until c постусловием.

 

Function P625() As Double Dim a, x, d As Double x = 0 d = 1E-4 Do a = x x = -Exp(a) Loop Until Abs(x - a) < d Return x End Function

 

Рис. 4.6.2-5. Схема алгоритма и программный код процедуры Pr625(),

которая реализует ввод данных с их проверкой

Примера 4.6.2-2

Процедура- Function Pr625() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-4.6.

 

Dim xx As Double xx = Pr625() vivodDbl1(xx, TextBox1)

 

Рис. 4.6.2-6. Пример обращения к процедуре Pr625()

Примера 4.6.2-2

Пример 4.6.2-3. Задана возрастающая последовательность

Требуется написать программу, которая вычисляет все члены последовательности, до тех пор, пока значение очередного члена не превысит некоторое заданное число d, например, (3 <d <100).

В нашей задаче для вычисления любого члена последовательности можно воспользоваться формулой, , где n=0, 1, 2,…- номер члена.

В задачах, использующих итеративные алгоритмические структуры, рекомендуется предусмотреть так называемую «страховку от зацикливания», так как иногда условие продолжения цикла может оставаться истинным бесконечно. В данном примере цикл с постусловием будет выполняться не более 100 раз, даже если очередной член последовательности будет оставаться меньше d (рис. 4.6.2-7). Так как вывод в TextBox членов последовательности должен происходить в процессе вычисления (внутри цикла), то для решения задачи напишем процедуру- Sub.

 

Sub Pr627(ByVal x As Double, _ ByVal d As Double) Dim n As Integer = 0 Dim a As Double Do а = x^n / 3^n vivodID11(n, "n=",a, "a=", TextBox3) n=n+1 Loop While a <= d And n < 100 End Sub    

 

Рис. 4.6.2-7. Схема алгоритма и программный код процедуры Pr627(),

которая вычисляет члены последовательности
до выполнения определенных условий

Примера 4.6.2-3

Процедура- Sub Pr627() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-8.

 

Dim xx, dd As Double xx = vvodDbl2("Введите значение xx= ", TextBox1) dd = vvodDbl2("Введите значение dd= ", TextBox2) Pr627(xx, dd)

Рис. 4.6.2-8. Пример обращения к процедуре Pr627()

Примера 4.6.2-3

Пример 4.6.2-4. Написать процедуру-функцию, которая вычисляет сумму членов знакопеременной убывающей последовательности с заданной точностью ε: .

Вычисление с заданной точностью ε означает, что суммирование членов ряда надо продолжать до тех пор, пока очередной вычисленный член ряда не станет меньше по абсолютной величине числа ε.

Отметим, что во многих задачах непосредственный подсчет очередного члена связан с вычислительными трудностями. В этом случае целесообразно использовать рекуррентную формулу, которая позволяет вычислить значение переменной на следующем шаге, используя ее значение на текущем шаге . Выражение для q можно получить, разделив an+1 член на an член.

 

Function Pr629(ByVal x As Double,_ ByVal e As Double) As Double Dim a, s As Double Dim n As Integer = 0 a = x – 1 s = 0 Do Until Abs(a) < e Or n > 100 vivodIntLs12(n, ListBox1) vivodDblLs13(a, ListBox2) s = s + a a = -a * (x - 1) / (n + 2) n = n + 1 Loop Return s End Function  

 

Рис. 4.6.2-9. Схема алгоритма и программный код процедуры Pr629(),

которая вычисляет сумму членов знакопеременной убывающей последовательности с точностью ε

Примера 4.6.2-4

 

Приведем вывод рекуррентной формулы для заданного в примере ряда. Формула для n-го члена приведена в задании:

Приведем вывод рекуррентной формулы для заданного в примере ряда. Формула для n-го члена приведена в задании:

тогда формула n+1 члена

Разделив an+1 член на an, получим выражение для q

Таким образом, рекуррентная формула для данного ряда:

Выбор начального значения номера члена ряда (n) для нашего случая будет n=0, так как при подстановке этого значения в формулу n-го члена ряда

мы получим значение первого члена, равного x-1 или a0=x-1.

Схема алгоритма и процедура- Function приведены на рис. 4.6.2-9, причем алгоритм этот с предусловием, в котором предусмотрено выполнение цикла не более 100 раз, чтобы избежать зацикливания.

Процедура-Function Pr629() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-10.

 

Dim xx, ee, ss As Double xx=vvodDbl2("Введите значение xx=", TextBox1) ee=vvodDbl2("Введите значение ee=", TextBox2) ss = Pr629(xx, ee) vivodDbl1(ss, TextBox3)

 

Рис. 4.6.2-10. Пример обращения к процедуре Pr629()

Примера 4.6.2-4

 

Приведем вывод рекуррентной формулы для заданного в примере ряда. Формула для n-го члена приведена в задании:

тогда формула n+1 члена

Разделив an+1 член на an, получим выражение для q

Таким образом, рекуррентная формула для данного ряда:

Выбор начального значения номера члена ряда (n) для нашего случая будет n=0, так как при подстановке этого значения в формулу n-го члена ряда

мы получим значение первого члена, равного x-1 или a0=x-1.

 

Function P6211(ByVal x Double, _ ByVal e As Double) As Double Dim a, s As Double Dim n As Integer = 0 a = x – 1 s = 0 Do Until Abs(a) < e Or n > 100 vivodIntLs12(n,ListBox1) vivodDblLs13(a,ListBox2) s = s + a n = n + 1 a =- a * (x - 1) / (n + 1) Loop Return s End Function

Рис. 4.6.2-11. Схема алгоритма и программный код процедуры Pr6211(),

которая вычисляет сумму членов знакопеременной убывающей последовательности с точностью ε

Примера 4.6.2-4

Схема алгоритма и код процедуры-функции приведены на
рис. 4.6.2-11. В этом случае, в отличие от предыдущего, увеличивать n (n=n+1) следует до, а не после вычисления очередного члена ряда.

 

Пример 4.6.2-5. Написать процедуру-Sub, вычисляющую сумму всех чисел Фибоначчи, которые не превосходят заданного натурального числа m, и определить количество таких чисел.

Числа Фибоначчи (Fi) определяются по формулам

F0 = F1 = 1; Fi = Fi –1 + Fi –2, при i = 2, 3,...,…

т.е. каждое очередное число равно сумме двух предыдущих.

Подобная задача была решена при рассмотрении регулярных циклических структур (пример 5.2-4). Однако здесь число слагаемых (членов последовательности) заранее неизвестно, поэтому организуем итеративный цикл с предусловием. Обозначим это число слагаемых k. В данном примере до начала цикла задаются значения трех чисел Фибоначчи F0, F1, и F2 = F0 + F1 = 2 и их сумма S = F0 + F1 + F2 = 4. В цикле переопределяем значение переменных F 0 и F1, выводим очередное (предыдущее) число Фибоначчи, вычисляем следующее число и добавляем его в сумму. Когда текущее число Фибоначчи превосходит заданное число m (F2 ≤ mFalse), то происходит выход из цикла. Так как это число Фибоначчи уже добавлено в сумму, то после выхода из цикла его необходимо вычесть из нее (S = S - F2). Таким образом, в окончательном значении суммы будут учтены только те числа Фибоначчи, которые еще не превосходят m.

 

Sub P6212(ByVal m As Integer, _ ByRef S As Long, ByRef k As Integer) Dim F, F1, F2 As Integer F0 = 1: F1 = 1: F2 = 2 S = F0 + F1 + F2: k = 3 Do While F2 <= m F0 = F1: F1 = F2 vivodIntLs12(F1, ListBox1) F2 = F0 + F1 S = S + F2 K = k + 1 Loop S = S – F2 k = k - 1 End Sub  

 

Рис. 4.6.2-12. Схема алгоритма и программный код процедуры Pr6212(),

которая вычисляет сумму чисел Фибоначчи,
не превосходящих заданного натурального числа
m

Примера 4.6.2-5

Схема алгоритма и код процедуры- Sub приведены на рис. 4.6.2-12.

Процедура- Sub Pr6212() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-13.

 

Dim SS As Long Dim mm, kk As Integer mm=vvodInt9("Введите значение mm= ", TextBox1) Pr6212(mm, SS, kk) vivodFxn14(SS, kk, TextBox2)

Рис. 4.6.2-13. Пример обращения к процедуре Pr6212()

Примера 4.6.2-5

 

Пример 4.6.2-6. Написать процедуру-Function, которая вычисляет с точностью e=0.001 сумму членов ряда

.

Задана знакопеременная убывающая последовательность, поэтому для вычисления суммы ряда с точностью e будем вычислять и суммировать члены последовательности до тех пор, пока очередной член ряда не станет меньше заданной точности по модулю.

Заданный ряд вычислять через рекуррентную формулу нецелесообразно, так как это, во-первых, трудно, а во-вторых, скорее всего, невозможно вывести общую формулу n -гол члена ряда. Поэтому можно воспользоваться следующим универсальным приемом вычисления подобных рядов. Каждый член последовательности можно представить, как где z – множитель, равный 1 или -1 (знак члена ряда); n – первый сомножитель в числителе каждого слагаемого (в данном случае совпадает с номером члена ряда); b – второй сомножитель в числителе; с – знаменатель каждого слагаемого.

В свою очередь, знаменатель члена ряда представляет собой произведение нескольких сомножителей, причем с увеличением номера члена ряда увеличивается и количество сомножителей в знаменателе. Таким образом, знаменатель можно представить, как с = с * d, где d – сомножитель, добавленный к значению знаменателя предыдущего члена ряда.

Схема алгоритма и код процедуры-функции приведены на
рис. 4.6.2-14.

 

Function Pr6214(ByVal E As Double) _ As Double Dim a, s As Double Dim n, z, b, c, d As Integer n = 1 z = 1 b = 5 c = 2 * 4 d = 4 a = z * n^ 2 * b / c s = 0 Do While Abs(a) > E vivodIntLs12(n, ListBox1) vivodDblLs13(a, ListBox2) s = s + a n = n + 1 z = -z b = b + 1 d = d + 2 c = c * d a = z * n^ 2 * b / c Loop Return s End Function

Рис. 4.6.2-14. Схема алгоритма и программный код процедуры Pr6214(),

которая вычисляет с точностью e=0.001 сумму членов заданного ряда

Примера 4.6.2-6

Процедура-Function Pr6214() может быть вызвана из любой другой процедуры или из модуля формы, например, как показано на рис. 4.6.2-15.

 

Dim EE, SS As Double EE =vvodDbl1(TextBox1) SS = Pr6214(EE) vivodDbl1(SS, TextBox2)

 

Рис. 4.6.2-15. Пример обращения к процедуре Pr6214()

Примера 4.6.2-6


Тестовые задания

 

1. Оператор Dо…Lооp – это: 1) оператор итеративного цикла;2) оператор выбора3) оператор регулярного цикла4) составной оператор. 2. В итеративной циклической структуре число повторений операторов тела цикла 1) может быть известно заранее2) заранее неизвестно3) заранее известно или может быть предварительно вычислено4) нет верного ответа 3. Телом цикла в операторе Do…Loop могут быть 1) только оператор условного перехода или оператор присваивания2) только арифметические или логические выражения3) любые операторы4) нет верного ответа 4. Для досрочного прекращения итеративного цикла используется оператор 1) Exit Do 2) Exit 3) Break 4) нет верного ответа 5. Алгоритмическая структура цикла итеративного типа может быть 1) с предусловием или с постусловием2) только с предусловием3) только с постусловием4) безусловная 6. Если при программировании циклической структуры используется операторDo while…Loop, то тело цикла 1) обязательно выполнится хотя бы 1 раз2) выполняется заданное число раз3) оператор не относится к средствам программирования итеративного цикла4) может ни разу не выполниться 7. Если при программировании циклической структуры используется оператор
Do…Loop While, то тело цикла
1) обязательно выполнится хотя бы 1 раз2) может ни разу не выполниться3) выполняется заданное число раз4) оператор не относится к средствам программирования итеративного цикла 8. Если при программировании циклической структуры используется оператор Do…Loop Until, то тело цикла 1) обязательно выполнится хотя бы 1 раз2) может ни разу не выполниться3) выполняется заданное число раз4) оператор не относится к средствам программирования итеративного цикла
9. После ключевых слов While или Until в операторе итеративного цикла Do…Loop записывается 1) арифметическое или логическое выражение2) оператор выбора3) любой оператор4) нет верного ответа 10. Результатом работы фрагмента программы
Dim n As Integer n = 0 Do While n < 5 n = n + 1 Loop TextBox1.Text = CStr(n)
будет1) вывод на экран 62) вывод на экран 03) вывод на экран 54) сообщения об ошибке5) «зацикливание» 11. Что будет на экране в результате работы фрагмента программы
Dim n As Integer n = 0 Do Until n < 5 n = n + 1 Loop TextBox1.Text = CStr(n)
1) 62) 53) сообщение об ошибке4) «зацикливание»5) 0 12. Что будет выведено на форму после выполнения заданного фрагмента программы
i = 1 DO i = i + 2 TextBox1.Text = CStr(i) & vbCrLf LOOP WHILE i < 7
1) столбик чисел от 1 до 72) строка чисел от 1 до 73) столбик чисел от 3 до 74) строка чисел от 3 до 7 13. При каких начальных значениях переменных алгоритм закон­чит работу без зацикливания
 
1) А=-2 С=-32) А=-3 С=-23) А=-3 С=-34) А=-2 С=-15) А=-4 С=-3 14. Цикл с предусловием выполняется следующим образом 1) выполняется тело цикла, изменяется параметр цикла, проверяется условие продолжения цикла2) изменяется параметр цикла, проверяется условие продолжения выполнения цикла, 3) выполняется тело цикла4) проверяется условие продолжения выполнения цикла, выполняется тело цикла 5) тело цикла выполняется n раз (n – натуральное)6) определяется, сколько раз должен выполнен цикл, и далее цикл с предусловием7) сводится к циклу с параметром 15. При каких начальных значе­ниях переменных алгоритм закончит работу без зацикливания

1) А=-2 С=-12) А=-2 С=-33) А=-3 С=34) А=-3 С=-2
16. Определить выходные значения переменных А и С после выполнения алгоритма
1) 1 72) 0 -43) 1 34) 0 -55) зацикливание

4.6.4. Лабораторная работа по теме
«Программирование алгоритмов итеративных
циклических структур»

 

Цель данной лабораторной работы состоит в получении практических навыков формализации, разработки, написания и отладки проектов, использующих итеративные циклические структуры.

 

Вопросы, подлежащие изучению

 

1) Алгоритмы организации итеративных циклических структур: цикл с предусловием; цикл с постусловием.

2) Базовые алгоритмы, использующие итеративные циклические структуры: алгоритм вычисления суммы (или произведения) членов бесконечной последовательности; алгоритмы вычислений по итеративным формулам.

3) Операторы, реализующие выполнение итеративных циклов: Do While…Loop; Do Until…Loop; Do...Loop While…; Do…Loop…Until.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: