END

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

<...>= ... <имя>(<список фактических параметров>) ...

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

Пример

REAL FUNCTION MAX(X, Y)

Вызов в основной программе

MAX=X

Z=MAX(A, B)+1

IF(MAX. LT. Y)MAX=Y

Y1=MAX(5,B+5)

RETURN

Y=MAX(MAX(A, B),MAX(C, D))

END

13.5 Подпрограмма-процедура

Описание подпрограммы-процедуры – вся программная единица:

SUBROUTINE <имя>(<список формальных параметров>)

...

RETURN - оператор возврата в вызывающую программу

END

Обращение к подпрограмме-процедуре:

CALL <имя>(<список фактических параметров>) ...

Параметры-значения – исходные данные алгоритма, параметры-переменные – результат.

О соответствии фактических и формальных параметров

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

НЕ нашли? Не то? Что вы ищете?

Формальные параметры:

Фактические параметры:

Переменные

Константы, переменные, выражения

Массив

Массив

Имя внешней процедуры

Имя внешней процедуры

13.6 Операторы EXTERNAL и INTRINSIC

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

SUBROUTINE INT(F, a,b, N,S)

S=0

h=(b-a)/(N-1)

DO 17 i=1,N-1

x=a+(i-1)*h

S=S+h*F(x)

17 CONTINUE

RETURN

END

EXTERNAL F1,cos

CALL INT(F1,0.,1.,11,S1)

CALL INT(cos,0.,1.,11,S2)

WRITE(*,*)S1,S2

STOP

END

INTRINSIC sin, cos

CALL INT(sin,0.,1.,11,S1)

CALL INT(cos,0.,1.,11,S2)

WRITE(*,*)S1,S2

STOP

END

FUNCTION F1(X)

F1 =sin(X)

RETURN

END

FUNCTION cos(X)

cos=1

RETURN

END

Пример (параметр-переменная и параметр-значение)

x=1 {в х действительная единица}

i=1 {в i целочисленная единица}

write(*,*)x, i,1.0,1

call sub(x, i,1.0,1)

write(*,*)x, i,1.0,1

stop

end

subroutine sub(a, b,i, j)

write(*,*)a, b,i, j

a=2

b=2

i=2

j=2

return

end

Результат:

^^^^^^^^^^1.0000000^^^^^^^^^^^^1^^^^^^^^^1.0000000^^^^^^^^^^^^1

^^^^^^^^^^1.0000000^^1.401298E-045^^^^^^^^^^^^^^^1

^^^^^^^^^^2.0000000^^^^^^^^^^^^1.0000000^^^^^^^^^^^^1

Еще пример (нереентерабельность подпрограммы)

subroutine ss

data s/0.0/

s=s+1

write(8,*)s

return

end

call ss

call ss

call ss

stop

end

Результат

1.0000000

2.0000000

3.0000000

Передача массивов

DIMENSION A9100),B(10,10)

READ(*,*)N, M1,M2

...

CALL S1(A, N,...)

CALL S2(B,10,10,M1,M2,...)

...

STOP

END

SUBROUTINE S1(A, N,...)

DIMENSION A(N) /можно А(1)/

SUBROUTINE S2(B, L1,L2,N, M,...)

DIMENSION B(L1,L2)

/достаточно B(L1,1)/

обработка в диап. N, M

Лекция 14

14.1 Файлы

Внешний файл - совокупность однотипных данных (записей) на внешних устройствах.

Форматы записей.

Фиксированной длины

+-----+-----+-----+

Неопределенной длины

----**

* признак конца записи

Переменной длины

о----о-------о

о - описатель длины 4 байта

Блокирование и сегментирование

Блокирование – объединение записей в блоки (для эффективности выполнения операций ввода и вывода на физическом уровне).

Сегментирование – разбиение слишком длинных записей на сегменты (по 128 байт).

14.2 Meтoды дocтупa.

По методам доступа файлы подразделяются на файлы пocлeдoвaтeльнoгo и пpямoгo дocтупa. Файлы прямого доступа могут быть созданы лишь на устройствах прямого доступа (винчестер). Файлы последовательного доступа могут быть созданы на любом устройстве.

Метод доступа задается параметром ACCESS:

ACCESS='SEQUENTIAL' (последовательный доступ – значение по умолчанию)

ACCESS='DIRECT' (прямой доступ)

Записи файла прямого доступа нумеруются по порядку. Зaпиcи имeют oдинaкoвую длину, oпpeдeляeмую пpи oткpытии фaйлa

14.3 Операторы ввода и вывода.

Для передачи данных

READ

ввод данных

WRITE

вывод данных

PRINT

вывод на системное печатающее устройство

Для присоединения и отсоединения

OPEN

открыть

CLOSE

закрыть

Для позиционирования

BACKSPACE

в начало предыдущей записи последовательного доступа

ENDFILE

устанавливает признак конца файла

REWIND

в начало файла последовательного доступа

LOCKING

к записи файла прямого доступа

Остальные

INQUIRE

выдает информацию о свойствах устройства или файла

14.4 Параметры операторов ввода и вывода

FILE

задает имя файла

UNIT

задает идентификатор устройства

ACCESS

определяет метод доступа

FORM

вид записи (форматные, бесформатные)

ERR

управление ошибкой записи

END

управление ситуацией "конец файла"

BLOCKSIZE

устанавливает размер блока

FMT

указывает способ передачи форматных записей

