Farionova_Fortran
.pdfТема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. Базовая управляющая конструкция "цикл".
Циклические вычислительные процессы. ОператорыциклаязыкаФортран
Циклом называется непрерывная группа последовательных операторов, заканчивающаяся командой перехода (передачи управления) на начало этой части, т. е. основным свойством цикла является многократноевыполнениенекоторойгруппыоператоров. Приэтомкомпьютердолжен выполнить одни и те же действия над разными данными.
Для грамотной реализации любого циклического вычислительного процессанеобходимовыполнитьдействия, представленныеввидеобобщенного алгоритма на рис. 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