Циклы с неизвестным числом повторений

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

В циклах с неизвестным числом повторений вычислительный процесс завершается при выполнении некоторого дополнительного условия. Значения параметра цикла уже не задаётся в виде диапазона, а только указывается его начальное значение и шаг изменения. Тем не менее, организация цикла выполняется по стандартной методике, указанной в п. 4.1. Отличие заключается в том, что не любой тип циклического вычислительного процесса можно использовать. Тип цикла определяется в соответствии с заданным дополнительным условием завершения вычислений. Это однозначно исключает возможность использование цикла «Для» на основе блока модификации. Для определения количества шагов повторения цикла необходимо организовать счетчик.

Пример 4.3. Составить блок-схему алгоритма, вычисляющего значения функции у = ln(1 + 0.2x), при различных значениях параметра х, изменяющегося от 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.2x>0) Вычисл. значение у Текущие значения k Новое значение х (в конце цикла)
  3 (xn) Истина (1+0.23=1.6 >0) 0.47 k= 1  
    Истина (1+0.21=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 - 2b, для всех возможных комбинаций значений параметров 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 (в начале цикла) Проверка условия продолжения внешнего цикла (aak) Текущее знач. 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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: