При решении некоторых задач может возникнуть ситуация, когда невозможно заранее определить количество повторений вычислений. В таких случаях речь идет о циклах с неизвестным числом повторений.
В циклах с неизвестным числом повторений вычислительный процесс завершается при выполнении некоторого дополнительного условия. Значения параметра цикла уже не задаётся в виде диапазона, а только указывается его начальное значение и шаг изменения. Тем не менее, организация цикла выполняется по стандартной методике, указанной в п. 4.1. Отличие заключается в том, что не любой тип циклического вычислительного процесса можно использовать. Тип цикла определяется в соответствии с заданным дополнительным условием завершения вычислений. Это однозначно исключает возможность использование цикла «Для» на основе блока модификации. Для определения количества шагов повторения цикла необходимо организовать счетчик.
Пример 4.3. Составить блок-схему алгоритма, вычисляющего значения функции у = ln(1 + 0.2 ∙ x), при различных значениях параметра х, изменяющегося от xn ≤ 3 с шагом hx = -2. При этом вычислять у до тех пор, пока выражение под знаком логарифма остается больше 0. Определить количество (k) вычисленных значений y.
|
|
Перед решением задачи необходимо определить тип цикла, который будет использоваться. Вычисляемое выражение содержит «аномалию» (значение под знаком логарифма должно быть больше 0), которая в тоже время является условием завершения вычислений. Другими словами, необходимо вначале проверить возможность вычисления значения у, а только затем вычислять его. Поэтому в данном случае для организации вычислительного процесса можно использовать только цикл с предусловием (рис. 4.3).
В качестве исходных данных вводятся значения переменных хn, hx (блок 2). В блоке 3 задаются начальные значения для параметра цикла x и счетчика количества повторений цикла k. После этого, в блоке 4 одновременно проверяются условие продолжения цикла и возможная «аномалия» (выражение под знаком логарифма должно быть больше 0). В теле цикла для текущего значения х вычисляется и выводится соответствующее значение у (блоки 5-6), а также увеличивается значение счетчика вычисленных у (блок 7). В конце тела цикла выполняется переход к следующему значению параметра цикла х (блок 8). Цикл работает до тех пор, пока под знаком логарифма не появится выражение ≤ 0. После выхода из цикла в блоке 9 выводится переменная k – количество вычисленных значений у.
Результаты пошагового выполнения цикла в алгоритме, приведенном на рис. 4.3, представлены в таблице 4.3.
Таблица 4.3. Пошаговое выполнение цикла
|
|
№ шага | Текущее значение х (в начале цикла) | Результат проверки условия продолжения цикла (1+0.2 ∙ x>0) | Вычисл. значение у | Текущие значения k | Новое значение х (в конце цикла) |
3 (xn) | Истина (1+0.2 ∙ 3=1.6 >0) | 0.47 | k= 1 | ||
Истина (1+0.2 ∙ 1=1.2 >0) | 0.18 | k= 2 | -1 | ||
-1 | Истина (1+0.2 ∙ -1=0.8 >0) | -0.22 | k= 3 | -3 | |
-3 | Истина (1+0.2 ∙ -3=0.4 >0) | -0.92 | k= 4 | -5 | |
-5 | Ложь (1+0.2 ∙ -5=0 >0) |
Вложенные циклы
Решение некоторых задач требует выполнения перебора значений не одной, а нескольких величин одновременно. В этом случае речь идет о применении вложенных циклов, каждый из которых организовывается по стандартному принципу (может быть любого из трех типов) и осуществляет перебор только одного параметра. При этом первый цикл называется внешним, а вложенные в него – внутренними. Причем один и тот же цикл может быть внешним по отношению к одному и внутренним по отношению к другому циклу. Границы внутреннего цикла не могут выходить за границы внешнего по отношению к нему цикла.
Для каждого значения параметра внешнего цикла происходит перебор всех возможных значений параметра внутреннего цикла. Другими словами, всегда выполняется в первую очередь самый внутренний цикл. Такая организация циклов дает возможность перебрать значения их параметров во всех возможных комбинациях.
Пример 4.4. Составить блок-схему алгоритма, вычисляющего значения функции у = a - 2 ∙ b, для всех возможных комбинаций значений параметров a и b, принадлежащих интервалам 0 ≤ a ≤ 2, ha = 1 и -2 ≤ b ≤ 2, hb = 2, соответственно. Определить среднее арифметическое (S) вычисленных значений y.
Для решения поставленной задачи необходимо организовать два вложенных цикла по перебору параметров a и b. При этом каждый цикл является циклом с известным числом повторений, т. к. заранее можно вычислить количество значений a из заданного интервала (Na = ](2 – 0)/1[ + 1 = 3) и количество значений b из заданного интервала (Nb = ](2 – (-2))/2[ + 1 = 3), а следовательно и общее количество вычисленных значений y (N = Na × Nb). Значит, для организации циклов можно использовать любой из трех стандартных типов.
Кроме этого y одновременно зависит от двух параметров a и b, поэтому не имеет принципиального значения по какому параметру делать внешний цикл, а по какому – внутренний (внешним может быть цикл по параметру a, а внутренним – по параметру b, и наоборот). В случае же если одна из вычисляемых величин зависит только от одного параметра, то цикл по этому параметру рационально сделать внешним и вычислять величины, зависящие только от этого параметра во внешнем цикле. Такая организация позволит избежать многократного вычисления одних и тех же значений во внутреннем цикле.
На рисунке 4.4 представлена блок-схема алгоритма, в которой для решения поставленной задачи, используется два вложенных цикла: внешний цикл с предусловием по параметру a и внутренний цикл с постусловием по параметру b.
Работа алгоритма начинается с ввода исходных данных (блок 2), которые представляют собой начальные, конечные значения и шаг изменения параметров a и b из заданных интервалов. На этапе подготовки к выполнению внешнего цикла (блок 3) параметру цикла a присваивается начальное значение an, а также обнуляются переменные S и k, используемые для хранения суммы и количества вычисленных значений y.
Тело внешнего цикла с предусловием включает блоки 4-11. Если текущее значение a не выходит за правую границу интервала (блок 4), то происходит выполнение тела внешнего цикла, которое включает в себя внутренний цикл. В блоке 5 происходит подготовка к выполнению внутреннего цикла, его параметру b присваивается начальное значение bn.
Тело внутреннего цикла с постусловием включает блоки 6-10. В блоке 6 вычисляется текущее значение y, а в блоке 7 происходит вывод вычисленного y и соответствующих ему значений a и b. В блоке 8 полученное значение у добавляется к сумме S и увеличивается значение счетчика вычисленных у. Затем происходит изменение параметра внутреннего цикла b на значение шага hb (блок 9) и выполняется проверка условия выхода из внутреннего цикла (блок 10).
|
|
Если текущее значение b не превышает конечного bk, то происходит возврат на начало внутреннего цикла и повторяется вычисление y при новом значении b. В тоже время значение параметра внешнего цикла a остается неизменным. Таким образом, при одном значении параметра внешнего цикла происходит перебор всех значений параметра внутреннего цикла.
После выхода из внутреннего цикла в блоке 11 происходит изменение параметра внешнего цикла a на значение шага ha. Затем выполняется переход на начало цикла (блок 4) и повторяются описанные выше действия, пока не завершит работу внешний цикл. После выхода из внешнего цикла в блоках 12-13 вычисляется и выводится S - среднее арифметическое вычисленных значений y.
Результаты пошагового выполнения циклов в алгоритме, приведенном на рис. 4.4, представлены в таблице 4.4.
Таблица 4.4. Пошаговое выполнение алгоритма с вложенными циклами
№ шага | Текущее знач. a (в начале цикла) | Проверка условия продолжения внешнего цикла (a ≤ ak) | Текущее знач. b (в начале цикла) | Вычисл. значение у | Текущие значения k, S | Новое знач. b (в конце цикла) | Проверка условия выхода из внутреннего цикла (b > bk) | Новое знач. a (в конце цикла) |
0 (an) | Истина | -2 (bn) | k= 1, S= 4 | Ложь | - | |||
- | - | k= 2, S= 4 | Ложь | - | ||||
- | - | 2 (bk) | -4 | k= 3, S= 0 | Истина | |||
Истина | -2 (bn) | k= 4, S= 5 | Ложь | - | ||||
- | - | k= 5, S= 6 | Ложь | - | ||||
- | - | 2(bk) | -3 | k= 6, S= 3 | Истина | |||
2 (ak) | Истина | -2 (bn) | k= 7, S= 9 | Ложь | - | |||
- | - | k= 8, S= 11 | Ложь | - | ||||
- | - | 2(bk) | -2 | k= 9, S= 9 | Истина | |||
Ложь | - | - | - | - | - | - |
Следует также обратить внимание на то, что начальное значение параметра внутреннего цикла b необходимо задавать каждый раз перед началом выполнения вложенного цикла (блок 5), т.е. внутри внешнего цикла. Если это будет сделано одновременно с заданием начального значения для параметра внешнего цикла a (блок 3), то внутренний цикл выполнится только при начальном значении a. На этом алгоритм завершит свою работу и, следовательно, не будут перебраны все возможные комбинации значений a и b.
|
|