IOSTAT

управление ошибкой В/В

MODE

разрешение чтения, записи, чтения и записи (форма)

STATUS

состояние файла

RECL

длина записи

REC

номер записи

SHARE

задает форму обращения при совместной работе

Открытие (присоединение) файла.

Явное (оператор OPEN)

Неявное (по обращению к операторам ввода и вывода)

Предварительное (по умолчанию)

Отмена присоединения - CLOSE

14.5 Операторы OPEN и CLOSE

OPEN(<список ключевых параметров>)

UNIT= <номер канала> целое число 2 байта

FILE='имя файла'

ACCESS='SEQUENTIAL'/'DIRECT'

FORM='FORMATTED'/'UNFORMATTED'

RECL=<длина записи>

STATUS='NEW'/'OLD'/'KEEP'сохранить/'DELETE'удалить/SCRATCH' временный

ERR=<метка>

IOSTAT=<целочисленная переменная> код ошибки ввода и вывода

CLOSE(<список ключевых параметров>)

UNIT= <номер канала> целое число 2 байта

STATUS= 'KEEP' / 'DELETE'

ERR=<метка>

IOSTAT=<целочисленная переменная>

14.6 Оператор READ

READ([UNIT=]U,

[FMT=] <метка формата, или список спецификаций, или имя списка спецификаций>

[,ERR=<метка>]

[,END=<метка>]

[,IOSTAT=<переменная>] - код ошибки ввода

[,REC=<номер записи>] - номер записи) <список элементов ввода>

Характерные наборы параметров для READ

а). Бесформатный ввод прямого доступа

READ([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]

б). Бесформатный ввод последовательного доступа

READ([UNIT=]...[,ERR=...][,END=...][,IOSTAT=...])[<...>]

в). Форматный ввод прямого доступа

READ([UNIT=]...,[FMT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]

г). Форматный ввод последовательного доступа

READ([UNIT=]...,[FMT=]...[,ERR=...][,END=...][,IOSTAT=...])[<...>]

14.7 Оператор WRITE

Характерные наборы параметров для WRITE

а). Бесформатный вывод в файл прямого доступа

WRITE([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]

б). Бесформатный вывод в файл последовательного доступа

WRITE([UNIT=]...[,ERR=...][,IOSTAT=...])[<...>]

в). Форматный вывод в файл прямого доступа

WRITE([UNIT=]...,[FMT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]

г). Форматный вывод в файл последовательного доступа

WRITE([UNIT=]...,[FMT=]...[,ERR=...][,IOSTAT=...])[<...>]

14.8 Другие операторы

BACKSPACE([UNIT=]...[,ERR=...][,IOSTAT=...]) – на одну запись назад в файле последовательного доступа

REWIND([UNIT=]...[,ERR=...][,IOSTAT=...]) – в начало файла последовательного доступа

ENDFILE([UNIT=]...[,ERR=...][,IOSTAT=...]) – запись признака конца файла в текущую позицию файла последовательного доступа

LOCKING([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...]) – устанавливает текущую позицию на запись с номером, указанным в REC, в файле прямого доступа.

Пример

Распечатать файл на экране

character BUF(79),FNAME*12

1 CONTINUE

WRITE(*,*) ' Введите имя файла'

READ(*,997)FNAME

997 FORMAT(A12)

OPEN(UNIT=15,FILE=FNAME, STATUS='OLD',ERR=2,IOSTAT=IERR)

IF(IERR. EQ.0)GOTO 10

WRITE(*,*)'Ошибка при открытии файла',IERR

GOTO 1

2 CONTINUE

WRITE(*,*)' Нет такого файла',IERR

GOTO 1

10 CONTINUE

READ(15,999,END=19,ERR=18,IOSTAT=IERR)BUF

999 FORMAT(79A1)

WRITE(*,998)BUF

998 FORMAT(' ',79A1)

GOTO 10

18 CONTINUE

WRITE(*,*)'Ошибочка чтения',IERR

GOTO 10

19 CONTINUE

STOP

END

Лекция 15

15.1 Другие средства Фортрана

Оператор COMMON

COMMON X, A(10) block1/C(100)

COMMON Y, I(5),A(5) /block1/I, J,C(98)

COMMON /block1/ C(50),I(50)

Оператор EQUIVALENCE

DIMENSION A(100),B(200)

EQUIVALENCE (X, A(1),B(1)),(B(101),Y)

Межмодульные связи

Два механизма передачи данных между модулями – общие блоки и механизм формальных и фактических параметров.

15.2 BLOCK DATA

Единственная программная единица программы.

Содержит только декларативные операторы описания, COMMON, DATA, EQUIVALENCE.

Служит для инициализации начальных данных.

15.3 Контрольная точка

Сохранение в файле дампа памяти для продолжения счета в случае сбоя системы или оборудования.

OPEN(8,NAME='...',FORM='UNFORMATTED')

READ(*,*)IPR

IF(IPR. EQ.0)THEN

Формирование начального состояния

ELSE

READ(8)<Список переменных и массивов>

ENDIF

...

1 CONTINUE

Тело цикла итерационного процесса (цикл с постусловием)

IF(FLAGPR)THEN

Печать промежуточных результатов

ENDIF

IF(FLAGWR)THEN

REWIND(8)

WRITE(8)<Список переменных и массивов>

ENDIF

IF(.NOT. FLAGEND) GOTO 1

...

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7