Подробная блок-схема цикла по переменной
Переменная цикла x изменяется по закону арифметической прогрессии. Для демонстрации этого приводится логическая блок-схема, показывающая последовательность выполнения цикла по переменной. Соответствие узлов блок-схемы строкам исходного кода на Фортране установлено с помощью цифр.
Do x=xn,xk,step ! (1) блок_do ! (2) Enddo! (3) . . . ! (4) ! цикл закончен, ! продолжение программы Пункт (3) включает в себя: - изменение переменной x, - k = k – 1 (счетчик на вычитание), - переход к проверке значения k. |
Внимание! Из блок-схемы видно, что в цикле по переменной не может произойти зацикливание. Запомним эту его особенность, чтобы сравнить впоследствии с другими разновидностями циклов.
При использовании в программе оператора цикла по переменной следует учитывать следующие правила:
- Переменная x изменяется в цикле автоматически, поэтому изменять ее в теле цикла запрещено.
- Вход в тело цикла разрешается только через заголовок цикла. При несоблюдении этого правила число повторений цикла kp и переменная x не определены.
- Не рекомендуется изменять в теле цикла переменные xn, xk, step, хотя это и не повлияет на число повторений уже запущенного цикла.
- Существует только две возможности повлиять на работу цикла операторами тела цикла – это операторы Exit и Сycle.
- Оператор Exit, встретившийся в теле цикла, прерывает цикл, – завершает его досрочно и передает управление первому исполняемому оператору, следующему за циклом (4).
- Оператор Сycle в теле цикла (2) прерывает выполнение текущей итерации. При этом операторы, расположенные между Cycle иEnddo не выполняются. Происходит переход к изменению переменных x и k (3) для следующей итерации;
- При нормальном завершении цикла переменная x достигает значения
x = xn + step *kp, а при досрочном выходе сохраняется достигнутое значение x из интервала [xn,xk].
Примечание. Цикл по вещественной переменной x имеет неустойчивый характер. При некоторых соотношениях параметров цикла xn, xk, step может не выполниться итерация цикла для x = xk (последняя итерация). Причины:
- ошибка округления при вычислении количества повторений kp;
- накопление погрешности округления при изменении переменной цикла (x=x+step), особенно если шаг step сравнительно мал по отношению к x.
Чтобы избежать этого, возможны варианты:
- заменить цикл по вещественной переменной циклом по целой переменной inta. Перед циклом придется добавить оператор вычисления количества повторений цикла kp, а в цикле перед каждой итерацией вычислить x через inta. Значение целой переменной inta будет точным, переменная x не будет накапливать погрешность, хотя разовая погрешность сохранится.
Integer inta,kp; real x
kp = . . .! формула количества повторений цикла
Do inta = 0, kp-1 ! kp – число повторений цикла
x = xn + inta * step
. . . ! содержимое прежнего блока_do
Enddo
- «подправить» цикл по вещественной переменной, увеличив конечное значение на полшага:
Do x = xn, xk + step/2, step
Конечное значение изменилось и теперь равно xk + step/2.
Примеры циклов по переменной.
Пример 1
Вывести на экран все числа, кратные трем, от 30 до 3 (в обратном порядке)
Do k=30,3,-3 Write(*,*) k Enddo |
Пример 2 (использование оператора Exit)
Подсчитать сумму квадратных корней из 30 чисел, вводимых с клавиатуры. После ввода отрицательного числа прекратить суммирование, сообщить об ошибке и вывести количество просуммированных чисел. По окончании цикла вывести полученную сумму.
Integer::k; Real:: x, summa=0
Do k=1,30
Read(*,*) x
If (x<0) then
Write(*,*) ‘ ошибка, k=’, k-1
Exit
Endif
summa = summa + sqrt(x)
Enddo
Write(*,*) ‘summa=’, summa
Пример 3 (использование оператораCycle)
Последовательно ввести с клавиатуры 30 чисел. Подсчитать сумму и количество квадратных корней из неотрицательных чисел. Отрицательные числа игнорировать, по окончании цикла вывести сумму и количество просуммированных чисел.
Integer::k, count=0; real:: x, summa=0
Do k=1,30
Read(*,*) x
If (x<0) cycle
summa = summa + sqrt(x)
count = count+1
Enddo
Write(*,*) ‘summa=’, summa, ‘ , count=’, count
Цикл Do while
Цикл Do while называют также циклом по условию; условие записывается в заголовке цикла. Оператор обеспечивает повторение тела цикла до тех пор, пока условие верно. Имя здесь не обязательно, но может пригодиться для индикации вложенных циклов, операторов Cycle или Exit.
Общее представление оператора:
[имя:] Do while(логическое выражение)
Тело цикла
End do[имя]
Изображение цикла Do while на блок-схеме:
Важные замечания:
- Тело цикла может вообще не выполниться, если условие изначально ложно.
Пример
Do while(k==k+1) ! условие никогда не выполняется
Тело цикла
End do
- Если переменная, проверяемая в условии в заголовке цикла, не изменяется в теле цикла, или изменяется, но не обращает условие в «ложь», то это приводит к зацикливанию, т.е. цикл будет выполняться, пока вы не закроете программу.
Пример
k = 0
do while(k>=0)
Тело цикла
K = k + 1
End do
При составлении программы из всего арсенала конструкций, которые предлагает нам язык программирования, приходится выбирать наиболее подходящие для решения конкретной задачи.
В качестве примера реализуем подробную блок-схему цикла по переменной с помощью оператора do while:
Пример 1
x=xn k=Max(0,Int((xk-xn)/step))+1 Do while (k>0) ! (1) Тело цикла ! (2) x=x+step ! (3) k=k-1 Enddo . . . ! (4) ! продолжение программы |
Пример 2
Вывести на экран значения x и sin x, если x изменяется от 1 до 3 с шагом 0,1. Выполнить это задание с использованием цикла по переменной и цикла Do while.
Цикл по переменной | Do x= 1, 3, 0.1 Write(*,*)’x=’, x, & ‘ Sin x =’, sin(x) Enddo |
Цикл по условию | x = 1 Do while (x<=3) Write(*,*)’x=’, x, & ‘ Sin x =’, sin(x) x = x + 0.1 Enddo |
Сейчас мы попытаемся сравнить между собой две разновидности циклов – цикл по переменной и цикл по условию. В цикле по условию будем называть переменной цикла переменную, которая изменяется в цикле и проверяется в условии в заголовке цикла.
Цикл по переменной | Цикл по условию | |
Заданы диапазон и шаг изменения переменной цикла | Перед началом цикла следует установить начальное значение переменной цикла. | |
Фиксированное количество повторений цикла. | Количество повторений цикла заранее неизвестно и может быть различным при работе с разными данными. | |
Переменная цикла автоматически изменяется по закону арифметической прогрессии. | Переменная цикла может изменяться по правилу, выбранному программистом для решения конкретной задачи. | |
Переменную цикла изменять в теле цикла запрещено. | Изменение переменной цикла возможно только в теле цикла, и делать это необходимо. | |
Использование цикла по переменной не приводит к зацикливанию. | Ошибки в работе с переменной цикла могут привести к зацикливанию. Одна из таких ошибок – переменная цикла не изменяется в теле цикла. | |
Только одна переменная цикла. | В логическом выражении в заголовке цикла можно использовать несколько переменных. При этом не следует забывать, что всем им нужно установить начальные значения и изменять их в теле цикла. |
Бесконечный цикл
В программировании бесконечным циклом называется цикл, написанный таким образом, что условие выхода из него никогда не выполняется. Если из строки-заголовка цикла по переменной исключить переменную цикла, получится бесконечный цикл. О программе, вошедшей в бесконечный цикл, иногда говорят, что она зациклилась.
Оператором бесконечного цикла называется оператор цикла, не содержащий условия выхода из него. Единственная возможность выхода из бесконечного цикла обеспечивается включением в тело цикла оператора Exit.
Общее представление оператора бесконечного цикла:
[имя:] Do
Тело цикла
End do[имя]
Имя здесь, как и в любой конструкции, не обязательно, но может пригодиться для индикации вложенных циклов, операторов Cycle или Exit.
Изображение бесконечного цикла Doна блок-схеме:
Важное замечание:
Во избежание зацикливания оператор Exit не только должен присутствовать в теле цикла, но обязательно должны создаваться условия, по которым он «сработает», иначе цикл будет выполняться, пока вы не закроете программу.
Продолжая тему «перетекания» друг в друга различных видов циклов, реализуем подробную блок-схему цикла по переменной с помощью бесконечного цикла:
Пример 1
X=xn K=Max(0,Int((xk-xn)/step))+1 Do If (k==0) Exit! (1) Тело цикла ! (2) x=x+step ! (3) k=k-1 Enddo . . . ! (4) ! продолжение программы |
Цикл по переменной и цикл Do while – так называемые циклы с предусловием. Условие выхода из них проверяется ДО выполнения тела цикла, и тело цикла может не выполниться ни разу.
При помощи бесконечного цикла Do и оператора Exit можно строить циклы с предусловием и с постусловием. Условие выхода из цикла с постусловием проверяется ПОСЛЕ выполнения тела цикла, которое обязательно выполняется хотя бы один раз.
Пример 2
Аналог цикла Do while (цикл с предусловием)
Вывести на экран значения sin x для x из интервала [12; 16] с шагом 0.2
X = 12 Do If (x>16) Exit Write(*,*)’X=’, X, & ‘ Sin x =’, sin(X) X = X + 0.2 Enddo |
Пример 3
Цикл, который выполняется хотя бы один раз (цикл с постусловием)
Если в предыдущем примере задать начальное значение x=18, то цикл выполнится один раз при X = 18, а затем цикл будет завершен.
X = 18 Do Write(*,*)’X=’, X, & ‘ Sin x =’, sin(X) X = X + 0.2 If (X>16) Exit Enddo |
Вложенные циклы
Все разновидности циклов можно вкладывать друг в друга на неограниченную глубину. При вложении должно исполняться условие – вкладываемый оператор цикла должен полностью размещаться внутри тела охватывающего цикла.
Пример. Вычислить сумму . Суммирование прекратить досрочно, если значение суммы превысит S1.
Блок-схема:
S=0
Outer: DO j = 1, 10
Inner: do k = 1, 5
S = S + Real(j*k) / Real(j+k)
If(S > S1) Exit Outer
EnddoInner
ENDDOOuter
Тело внешнего цикла Outer по переменной J (на блок-схеме – пунктирная линия) полностью включает в себя внутренний цикл Inner по переменной K. Тело внутреннего цикла на блок-схеме показано штрихпунктирной линией. Внешний цикл выполняется 10 раз, при каждом его выполнении тело внутреннего цикла повторяется 5 раз (всего 50 раз).
Вложенные циклы удобнее читать, если циклам дать имена. Эти имена можно использовать в операторах ExitиCycle. В приведенном примере при достижении указанного значения суммы выход осуществляется из внешнего цикла, внутренний при этом, естественно, прекращается.
Неявные циклы
Еще одна разновидность цикла – неявные циклы, которые часто используются в операторах ввода и вывода. Конструкция do в неявной форме записывается в скобках:
(Список выражений, переменная = начальное значение, конечное значение, шаг)
В список выражений могут входить переменные, выражения, элементы массивов и вложенные неявные циклы. Элементы списка разделяются запятыми. Позже мы подробно рассмотрим их применение для ввода и вывода массивов.
Пример неявного цикла:
Write(*,*) (a, sin(a) , a=1., 2., 0.5)
На экран будут выведены значения a и sin(a) при значениях a в диапазоне от 1 до 2 с шагом 0,5.
Дата добавления: 2017-09-19; просмотров: 3149;