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

Количество повторений цикла по переменной




Lesson 2

Ветвления и циклы

Структурное программирование – это технология разработки программ, в основе которой лежит представление программы в виде набора блоков. Блок – это часть текста программы, которая сгруппирована и воспринимается как единое целое. Блоки могут состоять из одного или нескольких операторов, быть пустыми или вложенными.

Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

− последовательное исполнение – однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

− ветвление – однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

− цикл – многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде подпрограмм (процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется оператор вызова подпрограммы. При выполнении такого оператора выполняется вызванная подпрограмма, после чего исполнение программы продолжается с оператора, следующего за командой вызова подпрограммы.

Алгоритм – это последовательность действий, выполняемых в программе. Составление любого приложения начинается с разработки алгоритма. Сначала целесообразно разбить алгоритм на крупные блоки, а уже затем последовательно детализировать их, т.е. наполнять «начинкой». Некоторые из таких блоков стоит отладить отдельно, написав специальную главную программу и выполнив с разными наборами исходных данных. Отлаженные блоки можно смело вставлять в основное приложение.

Хорошо структурированные программы с понятной логикой их работы легко разрабатывать, отлаживать, сопровождать; максимально упрощается внесение изменений в такие программы.

Блок-схемы алгоритмов

Блок-схема – это графическое изображение алгоритма программы или ее части, она помогает расставить исполняемые операторы в соответствии с алгоритмом. Графические образы существенно облегчают восприятие сложных структур. Если начинать разработку программы с составления продуманной блок-схемы, то написание текста программы и ее отладка значительно упрощаются.

Блок-схема строится из ограниченного набора блоков, а также стрелок, соединяющих их в порядке выполнения. Техника рисования упрощается при использовании компьютерных средств, в частности, пакета MS VISIO или SMART DRAW 5. Эти пакеты позволяют создавать блок-схемы из готовых блоков. Блоки легко масштабируются, дополняются надписями, соединяются линиями. При перемещении блоков линии следуют за блоками.

До сих пор мы рассматривали и составляли программы, имеющие линейную структуру, то есть представляющие собой первый тип базовых конструкций. В таких программах используются:

1) Блоки начала и конца каждой программной единицы.

2) Блоки, состоящие из простых операторов, имеют один вход и один выход

Блок-схема программы с линейной структурой имеет следующий вид:

Блок «Действия» может включать в себя несколько простых операторов.

Управляющие операторы

В более сложных программах для управления порядком выполнения операторов служат управляющие операторы. Они дают возможность повторить группу операторов несколько раз, пропустить какую-то группу операторов и т.д.

Операторы, состоящие из одной строки, называются простыми операторами. Операторы, включающие в себя блоки, называются составными операторами

Необязательное имя может быть назначено любому составному оператору и должно быть правильным уникальным именем Фортрана, составленным по его правилам. Если имя оператора назначено, оно обязательно должно быть указано в его завершающей строке. Примеры использования имен будут приведены при описании операторов.

Основные виды управляющих операторов – операторы перехода и операторы циклов.

Операторы перехода

Операторы перехода изменяют порядок выполнения операций по сравнению с порядком, установленным в тексте программы. Условные операторы позволяют выбирать одно из нескольких возможных продолжений процесса выполнения программы. Они реализуют второй тип базовых конструкций – ветвление.

Условный оператор If

Наиболее употребительным условным оператором является оператор If и его разновидности. В операторе If условие выбора задается в виде логического выражения. Это логическое выражение должно быть заключено в скобки.

Оператор Ifпростой оператор, он пишется в одной строке, если нет символа переноса. Оператор If представляет собой случай простейшего ветвления – выполнение одного действия по условию. Этот оператор имеет вид:

If (логическое выражение) действие

Здесь действие – исполняемый простой оператор, который будет выполнен при условии истинности логического выражения.

Блок-схема оператора If.

Пример:

If (x > 0) write(*,*) ’ x is positive'

Оператор If...then

Оператор применяется, если при выполнении условия нужно выполнить несколько операторов.

[имя:] If (логическое выражение) then

Блок действий

Endif [имя]

Ключевое слово then пишется в той же строке, что и логическое выражение.

Изображение данного оператора на блок-схеме:

Блок действий может содержать произвольное число любых исполняемых операторов (простых и составных), кроме оператора End. Этот блок будет выполняться, если логическое выражение истинно, и не будет выполняться, если оно ложно.

Пример:

Обмен значениями переменных x и y при x < y.

replace: If (x < y) then

t = x

x = y

y = t

Endif replace

Обратите внимание на использование имени оператора.

Оператор If...then...else

Если необходимо выполнить альтернативные действия, конструкция If...then может быть расширена блоком else:

If (логическое выражение) then

Блок true

Else

Блок false

Endif

Внимание! Ключевое слово then пишется в той же строке, что и логическое выражение, ключевое слово else – в отдельной строке. Если нет «блока false», то и else лучше не писать.

