Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Farionova_Fortran

.pdf
Скачиваний:
18
Добавлен:
15.02.2015
Размер:
2.71 Mб
Скачать

Тема2. Базоваяуправляющаяструктура"ветвление" ...

2.2. Оператор варианта (выбора) case

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

жественный выбор (количество ветвей вычислительного процесса бо-

 

 

 

 

 

 

 

лее двух). Схема алгоритма та-

 

 

 

 

expr

 

 

кого вычислительного процесса

value1

 

default

приведена на рис. 2.4.

value2

 

 

 

 

 

 

 

 

 

 

...

 

 

 

block1

block2

 

 

block

 

Рис. 2.4. Схемаалгоритмареализации оператора выбора case

Программная реализация оператора выбора case:

[name:] SELECT CASE (expr)

[CASE (case-value [, case-value] ...) [name] block] ...

[CASE DEFAULT [name] block]

END SELECT [name]

Здесь expr – скалярное выражение типа integer, logical, character; case-value – одно или более скалярных integer, logical, character инициа-

лизирующих выражений. Каждое case-value должно быть того же типа, что и expr.

Если есть CASE DEFAULT и ни одно совпадение не найдено, выполняется блок в CASE DEFAULT.

Сравним:

If (a==0) then

Select case (a)

Print *,1

Case (0)

else

Print *,1

if (a==2) then

Case (2)

Print *,2

Print *,2

Else

Case (3)

if (a==3) then

Print *,3

Print *,3

Case default

else

Print *,4

Print *,4

End select

endif

 

22

2.3. Оператор безусловного перехода goto

2.3. Оператор безусловного перехода goto

Операторы исполняются в том порядке, в котором они записаны впрограмме. Любойисполняемыйоператоринеисполняемыйоператор format могут быть помечены уникальными метками из диапазона от 1 до 99999. Используя оператор безусловного перехода goto m, можно перейти к выполняемому оператору, помеченному меткой m (метка пишется в пяти первых позициях строки в фиксированной форме, либо за меткойчерезпробелследуетоператорвсвободнойформе). Любуюпрограмму можно переписать без операторов goto. Так и рекомендуется писать программы, чтобы не попасть ошибочно внутрь составного оператора или на format.

23

Да Условие продолжения
цикла
Нет
Рис. 3.1. Схема алгоритмациклическойструктуры
Модификация переменной цикла
Тело цикла
Подготовка цикла

Тема 3. Базовая управляющая конструкция "цикл".

Циклические вычислительные процессы. ОператорыциклаязыкаФортран

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

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

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

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

Модификация – это изменение значений переменных цикла перед каждым новым повторение цикла.

Условие продолжения цикла (команда пере-

хода) состоит в проверке необходимости продол-

жения или окончания цикла, т. е. определении, сколькоразнужновыполнитьтелоцикла.

Существует несколько видов цикла: с предусловием, спостусловиемиспараметром. Онираз- личаютсяместоположениемиусловиемвыходаиз

него.

РаботувсехвидовоператоровциклавФортране рассмотрим на примере задачи отабулировании функции. Табулирование – представление функциивтабличномвиде, гдеопределеннымзначениям х соответствуют y, принадлежащие функции. Обычно выполняется для значений х из определенногопромежутка. Заранееизвестнолибоколичество точек, в которых нужно найти значение

24

3.1. Оператор цикла do (бесконечный цикл)

функции, либо расстояние между двумя соседними (шаг табулирова-

ния) – рис. 3.2.

Необходимо найти значение функции yi

= f(xi) на заданном проме-

жутке [a; b] для определенного количества точек, где каждое последу-

ющее значение xi

отличается от

у

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f(x)

предыдущегонашагтабулированияdx.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пусть f(x) = x2,

a = –2, b = 2,

 

 

 

)

 

 

 

 

 

 

 

 

 

 

f(b)

 

dx = 1.

 

(a)

1

 

 

)

 

 

 

 

 

 

 

 

 

 

