6 S=SQRT (p*(p-a)*(p-b)*(p-c))
WRITE (*,7) S
7 FORMAT (1x, ' Площадь треугольника равна ', F6.3)
GO TO 14
8 WRITE (*,*) ' Площадь треугольника равна нулю '
GO TO 14
9 WRITE (*,*) ' Такой треугольник не существует '
14 END
Конструкция SELECT CASE
Для ситуаций, где имеется несколько (три и более) альтернатив, применяется оператор SELECT CASE. Этот оператор реализует многовариантное ветвление, называется оператором выбора.
Общая форма конструкции SELECT CASE:
SELECT CASE (выражение)
CASE (множество значений 1)
операторы 1
CASE (множество значений 2)
операторы 2
… …
CASE (множество значений n)
операторы n
CASE DEFAULT
операторы
END SELECT
После слов SELECT CASE находится заключенное в круглые скобки выражение, называемое селектором оператора SELECT. Значение селектора может оказаться в одном из списков значений, находящихся в круглых скобках после слов CASE. Ветвь CASE DEFAULT отвечает всем не перечисленным в списках значениям выражения. При выполнении оператора SELECT вначале вычисляется значение селектора. Затем выбирается тот список значений, которому принадлежит полученное значение, и выполняются соответствующие операторы.
Пример конструкции SELECT CASE. Пусть необходимо преобразовать целое число N в зависимости от величины остатка от его деления на 17 следующим образом:
1) если остаток 0, то N=0;
2) если остаток 1 или 6, то N= - N;
3) если остаток 2,3 или 5, то N=2*N;
4) если остаток 4, то N=3*N;
5) во всех прочих случаях N=5*N.
Программа на языке Фортран (частично):
SELECT CASE (MOD (N, 17))
CASE (0)
N=0
CASE (1, 6)
N= -N
CASE (2, 3, 5)
N= 2*N
CASE (4)
N= 3*N
CASE DEFAULT
N= 5*N
END SELECT
В данном примере селектором является выражение MOD (N, 17). Это встроенная функция, которая вычисляет значение остатка от деления первого аргумента на второй. Кроме того, имеется 4 списка значений и ветвь DEFAULT.
Операторы цикла
Цикл является типичной структурой алгоритмов, реализуемых на компьютере. Для организации циклов в алгоритмических языках предусмотрены специальные операторы.
Оператор цикла DO
Оператор цикла DO может быть представлен в одной из следующих форм:
1 форма:
DO <переменная>=<начальное значение> , <конечное значение> , <шаг>
<операторы>
END DO
2 форма:
DO <метка> <переменная>=<нач. значение> , <кон. значение> , <шаг>
<операторы>
<метка> CONTINUE или <оператор>
Если шаг равен 1, то <шаг> можно опустить. Операторы, расположенные между операторами DO и END DO, образуют тело цикла и выполняются многократно. DO является оператором начала цикла, END DO (CONTINUE) – оператор конца цикла.
Выполнение цикла, образованного оператором DO, заключается в следующем: переменной присваивается начальное значение, и она сравнивается с конечным значением. Если значение переменной при положительном шаге не больше (или при отрицательном шаге не меньше) конечного значения, то выполняются операторы тела цикла, и по последнему оператору цикла (например, END DO, CONTINUE) осуществляется возврат к началу цикла. К текущему значению переменной прибавляется шаг (со своим знаком), и снова проверяется условие. Если условие удовлетворяется, то тело цикла выполняется повторно. В противном случае происходит выход из цикла и переход к оператору, следующему за последним оператором цикла. Так как первая проверка условия выхода из цикла осуществляется до первого выполнения тела цикла, то возможна ситуация, когда тело цикла не будет выполнено ни разу.
Примечания:
1) после окончания цикла переменная цикла сохраняет всегда значение большее, чем конечное значение цикла;
2) в случае выхода из цикла до его завершения переменная сохранит свое текущее значение.
Пример оператора цикла DO:
DO J = 2 , 20 , 2
PRINT *, J, J*J
END DO
В приведенном примере переменная J принимает значения 2, 4, 6, 8, …, 20. В результате выполнения цикла на экран будут выведены значения J и J2.
Используя вторую форму этот цикл можно записать еще двумя способами:
1-ый способ:
DO 10 J = 2 , 20 , 2
PRINT *, J, J*J
10 CONTINUE
2-ой способ:
DO 10 J = 2 , 20 , 2
10 PRINT *, J, J*J
Цикл можно организовать также с помощью оператора условия.
Пример оператора DO с двойным циклом:
do i=1,n
do j=1,n
<операторы>
enddo
enddo
Пример оператора DO с двойным циклом:
do i = 1,N
do j = 1,N
R(j) = R(j) + A(j, i) * B(i)
enddo
enddo
Оператор цикла DO WHILE
Наряду с циклом DO может использоваться оператор цикла DO WHILE. Он также может быть записан двумя формами:
1 форма:
DO WHILE (<условия>)
<операторы>
END DO
2 форма:
DO <метка> WHILE (<условия>)
<операторы>
<метка> <оператор>
Условия в операторе DO WHILE записываются так же как и в логическом операторе условия IF.
Следует обратить внимание на то, что при написании программ следует избегать зацикливания (бесконечного цикла). Для этого необходимо организовывать цикл так, чтобы переменная, входящая в условие цикла, изменяла в нем свое значение.
Пример оператора цикла DO WHILE:
1-ый способ:
J=2
DO WHILE ( J. LE. 20)
WRITE (*,*) J, J*J
J=J+2
END DO
2-ой способ:
J=2
DO 20 WHILE ( J. LE. 20)
WRITE (*,*) J, J*J
20 J=J+2
Оператор остановки STOP
Работа программы может быть остановлена в любом месте. Для этого необходимо использовать оператор STOP. Оператор STOP можно разместить в любом месте программы, он может иметь метку и быть частью условного оператора:
IF (I. GT. 100) STOP
Если оператор STOP имеет сообщение, которое может быть любая текстовая константа или цепочка цифр (от одной до пяти, начальные нули не учитываются), то место остановки может быть идентифицировано этим сообщением.
Примеры записи оператора STOP:
IF (I. EQ. J) STOP ‘Unexpected end of data’
STOP ‘Exit from subroutine ROUTE’
STOP 341
Оператор выхода из цикла EXIT
Для прекращения выполнения некоторого блока цикла программы или экстренного выхода из него служит оператор EXIT.
Пример оператора выхода из цикла EXIT:
INTEGER i
REAL A(100), pr
… … … …
pr = 1.0
DO i = 1, 100
IF ( A(i) .EQ. 0.0 ) EXIT
pr = pr * A(i)
END DO
В приведенном фрагменте программы вычисляется произведение элементов массива (ввод элементов массива опущен). Если хотя бы один элемент равен нулю, то происходит выход из цикла.
Операторы перехода
Оператор бузословного перехода GOTO
Эти операторы используются для быстрого перехода к другим операторам программы.
Общий вид оператора GOTO:
GOTO < метка >
Этот оператор передает управление первому оператору после указанной метки.
Пример оператора безусловного перехода GOTO:
2 READ (*,*) x
PRINT *, x, SIN(x)
GOTO 2
В результате выполнения программа сначала затребует ввод значения x, затем выведет значения x и SIN(x) на экран и после этого вновь вернется к запросу ввода значения x.
Вычисляемый оператор перехода GOTO
Общий вид вычисляемого оператора GOTO:
GOTO (m1, m2, m3,…, mn) <арифметическое выражение>
где m1, m2, m3,…, mn – метки операторов, на которые будет передаваться управление программой; значение арифметического выражения – целое число.
При выполнении оператора сначала вычисляется значение арифметического выражения. Если полученное значение равно 1, осуществляется переход к метке 1; если 2 – то к метке 2 и т. д. Если значение выражения меньше 1 или больше числа указанных меток, то управление передается оператору, следующему за оператором GOTO.
Пример вычисляемого оператора перехода GOTO:
GOTO (4,5,6) К
7 PRINT К
… …
5 PRINT К**2
Если значение К равно 2, то управление будет передано метке 5 (будет выведено значение К2). Если значение выражения меньше 1 или больше 3, то следующим будет выполняться оператор после метки 7 (будет выведено значение К).
Оператор условного перехода IF … GOTO
Для передачи в зависимости от условия используется оператор перехода IF–GOTO, который образуется комбинацией двух операторов – оператора условия IF и оператора безусловного перехода GOTO.
Общая форма записи этого оператора:
IF ( <условие> ) GOTO < метка >
Действие оператора условия заключается в следующем: если условие удовлетворяется, то действие программы передается группе операторов, стоящих после указанной метки.
Пример оператора условного перехода:
J = 2
30 PRINT *, J, J*J
J=J+2
IF ( J <= 20 ) GOTO 30
Работа с массивами
Перед обработкой массивов их следует описать.
Ввод массивов
Предположим, что в программе описаны массивы:
DIMENSION A(10), B(8), C(5,6), D(4,3)
Существуют 3 способа ввода массивов:
Первый способ ввода массивов:
READ (*,*) A
Означает ввести все числовые значения массива А в том количестве, сколько их описано в операторе DIMENSION.
Недостатки:
1) необходимо вводить числа до тех пор, пока массив не заполнится;
2) если вводятся несколько массивов, то сначала полностью заполнится первый массив, затем без предупреждения будут заполняться остальные;
3) программа не начнёт выполняться, пока не будут введены все элементы массивов.
Достоинства:
1) самый простой способ записи ввода массивов;
2) числа с клавиатуры можно вводить: в строчку – через пробел или запятую или нажимая «Enter» после каждого введённого числа.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 |