Изображение данного оператора на блок-схеме:

В такой конструкции при выполнении условия, заданного логическим выражением, выполняется Блок true, если условие не выполняется – Блок false.

Пример:

If (x>=0) then

y = sqrt(x)

Write(*,*) ’x= ’, x, ’ y= ’, y

Else

Write(*,*) ’x= ’, x, ’ x<0, y не определен’

Endif

Оператор If с тремя и более блоками

В наиболее полной форме оператор If...then...else может содержать несколько блоков альтернативных действий, добавляемых конструкцией elseif...then:

If (логическое выражение 1) then

Блок if

Elseif (логическое выражение 2) then

Блок elseif2

Elseif (логическое выражение 3) then

Блок elseif3

Else

Блок default! выполняется при невыполнении всех условий

Endif

Ключевое слово Elseif, логическое выражение и слово then пишутся в одной строке. Это один составной оператор, и завершающий Endif тоже только один.

Ветвей Elseif...then в операторе может быть несколько, ветвь Else может отсутствовать.

Изображение такой конструкции на блок-схеме:

Оператор выполняется следующим образом: последовательно проверяются логические выражения в скобках, пока не будет найдено истинное. Тогда проверка прекратится, и будет выполнен соответствующий блок, а затем управление будет передано оператору Endif. Если среди всех условий нет ни одного истинного, выполнится Блок default. Если же в этой ситуации ветвь Else отсутствует, не будет выполнено никаких действий.

Это наиболее общая форма структурного оператора If. Очевидно, что оператор If...then...else с двумя блоками является ее частным случаем и может быть получен удалением ветвей Elseif. Если, кроме того, удалить ветвь Else, то в операторе If останется только один блок.

Пример 1

If (x > 0) then

Write( *,*) 'x > 0'; y = sqrt(x)

Elseif (x < 0) then

Write( *,*) 'x < 0'

Elseif (x == 0) then

Write( *,*) 'x = 0’; y = 0

Else

Write( *,*) 'Так не бывает'

Endif

Попробуем реализовать ту же конструкцию, используя встроенные операторы If

Пример 2

A1: If (x > 0) then

Write( *,*)'x > 0'; y = sqrt(x)

Else

A2: If (x < 0) then

Write( *,*)'x < 0'

Else

A3: If (x == 0) then

Write( *,*)'x = 0’; y = 0

Else

Write( *,*)'Так не бывает'

Endif A3

Endif A2

Endif A1

Легко убедиться в лаконичности и наглядности многоблочного оператора If.

На примере 2 хорошо видно, почему каждый блок, встроенный в некую конструкцию, рекомендуется сдвинуть вправо на несколько позиций. Это хороший стиль программирования. Текст визуально становится более легким для чтения.

Если в программе несколько операторов If, можно дать имя каждому из них. Имя оператора является необязательным, но если оно указано в его заголовке, то становится обязательным для завершающей строки оператора. Применение имен операторов А1, А2, А3 также продемонстрировано на примере 2.

Переключатель Select

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

В общем виде конструкция выглядит так:

Select case (выражение)

Case (множество значений 1)

Блок case1

Case (множество значений 2)

Блок case2

...

Case Default

Блок default

End select

Блок-схема оператора select:

В круглые скобки после ключевого слова Case помещаются списки непересекающихся значений и интервалов, поэтому выполнение оператора – это выполнение не более одного блока Case. Если значения выражения не принадлежит ни одному из указанных множеств, то выполняется блок default,

Пример (переменной Range присваивается значение в зависимости от значения абсолютной величины переменной Number):

Integer:: Number, Range

Select case (abs(Number))

Case (-5:-3, 6:9)

Range = 1

Case (-2:2)

Range = 2

Case (3, 5)

Range = 3

Case (4)

Range = 4

Case Default

Range = 10

End select

Безусловный переход GoTo

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

Оператор имеет вид:

GoTo метка

Здесь метка – целое число без знака, состоящее не более, чем из 5 цифр.

Предупреждение. Если Вы все-таки решите использовать оператор GoTo, то имейте в виду, что оператор без метки, следующий за GoTo, никогда не получит управления.

Операторы Stop и Return

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

Оператор Stop имеет вид:

Stop символьная строка

При выполнении этого оператора выполнение приложения прекращается, на экран монитора выводится символьная строка, записанная в операторе. Строка в операторе Stop может отсутствовать.

Пример. Использование оператора Stop во избежание деления на 0 или очень маленькое число.

If (abs(B)<1.E-8) Stop ‘значение В слишком мало’

С=A/B

Деления на 0 не произойдет, так как приложение закроется раньше.

Оператор Stop всегда прерывает работу приложения, независимо от того, используется он в главной программе или в подпрограмме.

Оператор End служит для компилятора признаком завершения текста программы или подпрограммы. Поэтому оператор End всегда должен быть последним оператором в тексте программы или подпрограммы.

