Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Подробная блок-схема цикла по переменной




Переменная цикла 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 называют также циклом по условию; условие записывается в заголовке цикла. Оператор обеспечивает повторение тела цикла до тех пор, пока условие верно. Имя здесь не обязательно, но может пригодиться для индикации вложенных циклов, операторов C ycle или E xit .

Общее представление оператора:

[ имя:] 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

Enddo Inner

ENDDO Outer

Тело внешнего цикла 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.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...