fx(

2

 

 

 

 

 

 

 

 

 

 

= f

=

 

 

=f(x

...

 

 

=

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

0

 

 

у

 

 

п

 

Рис. 3.2. Графическоепредставление

у

dx

 

 

2

 

 

 

 

 

 

 

у

 

 

x

у

 

 

 

 

 

 

 

задачитабулированияфункции

х0

= a

 

1

 

 

2

 

 

 

хп

 

= b

 

х

х

...

 

 

3.1. Оператор цикла do (бесконечный цикл)

Синтаксис оператора do бесконечного цикла имеет следующий

вид:

do

[операторы] end do

Вданномслучаеотсутствуетусловиевыходаизцикла, поэтому[операторы] в теле цикла будут выполняться бесконечно.

Выходизциклавозможен, есливвестиусловие, приистинностикотороговыполняетсяоператорпринудительноговыходаизциклаBreak:

do

[операторы]

If (logical_expr) then Break

endif end do

Схемаалгоритматакойконструкцииприведенана

 

Операторы

рис. 3.3.

 

 

Рис. 3.3. Схемаалгоритмаконструкции

Нет Logical

 

expr

оператора цикла do с прерыванием

 

 

Да

25

Тема3. Базоваяуправляющаяконструкция"цикл" ...

Использованиерассмотреннойконструкцииоператорацикладлярешения задачи табулирования функции f(x) = x2 показано на рис. 3.4.

 

 

 

X=a

 

 

 

х = а

 

 

 

 

Do

Рис. 3.4. Схемаблок-алгоритма

 

 

 

Y=x**2

 

 

 

 

 

 

решениязадачитабулирования

 

 

 

X=x+dx

 

 

у = х2;

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

 

 

х = х + dx

If (x>b) then

 

 

с прерыванием

 

 

 

Break

Нет

 

 

 

х > а

Endif

 

 

 

 

 

 

Да

enddo

 

Первоначально (на этапе подготовки цикла) x = a. После входа в цикл в точке x = a вычисляется соответствующее значение y. Далее вычисляетсяследующеезначениеx = x + dx (модификацияцикла). Проверяемусловиепрерыванияx > b. Еслиононевыполняется, топроисходит возврат на начало тела цикла и тело цикла повторяется. И так до тех пор, пока выражение x > b не примет значение "истина", после чего происходитвыходизцикла.

Условие ставится внутри тела цикла, но после блока операторов. Поэтому такой вид цикла do можно назвать циклом с постусловием.

3.2.Оператор цикла do со счетчиком (или с параметром)

Схема алгоритма конструкции оператора цикла do со счетчиком

Подготовка цикла

 

v = expr1, exp

 

v = expr1,

 

[expr3]

Нет

expr2 [expr3]

Да

 

Операторы

 

Рис. 3.5. Схемаалгоритма

конструкциициклаdo

со счетчиком

 

26

 

приведена на рис. 3.5.

Синтаксис оператора цикла do с параметром имеет следующий вид:

do v=expr1,expr2,expr3

[операторы] end do

Здесь v – параметр (переменная) цикла; expr1 – начальноезначение параметра цикла; expr2 – конечное значение параметра цикла; expr3 – шаг изменения параметра цикла (может быть не указан). Тогда по умолчанию он считается равным 1.

3.2. Оператор цикла do со счетчиком (или с параметром)

Переменная в операторе do – предпочтительна целая, но допускается вещественная или вещественная двойной точности. Начало, конец и шаг (expr1, expr2, expr3) – выражения одного типа: целого, вещественного или вещественного двойной точности. Конструкция do выполняетсяпоэтапно.

Сначала выполняются все необходимые начальные установки:

вычисляются выражения, определяющие expr1, expr2, expr3,

иполученные значения преобразуются к типу переменной цикла v;

переменной v присваивается значение начало (expr1);

устанавливается счетчик числа повторений цикла, число повторений цикла – целое, неотрицательное, вычисляется по формуле

N = max(0, int[(expr2 – expr1+expr3)/expr3].

Здесь функция int(…) вычисляет целую часть частного, причем N = 0 в случаях:

если expr1>expr2 и expr3>0; если expr2>expr1 и expr3<0.

Значение выражения expr3, определяющего шаг, должно удовлетворять следующим требованиям:

шаг не может быть равен нулю;

если шаг опущен, то он подразумевается равным единице;

expr3>0 подразумевает возрастание переменной цикла (v);

expr3<0 подразумевает убывание переменной цикла (v). Посленачальныхустановокначинаетсявыполнениецикла. Проверяется значение N – счетчика числа повторений:

1) если N = 0, цикл завершается;

2) если N ≠ 0, выполняются [операторы]; 3) N = N–1, v = v+expr3. Переход к п. 1.

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

переменная v изменяется автоматически самим оператором do, поэтому изменять ее в теле цикла запрещено;

цикл нормально завершается по достижении N = 0;

оператор CYCLE, встретившийся в теле цикла, прерывает выполнение цикла и вызывает переход к п. 2;

операторEXIT, встретившийсявтелецикла, прерываетциклизавершает его досрочно, сохранив достигнутое значение переменной цик-

ла v.

27

Тема3. Базоваяуправляющаяконструкция"цикл" ...

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

do v=expr1,expr2+expr3/2,expr3

[операторы] end do

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

иexpr1 expr2, циклический процесс выполняется, как минимум, один раз. Выходом из цикла является выполнение условияv > expr2.

Еслишагизмененияпараметрациклаотрицательныйиexpr1 expr2,

циклическийпроцессвыполняется, какминимум, одинраз. Выходомиз цикла является выполнение условия v < expr2.

Решениезадачитабулированияфункциисиспользованиемоператора цикла с параметром будет иметь вид (схема алгоритма показана на рис. 3.6):

expr1 = a expr2 = b expr3 = dx

v = a, b, dx

Нет

Да

у = х2

 

Do v=a,b,dx

Рис. 3.6. Табулирование

Y=x**2

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

enddo

оператора do

3.3. Оператор цикла do while (цикл с предусловием)

expr

Нет

Да

 

Операторы

 

Рис. 3.7. Схемаалгоритма конструкцииоператора цикла do while

Схема алгоритма конструкции оператора цикла do while приведена на рис. 3.7.

