Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
327582.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
392 Кб
Скачать
☆
  1. Структура программы. Внешние подпрограммы. Внутренние подпрограммы. Модули.

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

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

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

подзадач, называются программными компонентами; их структура зависит от поручаемых им действий. В Фортране выделены три вида независимых программных компонент: главная программа, внешняя подпрограмма и модуль. Все элементы программы в Фортране сосредоточены внутри программных

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

Главная программа:Главная программа является обязательным компонентом любой программы.

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

[PROGRAM имя_программы]

[операторы описания]

[исполняемые_операторы]

[CONTAINS

внутренние_подпрограммы]

END [PROGRAM [имя_программы]]

Как мы видим, единственным обязательным элементом главной программы является оператор end, все остальные элементы могут отсутствовать. Однако, отличительным признаком главной программы является отсутствие оператора "subroutine" в ее заголовке: именно это характеризует данный компонент как главную программу. Оператор end главной программы не только отмечает конец программного компонента, но и является сигналом к остановке всей программы. Если оператор end содержит имя_программы, то оно должно совпадать с именем, указанным оператором program в заголовке.

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

оператора end. Оператор contains отделяет исполняемые операторы от описания внутренних подпрограмм, внутренние подпрограммы являются еще одной разновидностью программных компонентов Фортрана, однако их нельзя считать самостоятельными программными единицами. Внутренние подпрограммы могут использоваться только тем программным компонентом, в котором

они описаны, извне компонента-носителя они недоступны. Внешние подпрограммы.

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

Заголовок_подпрограммы

[операторы_описания]

[исполняемые_операторы]

[CONTAINS

внутренние_подпрограммы]

END [спецификатор_подпрограммы [ имя__подпрограммы] ]

Здесь Заголовок_подпрограммы имеет вид:

{префикс__спецификатора] спецификатор_подлрограммы имя_подпрограммы

[(список_формальных_параметров)]

где спецификатор_подпрограммы — один из операторов: subroutine или

function; имя_подпрограммы — уникальное имя, удовлетворяющее правилам

фортрана, за которым может следовать необязательный список_формальных_

параметров, заключенный в круглые скобки. Спецификатор подпрограммы

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

не имеет возвращаемого значения: результаты ее работы передаются либо

через формальные параметры, либо через глобальные переменные. Функция

же возвращает значение заданного типа, которое может быть присвоено пе-

ременной или подставлено в выражение. Поэтому префикс_спецификатора

для функций содержит тип возвращаемого значения. Обращение к процедуре осуществляется оператором call, имеющим вид:

CALL имя_подпрограммы [(список_фактических_параметров)],

например,

CALL BIGSUB

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

REAL A, X

REAL, EXTERNAL :: MYFUNC

А = MYFUNC (X)

Оператор end подпрограммы возвращает управление тому программному компоненту, из которого подпрограмма была вызвана. Есть способ сделать это, не дожидаясь конца подпрограммы — оператор return прекратит выполнение подпрограммы в любом ее месте и передаст управление в место вызова. Как и оператор stop, он может иметь метку и быть частью условного оператора. Оператор return не может появляться в главной программе и в подпрограммах-функциях. Если в операторе end указано имя подпрограммы или функции, оно должно совпадать с именем, указанным в заголовке. Пример главной программы с внешней подпрограммой: Пример главной программы с внешней подпрограммой

PROGRAM main

IMPLICIT NONE

REAL X, Y, S

DATA X, Y /0.755545, 6.873452/

CALL outer_sub(X, Y, S)

158 Глава 7

WRITE(*, *) 'Result of outer_sub S =', S

END PROGRAM main

SUBROUTINE outer_sub(A, В, С)

REAL А, В, С

С = SQRT(A**2 + B**2)

END SUBROUTINE outer_sub

1)Внешнии подпрграммы:

program swapab

Integer::a,b

a=5

b=1

call swap(A,b)

print*,'A=',a,'B=',b

end program

subroutine swap(c,d)

Integer::d,c,tmp

tmp=d

d=c

c=tmp

end subroutine

Внутренние подпрограммы

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

Заголовок_подпрограммы

[операторы_описания]

[исполняемые_операторы]

END [спецификатор_подпрограммы [имя_подпрограммы]]