Оператор Return, в отличие от Stop, используется только в подпрограммах. Его выполнение завершает работу подпрограммы и передает управление в вызывающую программу.

Операторы цикла

Циклом называется многократное исполнение одной и той же последовательности операций до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла). Один проход цикла называется итерацией.

Изображение цикла на блок-схеме:

Для организации циклов в Фортране используется оператор цикла Do.

Общее представление всех разновидностей конструкции Do:

[ имя:] заголовок цикла

Тело цикла

Enddo [ имя ]

Имеется три разновидности циклов в Фортране:

− цикл по переменной (с фиксированным числом повторений).

− Цикл Do while (цикл по условию).

− бесконечный цикл.

Общие правила для всех разновидностей оператора цикла:

1) Вход в тело цикла разрешается только через заголовок цикла.

2) Тело цикла может содержать вложенные простые и составные операторы, операторы цикла могут быть вложенными в другие блоки. Пересечение блоков не разрешается: блок, начавшийся внутри другого блока, в этом же внешнем блоке должен и закончиться. Соблюдение этого правила упрощается, если программа написана «лесенкой».

Пример. В теле цикла содержится оператор If.

Неправильно Правильно
Do k=1,10 If (k<5) then Write(*,*) ‘<5’ Else Enddo Write(*,*) ‘>=5’ endif Do k=1,10 If (k<5) then Write(*,*) ‘<5’ Else Write(*,*) ‘>=5’ endif Enddo

3) В циклах, и только в них, можно использовать операторы Exit и Cycle, изменяющие порядок следования операторов.

4) Как любому составному оператору, циклу можно давать имя. Имя является необязательным, но если оно указано в заголовке цикла, то становится обязательным для завершающего End do.

Операторы Exit и Cycle

Оператор Exit прекращает выполнение цикла. Управление передается первому выполняемому оператору, непосредственно следующему за циклом.

В общем виде оператор Exit имеет атрибут имя цикла:

Exit [ имя цикла ]

Присутствующее имя указывает, из какого именно цикланужно выйти. Если имени нет, выход осуществляется из текущего цикла (самого внутреннего или единственного, если нет вложенности).

Оператор Cycle передает управление на начало цикла. При этом операторы, расположенные между Cycle и End do, не выполняются.

Cycle [ имя цикла ]

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

Если имя цикла отсутствует, то оператор Cycle обеспечивает переход к следующей итерации текущего цикла.

Примеры на применение операторов Exit и Cycle будут рассмотрены при рассмотрении операторов цикла.

Цикл по переменной

Цикл по переменной обеспечивает изменение значения целой переменной в заданных пределах и с заданным шагом. Для каждого значения переменной цикла выполняется блок операторов, называемый телом цикла.

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

[ имя:] Do переменная = начальное значение, конечное значение, шаг

Тело цикла

End do [ имя ]

Перепишем этот оператор, введя обозначения для используемых значений:

Do x = xn, xk, step

Тело цикла

End do

x – целая или вещественная переменная, называемая переменной цикла.

xn, xk – числовые выражения, задающие диапазон изменения x.

step – числовое выражение, задающее шаг изменения x. Если параметр step отсутствует, то он принимается равным 1.

Изображение цикла по переменной на блок-схеме:

Количество повторений цикла по переменной

Цикл по переменной называют также циклом с фиксированным числом повторений. Количество повторений рассчитывается компилятором по формуле:

или

Внимание! Из формулы видно, что шаг изменения переменной цикла step не может быть равен 0. Можно получить сообщение об ошибке выполнения «Деление на 0», даже если в программе нет ни одной операции деления.

В формуле использованы функции:

Int – функция, определяющая целую часть своего единственного аргумента. В этой формуле аргументом функции Int является арифметическое выражение во внутренних скобках.

Max – функция, выбирающая максимальное значение среди своих аргументов. В этой формуле у функции Max два аргумента: 0 (ноль) и результат вычисления функции Int. Если второй аргумент – положительный, то он и есть число повторений цикла, если отрицательный, то kp = 0, и цикл не выполнится ни разу.

Примеры вычисления количества повторений цикла по переменной.

1) do X = 1.25, 8.7, 1.1

(xk – xn + step) / step = (8.7 – 1.25 + 1.1) / 1.1 = 8.55 / 1.1 = 7.77

Int (7.77) = 7; Max (0, 7) = 7; Ответ: kp = 7

2) do k = 2, -4, 0.33

(xk – xn + step) / step = (–4 – 2 + 0.33) / 0.33 = –5.67 / 0.33 = –17.2

Int (-17.2) = –17; Max (0, –17) = 0; Ответ: kp = 0

3) do x = 1, 3, -0.33

(xk – xn + step) / step = (3 – 1 – 0.33) / (–0.33) = –0.67 / 0.33 = –2.0

Int (–2.0) = –2; Max (0, –2) = 0; Ответ: kp = 0

Из примеров видно, что цикл не выполнится ни разу, то есть kp=0, если

или

Поделиться:





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



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