Синтаксис оператора цикла do while имеет следующий вид:

do while (logical_expr)

[операторы] enddo

Тело цикла, аналогичное телу цикла спостусловием, будетвыполнятьсядотехпор,

28

3.3. Оператор цикла do while (цикл с предусловием)

 

пока истинно логическое выражение logical_expr. Как только вы-

ражениестановитсяложно, происходитпереходквыполнениюоператоров

после enddo, т. е. величины, входящие в состав логического выраже-

ния, должны изменяться в теле цикла. При этом с каждым изменением

онидолжныстремитьсяктому, чтобылогическоевыражениесталолож-

ным. В противном случае цикл будет бесконечным.

 

Есливтелециклаиспользуются конструкции if, Select case,

то они должны содержаться целиком внутри цикла.

 

Решениезадачиотабулированиифункциисиспользованиеоперато-

рациклаdo while представ-

 

 

 

лено на рис. 3.8.

х = а

 

 

Любой оператор цикла

 

X=a

можетиметьвнутрителацик-

 

Нет

ладругуюциклическуюструк-

хb

Do while (x<=b)

туру. Такаяконструкцияназы-

Да

 

Y=x**2

вается вложенной структу-

у = х2;

 

X=x+dx

рой оператора цикла.

x = x + dx

 

enddo

Рассмотримнесколькопри-

 

 

 

мероврешениязадачсисполь-

Рис. 3.8. Табулированиефункции

зованием циклических струк-

сиспользованиемоператорацикла

тур.

 

do while

Пример 1. Вывести на

 

 

 

 

экран 10 единиц так, чтобы на нечетных позициях стояли отрицатель-

ные, а на четных – положительные:

 

 

Program edenitsa Integer I,p

P=1

Do I,10 P=-p

Write(*,'(i2,&)'), p Enddo

end

Результат работы программы: –1 1 –1 1 –1 1 –1 1 –1 1

29

Тема3. Базоваяуправляющаяконструкция"цикл" ...

Пример 2. Вывести на экран все числа, которые кратны 5 в диапазоне от 10 до 50.

Здесь диапазон удобно использовать как начальное и конечное значения счетчика цикла с параметром с шагом 1, т. е. сами проверяемые значения будут выступать в качестве параметра. Число кратно 5, если делится на него без остатка, т. е. если остаток от деления числа на 5 равен нулю, то оновыводится на экран:

Program kratnost

Integer k !проверяемое число

Do k=10,50

If (mod(k,5) == 0) then Print '(i4,$)', k

Endif Enddo End

Результат:

10 15 20 25 30 35 40 45 50

Пример3. Подсчитатьколичествозначений, удовлетворяющихопределенному условию. Рассматривается на примере предыдущей задачи.

Впрограмме применяется целочисленная переменная-счетчик s. Перед использованием в цикле счетчику присваивается начальное значение, как правило, 0. Эта операция называется обнулением или сбро-

сом счетчика.

Вслучае выполнения условия в теле цикла переменная-счетчик увеличиваетсвоезначениена1. Витогепослевыходаизциклавs будет хранитьсяколичествонайденныхчисел:

Program kratnost_count Integer k, s

S=0 ! переменная счетчик количества найденных чисел

Do k=10,50

If (mod(k,5) == 0) then Print '(i4,$)', k S=s+1

Endif Enddo

Print '(a,i2)', 'Vsego = ', s End

30

3.3. Оператор цикла do while (цикл с предусловием)

Результат:

10 15 20 25 30 35 40 45 50

Vsego = 9

Пример 5. Просуммировать значения чисел от 1 до 10, т. е. найти следующуюсумму: 1+2+3+…+10.

Program summa Integer k, s

S=0 ! переменная, накапливающая сумму

Do k=1,10

S=s+k Enddo

Print '(a,i2)', 'Vsego = ', s End

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

Если рассмотреть работу цикла пошагово, то значения в перемен-

ной s будут меняться следующим образом:

 

 

 

 

 

 

 

 

Перед началом цикла s=0;

 

 

 

 

 

 

 

 

 

 

 

 

приk=1

s=0+1=1;

 

 

 

 

 

 

 

 

 

 

 

 

приk=2

s=1+2=3;

 

 

 

 

 

 

 

 

 

 

 

 

приk=3

s=3+3=6;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

приk=9

s=36+9=45;

 

 

 

 

 

 

 

 

 

 

 

 

приk=10

s=45+10=55.

 

 

 

 

 

 

 

 

 

 

 

 

Результат:

 

 

 

 

 

 

 

 

 

 

 

 

 

Vsego = 55

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример 6. Найти сумму ряда

1

+

1

 

+

 

1

+

 

1

+ ...

с точностью

2

5

 

10

17

 

 

 

 

 

 

 

 

0,001. Здесь количество повторений заранее не известно. Суммировать элементы ряда до тех пор, пока с добавлением последующего элемента сумма не будет увеличиваться больше чем на 0,001. Как видно, каждый элемент ряда меньше предыдущего. Значит, суммировать надо до тех пор, пока прибавляемый элемент не станет меньше 0,001. Чтобы нало-

31

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]