Внутренняя подпрограмма автоматически получает доступ ко всем объектам своего носителя, в том числе, к другим внутренним подпрограммам Все обращения к внутренним подпрограммам могут производиться только из компонента-носителя Пример внутренней подпрограммы в главной программе:

Пример главной программы с внутренней подпрограммой:

PROGRAM main

IMPLICIT NONE

REAL X, Y, S

DATA X, Y /0.755545, 6.873452/

CALL inner_sub(X, Y, S)

WRITE(*, *) 'Result of inner_sub S =', S

CONTAINS

SUBROUTINE inner_Sub(A, В, С)

REAL А, В, С

С = SQRT(A**2 + B**2)

END SUBROUTINE inner_sub

END PROGRAM mam

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

Внутренние подпрограммы:

PROGRAM main

IMPLICIT NONE

REAL X, Y, S

DATA X, Y /0 755545, 6.873452/

CALL inner_sub(X, Y, S)

WRITE(*, *) 'Result of main1's inner_sub S =', S

CALL outer_sub(X, Y, S)

WRITE(*, *) 'Result of outer_sub S =', S

CONTAINS

SUBROUTINE inner_sub(A, В, С)

REAL, PARAMETER :: R = 5.,RR = SQRTE / 2.0)

REAL А, В, С

С = SQRT(A**2 + B**2)

IF (C > R) THEN

IF (A > RR) A = RR

IF(B > RR) В = RR

END IF

END SUBROUTINE inner_sub

END PROGRAM main

SUBROUTINE outer_sub(A, В, С)

REAL А, В, С

REAL S

CALL inner_sub(A, B, S)

WRITE(*, *) 'Result of outer1's inner_sub S =', S

С = SQRT(A**2 + B**2)

CONTAINS

SUBROUTINE inner_sub(A, В, С)

REAL А, В, С

С = SQRT(ABS(A**2 - B**2))

END SUBROUTINE inner_sub

END SUBROUTINE outer_sub

  1. Внутренние подпрограммы:

program swapab

Integer::a,b

a=5

b=1

call swap(A,b)

print*,'A=',a,'B=',b

contains

subroutine swap(c,d)

Integer::d,c,tmp

tmp=d

d=c

c=tmp

end subroutine

end program

  1. МОДУЛИ:

MODULE имя_модуля

[операторы_описания]

[CONTAINS

модуль ные_подпрограммы ]

END [MODULE [имя_модуля]]

MODULE ARRAY

REAL, DIMENSIONB0) :: A

CONTAINS

….

END MODULE ARRAY,

3.Типы данных. Переменные. Константы.

Типы данных.

Количество базовых типов Фортрана невелико, и в этом отношении он уступает другим языкам программирования высокого уровня. Есть возможность определять производные типы.

Встроенными являются числовые типы, логический тип и строковый (символьный): integer; real; complex; logical; character. Здесь integer — это специальное слово обозначающее числовой тип(целые числа). Особенностью целого типа является абсолютно точное представление числового значения. Числовой тип real представляет вещественные значения. Переменные типа real не могут принимать значения, сколь угодно близкие к нулю и слишком большие по абсолютной величине. Вещественный тип используется для хранения (приближенных) дробных значений. Арифметические операции с вещественными и комплексными значениями выполняются приближенно. Тип complex соответствует комплексным значениям и представляет собой,

фактически, множество упорядоченных пар вещественных значений, первое из которых является вещественной частью комплексного числа, а второе — его мнимой частью. Комплексное значение занимает в памяти в два раза больше места, чем вещественное. Диапазон допустимых значений числовых типов в Фортране не стандартизирован, но программист может самостоятельно его определить. Механизм подобных определений основан на концепции разновидности типа. У каж-дого встроенного типа Фортрана есть несколько разновидностей, которые отличаются друг от друга диапазоном значений и физическим размером абстрактной ячейки памяти, соответствующей данному типу. Множество допустимых значений логического типа logical состоит из двух

значений: "истина" и "ложь", которым соответствуют логические константы .true., и .false.

Значение символьного типа character представляет собой строку символов. Длина строкового значения в Фортране может быть произвольной, она задается с помощью параметра len в предложении описания строковой переменной: CHARACTER(LEN =430) :: sss s

Пробел является значимым символом в символьном значении. Длина символьного значения в байтах равна длине строки. Каждому символу в строке соответствует номер. Номера присваиваются последовательно, начиная с 1 для самого левого символа.

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