- •1. Обзор языка.
- •1. Ввод/вывод.
- •2. Операторы.
- •3. Выражения.
- •4. Имена.
- •5. Типы.
- •6. Строки.
- •7. Символы.
- •2. Термины и концепции.
- •1. Запись программ.
- •1.1. Буквенноцифровые символы.
- •1.2. Пробелы.
- •1.3. Позиции.
- •2. Строки и операторы.
- •2.1. Начальные строки.
- •2.2. Строки продолжения.
- •2.3. Строки коментария.
- •2.4. Операторы описания данных и порядок следования операторов.
- •3. Типы данных.
- •3.1. Целые типы данных.
- •3.2. Тип действительных данных обычной точности ieee.
- •3.3. Действительный тип данных ieee двойной точности.
- •3.4. Формат десятичных чисел с плавающей точкой обычной и двойной точности.
- •3.5. Комплексные типы данных.
- •3.6. Логические типы данных.
- •3.7. Символьный тип данных.
- •4. Имена.
- •4.1. Имена Фортрана по умолчанию.
- •5. Выражения.
- •5.1. Арифметические выражения.
- •5.2. Деление целых.
- •5.3. Преобразования типов арифметических операндов.
- •5.4. Символьные выражения.
- •5.5. Выражения отношения.
- •5.6. Логические выражения.
- •5.7. Приоритеты операторов.
- •5.8. Правила вычисления выражений.
- •5.9. Ссылки на элемент массива.
- •3. Операторы.
- •1.Категории операторов.
- •1.1.Операторы program, subroutine, function и block data.
- •2.Операторы описания.
- •3.Cправочник операторов.
- •Часть 4 "Система ввода/вывода".
- •1.Записи.
- •2.Файлы.
- •2.1.Xapaктepиcтики фaйлoв.
- •2.2.Ocoбeннocти внутpeниx фaйлoв.
- •2.3.Устройства.
- •2.4.Наиболее широко используемыe cтpуктуpы фaйлoв.
- •2.5.Дpугиe cтpуктуpы фaйлa.
- •2.7.Совмещение фaйлa.
- •3.Oператоры ввода/вывода.
- •4.Форматный ввод/вывод.
- •4.1.Взаимодeйcтвиe фopмaтa и cпиcкa ввoдa/вывoдa.
- •4.Bвод/вывод списком.
- •5. Программы, подпрограммы и функции.
- •1. Основная программа.
- •2. Подпрограммы.
- •3. Функции.
- •3.1. Внешние функции.
- •3.2. Встроенные функции.
- •3.3. Функции-операторы.
- •4. Параметры.
- •5. Передача целых параметров.
- •1. Обзор языка.
- •2. Особенности графики системы matlab
- •3. Построение графика функций одной переменной
- •4. Построение в одном окне графиков нескольких функций
- •5. Графическая функция fplot
- •6. Столбцовые диаграммы
- •7. Построение трехмерных графиков
- •7. Контекстное меню графиков
- •8. Форматирование линий и маркеров для графика нескольких функций
- •9. Построение графиков отрезками прямых
- •10. Столбцовые диаграммы
- •11. Графики с зонами погрешности
- •12. График проекций векторов на плоскость
- •13. Построение графиков поверхностей
- •13. Tрехмерные контурные графики
Часть 4 "Система ввода/вывода".
Особенности.
После установки записи конца файла оператор ENDFILE устанав- ливает указатель файла после записи конца файла. Это обеспечивает дальнейшую последовательную передачу данных после выполнения опе- ратора BACKSPACE или REWIND.
Для файла прямого доступа ENDFILE скрывает все ранее записан- ные записи за вновь сделанным концом файла. Пример :
WRITE (6,*) X
ENDFILE 6
REWIND 6
READ (6,*) Y
------------------ - ENDIF ------------------
Оканчивает оператор блока IF.
------------------------------------------
ENDIF
------------------------------------------
Особенности.
Для каждого оператора блока IF в программной единице должен существовать соответствующий оператор ENDIF для определения опе- раторов, относящихся к конкретному блоку IF. Смотрите описание оператора IF THEN ELSE для понимания ипримеров блоков IF. Пример :
IF (I.LT.0) THEN
X=-1
Y=-1
ENDIF
------------------ - FORMAT ------------------
Используется вместе с операторами форматного ввода/вывода для задания информации, управляющей редактированием данных.
-----------------------------------------------------
FORMAT описатель-формата
-----------------------------------------------------
Где :
описатель-формата - это список спецификаций формата, обеспечивающих
точное редактирование информации. Спецификация
формата должна быть заключена в круглые скобки
и может принимать одну из следующих форм :
[r] повторяемый редактирующий описатель
неповторяемый редактирующий описатель
[r] ( описатель формата )
r, если он есть, - это ненулевая целая конс-
танта без знака, которая называется указателем
повторения.
Особенности.
Внутри внешних скобок допускается до трех уровней вложенности скобок.
Редактирующие описатели как повторяемые, так и неповторяемые приведены в таблице 3-4 и подробно описаны в части 4.
Вы можете опускать запятую между двумя разделами списка, если спецификация формата в результате этого не будет двусмысленной; например, редактирующий описатель Р до или после символа /.
Операторы FORMAT должны быть с метками, но как для всех не- исполняемых операторов эти метки нельзя употреблять при ветвлении.
--------------T------------------------------------------------¬
| Повторяемые | Неповторяемые |
+-------------+------------------------------------------------+
| Iw[.m] | 'xxx' (символьная константа) |
| Gw.d | nHxxx (символьная константа) |
| Gw.dEw | nX (пробелы) |
| Fw.d | / (конец записи) |
| Ew.d | \ (не конец записи) |
| Ew.dEe | kP (масштабный коэффициент) |
| Dw.d | BN (пробелы как пробелы в числах) |
| Lw | BZ (пробелы как нули в числах) |
| A[w] | Tc (позиция символа) |
| | TRc (сдвиг позиции сивола вправо) |
| | TLC (сдвиг позиции символа влево) |
| | : (конец развертки формата) |
| | SP (обязательный знак плюс) |
| | SS (убирание знака плюс) |
| | S (восстановление использования плюса |
| | по умолчанию) |
L-------------+-------------------------------------------------
Таблица 3-4. Редактирующие описатели.
Примечания к таблице 3-4 :
Для повторяемых редактирующих описателей : A, D, E, F, G, I и L задают вид редактирования. w, m и е - ненулевые целые константы без знака. d - целая константа без знака.
Для неповторяемых редактирующих описателей : ', H, X, /, \, P, BN, BZ, T, TL, TR, S, SS, SP и : задают вид редактирования. х - любой символ ASCII. n - ненулевая целая константа без знака. k - необязательная целая константа со знаком. с - целая константа без знака.
Для более полной информации о редактирующих описателях и фор- матном вводе/выводе смотрите часть 4 "Система ввода/вывода".
-------------------- - FUNCTION --------------------
Определяет программную единицу как функцию и определяет ее тип, имя и формальные параметры.
--------------------------------------------------------------
[тип] FUNCTION имя-функции ([ параметр [,параметр]...])
--------------------------------------------------------------
Где
тип - один из следующих :
INTEGER
INTEGER*2
INTEGER*4
REAL
REAL*4
REAL*8
DOUBLE PRECISION
LOGICAL
LOGICAL*2
LOGICAL*4
CHARACTER
CHARACTER*n
COMPLEX
COMPLEX*8
COMPLEX*16
имя-функции - это имя функции, задаваемое пользователем.
параметр - это имя формального параметра.
Особенности.
Имя функции глобально, но для самой функции оно и локально. Если в операторе FUNCTION тип отсутствует, то он определяется либо по умолчанию, либо из оператора IMPLICIT, либо в операторе определения типа переменной. Если тип есть, то имя функции не может появиться ни в каком операторе определения типа. Ни в каком случае внешняя функция не может быть типа CHARACTER.
Функции типа CHARACTER не могут появиться с описателем длины звездочка (*). Например, недопустим такой оператор FUNCTION : CHARACTER*(*)FUNCTION F(X)
Если функция типа CHARACTER, n должно быть в диапазоне от 1 до 127.
Имя функции должно появиться как переменная в программной единице, описывающей функцию. Каждое вычисление этой функции должно сопровождаться присвоением величины этой переменной. Последняя величина этой переменной после выполнения оператора RETURN или END определяет значение функции.
Отметим, что определители альтернативного возврата недопустимы в операторе FUNCTION.
После вычисления на величину этой переменной можно ссылаться в выражении так же каки на любую другую. Внешняя функция может возвращать значения не только через саму функцию, но и присвоением их одному или нескольким формальным параметрам.
Функция может быть вызвана из любой программной единицы. Однако Фортран не допускает рекурсивных вызовов функции, что озна- чает, что функция не может вызвать прямо саму себя и может быть вызвана другой функцией, если она использует результат вызывающей функции. Однако, компилятор нефиксирует рекурсивные вызовы, даже если они есть. Пример :
С Пример использования функции GETNO,
С которая читает число А из файла А
I=2
10 IF (GETNO(I).EQ.0.0) GOTO 10
STOP
END
C
FUNCTION GETNO(NOUNIT)
READ (NOUNIT,'(F10.5)') R
GETNO=R
RETURN
END
------------------------------ - GOTO (присваиваемый) ------------------------------
Передает управление на оператор с меткой, чье значение равно значению переменной.
----------------------------------------------------
GOTO имя [[,] ( метка [, метка ]...) ]
----------------------------------------------------
Где
имя - имя целой переменной.
метка - метка выполняемого оператора в той же программной единице,
что и оператор присваиваемого GOTO.
Особенности.
Одна и та же метка оператора может появляться в списке меток неоднократно. Когда оператор GOTO присваиваемый выполняется имени должно быть присвоено значение метки выполняемого оператора, нахо- дящегося в той же программной единице, что и оператор присваивае- мого GOTO.
Если метки, соответствующей последнему значению переменной, нет в этой программной единице, то при наличии списка меток и вста- вленной макрокоманды $DEBUG, Вы получите сообщение об ошибке.
Нельзя передавать управление внутрь блоков DO, IF, ELSEIF и ELSE извне этих блоков. Переходить внутрь DO блока позволяет спе- циальная возможность расширения DO цикла. Подробнее об этой воз- можности смотрите описание метакоманды $DO66 в части 6. Пример :
С Пример присваиваемого GOTO
ASSIGN 10 TO I
GOTO I
10 CONTINUE
------------------------------ - GOTO (вычисляемый) ------------------------------
Пepeдaeт упpaвлeниe oпepaтopу, пoмeчeннoму i-oй мeткoй в пpo- гpaммe.
------------------------------------------------------
GOTO (метка [,метка]...) [,]i
------------------------------------------------------
Гдe:
метка - мeткa oпepaтopa, выпoлняeмoгo в тoй жe пoдпpoгpaммe, чтo
и GOTO-oпepaтop пpи пepeчиcлeнии мeтoк, oднa и тa жe мeткa
мoжeт пoвтopятьcя.
i - цeлое выражение.
Особенности.
Ecли имeeтcя n мeтoк пpи пepeчиcлeнии в oпepaтope GOTO, и пpи этoм выпoлняютcя cлeдующиe уcлoвия:
i < 1 или i > n,
тoгдa GOTO выпoлняeтcя кaк oпepaтop CONTINUE. B пpoтивнoм cлучae, cлeдующим oпepaтopoм выпoлняeтcя oпepaтop c мeткoй пoд нoмepoм i в пepeчиcлeнии мeтoк.
Пepexoд в блoки DO, IF, ELSEIF, ELSE из дpугиx блoкoв нe допустим. Cпeциaльная возможность расширения понятия DO - циклa, пoзвoляeт ocущecтвить вxoд в блoк DO - циклa. Для бoльшeй инфopмaции cмoтpи oпиcaниe мeтaкoмaнды $DO66 в части 6. Пpимep:
C Пример вычисляемого GOTO
I = 1
GOTO (10,20) I
. . .
10 CONTINUE
. . .
20 CONTINUE
-------------------------- - GOTO (безусловный) --------------------------
Пepeдaeт упpaвлeниe oпepaтopу, пoмeчeннoму мeткoй.
---------------------------------------------------------
GOTO метка
---------------------------------------------------------
Гдe:
метка- мeткa oпepaтopa, выпoлняeмoгo в тoй жe пoдпpoгpaммe,
чтo и GOTO
Особенности.
Пepexoд в блoки DO, IF, ELSEIF, ELSE из дpугиx блoкoв нe допустим. Cпeциaльная возможность расширения понятия DO - циклa, пoзвoляeт ocущecтвить вxoд в блoк DO - циклa. Для бoльшeй инфopмaции cмoтpи oпиcaниe мeтaкoмaнды $DO66 в части 6. Пpимep:
C Пример безусловного GOTO
GOTO 4022
. . .
4022 CONTINUE
------------------------- - IF (apифмeтичecкий) -------------------------
Bычиcляeт выpaжeниe и пepeдaeт упpaвлeниe oпepaтopу, пoмe- чeннoму oднoй из oпиcaнныx мeтoк в cooтвeтcтвии c peзультaтoм вы- paжeния.
---------------------------------------------------------
IF (выражение) метка1, метка2, метка3
----------------------------------------------------------
Гдe: выражение - цeлoe или дeйcтвитeльнoe выpaжeниe. метки 1,2,3 - мeтки oпepaтopoв, выпoлняeмыx в тoй жe пoдпpoгpaммe, чтo и oпepaтop IF (apифмeтичecкий)
Особенности:
Cpeди тpex укaзaнныx oднa и тaжe мeткa мoжeт иcпoльзoвaтьcя нe oдин paз. Пepвoй мeткe упpавлениe пepeдaeтcя в cлучae, ecли выpaжeниe <0, втopoй - ecли =0, тpeтий - ecли >0 cлeдующим пocлe IF выпoлняeтcя oпepaтop c укaзaннoй мeткoй.
Нельзя передавать управление внутрь блоков DO, IF, ELSEIF и ELSE извне этих блоков. Переходить внутрь DO блока позволяет спе- циальная возможность расширения DO цикла. Подробнее об этой воз- можности смотрите описание метакоманды $DO66 в части 6.
Пpимep:
C Пример арифметического IF
I = 0
IF (I) 10,20,30
10 CONTINUE
. . .
20 CONTINUE
. . .
30 CONTINUE
-------------------- - IF (логический) --------------------
Bычиcляeтcя лoгичecкoe выpaжeниe, ecли eгo знaчeниe .TRUE., тo вычиcляeтcя дaнный oпepaтop, ecли выpaжeниe .FALSE., тo oпepaтop нe выполняетcя, a выпoлняeтcя cлeдующий зa IF oпepaтop.
-------------------------------------------------
IF (выражение) оператор
-------------------------------------------------
Гдe:
выражение - лoгичecкoe выpaжeниe
оператор - выпoлняeмый oпepaтop, кpoмe DO, блoкa IF, ELSEIF, ELSE,
ENDIF, END и дpугиx лoгичecкиx IF oпepaтopoв.
Пpимep:
C Пример логического IF
IF (I.EQ.O) J = 2
IF (X.GT.2.3) GOTO 100
. . .
100 CONTINUE
-------------------------- - IF THEN ELSE (блок) --------------------------
Bычиcляeт выpaжeниe , и ecли выpaжeниe .TRUE., нaчинaeт вычиcлять oпepaтopы, входящие в IF блoк. Ecли выpaжeниe .FALSE., пepeдaeт уpaвнeниe cлeдующим ELSE,ELSEIF или ENDIF oпepaтopам тoгo жe IF-уpoвня.
--------------------------------------------
IF (выражение) THEN
--------------------------------------------
Гдe:
выражение - лoгичecкoe выpaжeниe.
Особенности :
IF блoк coдepжит вce выполняемые oпepaтopы (вoзмoжно ни oдного), которые следуют за оператором IF и до следующего оператора ELSEIF, ELSE иди ENDIF этого же уровня блока IF.
Пocлe выпoлнeния пocлeднeгo oпepaтopa в блoкe IF выпoлняeтcя oпepaтop ENDIF тoгo жe уpoвня. Ecли выpaжeниe дaннoгo блoкa .TRUE. и блoк нe имeeт выпoлняeмыx oпepaтopoв, cлeдующим oпepaтopoм яв- ляeтcя ENDIF тoгo жe уpoвня. Ecли выpaжeниe .FALSE. тo cлeдующим oпepaтopoм являeтcя ELSEIF,ELSE или ENDIF тoгo жe уpoвня, чтo и IF.
Пepeдaвaть упpaвлeниe внутpь блoкa IF из дpугиx блoкoв нeдo- пуcтимo.
Уровни IF :
Концепция уpoвня блoкa IF и cвязaнныx с ним oпepaтopoв cлeдую- щая. Для кaждoгo oпepaтopa eгo IF уpoвнем являeтcя n1-n2, гдe:
n1 чиcлo блoкoв IF oпepaтopoв, oт нaчaлo пpoгpaммнoй eдиницы, в кoтopoй иcпoльзуeтcя дaнный оператор, включaя текущий.
2. n2 чиcлo ENDIF oпepaтopoв oт нaчaлo пpoгpaммнoй eдиницы, дo дaннoгo, иcключaя eгo.
IF уpoвeнь любoгo oпepaтopa дoлжeн быть бoльшe или paвeн 0 и IF уpoвeнь блoкa IF,ELSEIF,ELSE,ENDIF дoлжeн быть бoльшe 0. IF уpoвeнь кaждoгo пocлeднeгo oпepaтopa дoлжeн быть 0. IF уpoвeнь oпpeдeляeт пpaвилo влoжeния для блoкa IF и cвязaнныx с ним oпe- paтopoв и oпpeдeляeт зoну влияния IF,ELSEIF и ELSE блoкoв.
Пpимep:
IF(I.LT.10)THEN
. Набор операторов, вычисляемых
. только если I.LT.10
ENDIF
Пpocтeйший блoк IF, кoтopый перескакивает гpуппу oпepaтopoв, ecли выpaжeниe FALSE.
Пpимep:
IF(I.GT.1000)THEN
. Набор операторов, вычисляемых
. только если J.GT.1000
ELSEIF(J.GT.100)THEN
. Набор операторов, вычисляемых
. только если J.GT.100 и J.LE.1000
ELSEIF(J.GT.10)THEN
. Набор операторов, вычисляемых
. только если J.GT.10 и J.LE.100
ELSE
. Набор операторов, вычисляемых
. только если J.LE.10
ENDIF
Блок IF с операторами ELSEIF.
Пpимep:
IF(I.LT.100)THEN
. Набор операторов, выполняемых
. только если I.LT.100
IF(J.LT.10)THEN
. Набор операторов, выполняемых
. только если I.LT.100 и J.LT.10
ENDIF
. Набор операторов, выполняемых
. только если I.LT.100
ELSE
. Набор операторов, выполняемых
. только если I.GE.100
IF(J.LT.10)THEN
. Набор операторов, выполняемых
. только если I.GE.100 и J.LT.10
ENDIF
. Набор операторов, выполняемых
. только если I.GE.100
ENDIF
Bлoжeннaя кoнcтpукция IF бeз иcпoльзoвaния ELSEIF.
---------------- - IMPLICIT ----------------
Oпиcaниe типa для пoльзoвaтeльcкиx имeн.
----------------------------------------------------------
IMPLICIT тип (a[,a]...)[тип (a[,a]...)...]
----------------------------------------------------------
Гдe:
type - oдин из cлeдующиx типoв
INTEGER
INTEGER*2
INTEGER*4
REAL
REAL *4
REAL *8
DOUBLE PRECISION
COMPLEX
COMPLEX*8
COMPLEX*16
LOGICAL
LOGICAL *2
LOGICAL *4
CHARACTER
CHARACTER*n
a - либo oднa буквa, либo диапазон букв. Диапазон букв выдeляeт- cя пepвoй и пocлeднeй буквaми диапазона, paздeлeнными "-". Буквы дoлжны укaзывaтьcя в aлфaвитнoм пopядкe.
n - (из CHARACTER*n) дoлжeн быть oт 1 дo 127.
Особенности.
Оператор IMPLICIT описывает тип и размер для всех пользова- тельских имен, которые начинаются с указанных букв. Оператор IMPLICIT работает только в программной единице. Он не изменяет типа любой внутренней функции.
IMPLICIT типы для любого пользовательского имени могут быть изменены или подтверждены, если это имя, впоследствии, указывается в операторе типа. Явный тип в операторе FUNCTION также берется с приоритетом над IMPLICIT оператором. Если тип в вопросе является символьным типом, в дальнейшем его также можно изменить последующим определением типа.
Программная единица может иметь больше одного оператора IMPLICIT. Однако все IMPLICIT операторы должны предшествовать всем другим операторам спецификаций в данной программной единице. Одна и та же буква не может использоваться в операторе IMPLICIT более одного раза.
Пример:
C пример IMPLICIT оператора
IMPLICIT INTEGER (A,B)
IMPLICIT CHARACTER*10(N)
AGE=10
NAME='PAUL'
------------- - OPEN -------------
Приводит в соответствие номер устройства с внешним устройством или файлом на внешнем устройстве.
------------------------------------------------------
OPEN (номер-устройства [,FILE='имя-файла']
[,STATUS='тип'][,ACCESS='тип-доступа'][,FORM=
'Формат'][,IOSTAT= состояние][,RECL=длина]
[,SHARE='совместно'][,MODE='режим'])
------------------------------------------------------
Где
номер-устройства это определитель требуемого устройство. Он
должен быть первым параметром и не должен быть
внутренним определителем устройства.
Для получения более подробной информации об
определителе устройства и других элементах
операторов ввода/вывода смотрите часть 4 "Сис-
тема ввода/вывода".
имя-файла это символьное выражение. Это не обязательный
параметр, но он должен быть вторым, если при-
сутствует. Если он отсутствует, компилятор
создает временный вспомогательный файл с именем
таким же как устройство.
Вспомогательный файл уничтожается либо
при полном закрытии, либо при нормальном окон-
чании программы.
Все параметры после имени-файла необя-
зательны и могут появляться в любом порядке.
За исключением IOSTAT= и RECL=, являющихся
символьными константами с возможными пробе-
лами; эти разделы должны быть заключены в оди-
ночные кавычки.
тип это OLD(по умолчанию) или NEW. OLD - для чтения
или записи в существующие файлы. NEW - для за-
писи новых файлов.
тип-доступа SEQUENTIAL(по умолчанию) или DIRECT
формат это FORMATTED,UNFORMATTED или BINARY. Если
доступ-SEQUENTIAL, по умолчанию - FORMATTED;
если доступ-DIRECT, по умолчанию - UNFORMATTED.
состояние целая переменная или элемент целого массива,
заполняемый как:
а) нуль если не было ошибки или
конца файла
в) машинно-зависимая целая положительная
величина, если встретилась ошибка
с) машинно-зависимая целая отрицательная
величина, если встретился конец файла
и не было ошибки.
длина (длина записи) целое выражение, определяющее
длину каждой записи в байтах. Этот параметр
применим только для файлов с прямым доступом,
для которых он необходим.
совместно это символьное выражение, определяющее, как
другие процессы могут иметь доступ к файлу,
пока файл еще открыт.
Допустимые значения "совместно" следующие (без
учета возможных пробелов):
'COMPAT' режим совместимости по умолчанию
когда файл открывают в режиме совм-
естимости, начальный USER (процесс,
открывший файл) может открыть файл
в режиме совместимости сколько угодно
раз. Никакой другой USER не может
открыть файл. Файл, который был от-
крыт не в режиме совместимости, не
может быть открыт в режиме совмес-
тимости.
'DENYRW' режим отказа от чтения записи.
Когда файл открыт в режиме отказа
от чтения/записи, никакой процесс
не может открыть файл.
'DENYWR' режим отказа от записи. Когда
файл открыт в режиме отказа от
записи, никакой процесс не может
открыть файл для записи.
'DENYRD' режим отказа от чтения. Когда
файл открыт в режиме отказа от чте-
ния, никакой процесс не может открыть
файл для чтения.
'DENYNONE' произвольный режим. Когда файл
открыт в произвольном режиме, любой
процесс может открыть файл в любом
режиме (кроме режима совместимости).
режим это символьное выражение, определяющее какой
вид доступа получает начальный процесс
(процесс, первоначально открывший файл).
Допустимыми значениями режима являются (без
учета возможных пробелов):'READ' процесс может
читать из файла 'WRITE' процесс может писать
в файл 'READWRITE' процесс может читать и
писать в файл
Особенности.
Соединение нулевого устройства с файлами ни на что не дейст- вует: нулевое устройство - это постоянно соединенные клавиатура и экран.
Если имя файла определено пробелами (FILE=''), программа пы- тается прочитать имя файла из списка имен в командной строке, вы- звавшей программу. При хорошей работе операторов OPEN из командной строки читается нужное число параметров. Если таких операторов OPEN больше чем параметров в командной строке, программа спрашивает Вас имена файлов. Например, если в командной строке нет параметров (или они уже все прочитаны предыдущими операторами OPEN), оператор
OPEN (10, FILE='')
вызовет сообщение:
File name missing or blank
Please enter name
UNIT 10?
(Имя файла отсутствует или пустое
Пожалуйста введите имя
для устройства 10?)
Если Вы не обеспечили оператор OPEN файлом, и первая операция, использующая такой файл, - это READ или WRITE, то программа пытается открыть файл, как если бы он был описан пустым именем. Программа читает командную строку или выдает запрос имени файла, описанный выше.
Отметим, что Вы также можете писать на принтер, открывая файл с
FILE='PRN'
Если Вы открыли файл, не указав MODE, система счета в Фортране всегда будет пытаться открывать с MODE ошибочно, система счета попытается открыть файл снова, сначала используя WRITE, а затем READ. Отметим, что это не то же самое, что при определении MODE='READWRITE'. Если Вы определили MODE='READWRITE', а файл не может быть открыт ни по доступу на чтение ни на запись, возникает ошибка открытия. Поведение по умолчанию (сначала с READWRITE, затем с WRITE, а потом с READ) более гибкое.
Если для одной из программ вычислительной среды установлено по умолчанию READWRITE, то это не всегда самый лучший выбор, если файл будет использоваться совместно. Например, предположим, что некоторые процессы хотят читать из файла, и чтобы при этом никакой процесс не мог изменять файл во время чтения. Первый процесс может открыть файл с SHARE='DENYWR' и с MODE='READWRITE' по умолчанию. Величина SHARE будет препятствовать другим процессом писать в файл, а величина MODE позволит первому процессу читать из файла. Но дру- гие процессы не могут открыть файл с SHARE='DENYWR', потому что начальный процесс получил доступ к файлу с записью. Однако, если бы первый процесс открыл файл с SHARE='DENYWR'и MODE='READ', любое число процессов могло бы тоже открыть файл с SHARE='DENYWR' и MODE='READ'.
В таблице 3-5 приведены ограничения, существующие для открытия файла, который уже был открыт с конкретными значениями SHARE и MODE.
---------------------------T-----------------------------¬
| Файл открыт с указанными | Можно последовательно отк- |
| величинами SHARE и MODE | рыть с указанными величина- |
| | ми SHARE и MODE |
+--------------------------+-----------------------------+
| SHARE= MODE= | SHARE= MODE= |
| | |
| COMPAT READWRITE | COMPAT READWRITE |
| READ | только READ |
| | начального WRITE |
| | процесса |
| DENYRW READWRITE | Не может быть последова- |
| READ | тельно открыт |
| WRITE | |
| DENYWR READWRITE | DENYNONE READ |
| READ | DENYNONE READ |
| | DENYWR |
| WRITE | DENYNONE READ |
| | DENYRD |
| DENYRD READWRITE | DENYNONE WRITE |
| READ | DENYNONE WRITE |
| | DENYWR |
| WRITE | DENYNONE WRITE |
| | DENYRD |
| DENYNONE READWRITE | DENYNONE READWRITE |
| | READ |
| | WRITE |
| READ | DENYNONE READWRITE |
| | DENYWR READ |
| | WRITE |
| WRITE | DENYNONE READWRITE |
| | DENYRD READ |
| | WRITE |
L--------------------------+------------------------------
Таблица 3-5. Величины SHARE и MODE.
Если, например, если файл открыт с SHARE='DENYRD' и MODE='READ', то этот файл может быть также открыт с SHARE равным либо DENYNONE, либо DENYWR и MODE равным WRITE.
Примеры:
С Приглашение пользователю ввести имя файла
WRITE (*,'(A\)')' Outrit file name?
C Предлагаем, что имя файла в виде CHARACTER*64
C Чтение имени файла с клавиатуры
READ(*,'(A)') FNAME
C Откроем файл как форматный, последовательный,
С связанный с устройством 7. Отметим, что указание
С доступа необязательно, так как оно совпадает со
С значением по умолчанию. Форматный - тоже
С по умолчанию.
OPEN (7,FILE=FNAME,ACCESS='SEQUENTIAL'
+STATUS='NEW')
C Открытие существующего файла, созданного EDITOROM
C с именем DATA3.TXT, как устройства 3.
OPEN (3,FILE='DATA3.TXT')
------------------- - PARAMETER -------------------
Присваивает имя константе.
----------------------------------------------
PARAMETER ( P=e[,P=e]. . .)
----------------------------------------------
Где
P - имя
e - константа или константое выражение.
Константа может быть логической, символьной или относиться к любому арифметическому типу. Константное выражение может быть толь- ко логическим или целым.
Особенности.
Имя должно соответствовать по типу константе или константному выражению. Если имя не имеет типа по умолчанию, а длина константы - длина по умолчанию, имя должно быть описано в операторе описания типа или в IMPLICIT до использования в тексте программы.
Имя может быть использовано в выражениях только той программ- ной единицы, в которой оно определено.
Имя не может быть использовано в определении формата и в не- которых других константах, например, в комплексной константе. Примеры:
PARAMETER (NBLOCKS=10)
INTEGER REMAIN
PARAMETER (REMAIN=10/3, DIV=7.66)
--------------- - PAUSE ---------------
Приостанавливает выполнение программы до того, будет нажата клавиша RETURN.
----------------------------------------------------------
PAUSE [n]
----------------------------------------------------------
Где
n - это символьная константа, либо строка из не более чем пяти
цифр.
Особенности.
Оператор PAUSE приостанавливает выполнение программы до ко- манды продолжать. Параметр n, если он есть, выдается на экран как приглашение, требующее ввода с клавиатуры. Если n нет, на экран выдается такое сообщение : PAUSE. Please press <return> to continue. (ПАУЗА. Пожалуйста для продолжения нажмите <return>).
После нажатия на клавишу Ввод (ENTER) выполнение программы возобновится, как если бы был выполнен оператор CONTINUE.
Пример :
С Пример оператора PAUSE
IF (IMARN.EQ.0) GO TO 300
PAUSE 'WARNING : INARM IS NONZERO'
300 CONTINUE
----------------- - PROGRAM -----------------
Определяет программную единицу как основную программу и при- сваивает ей имя.
----------------------------------------------------------
PROGRAM имя программы
----------------------------------------------------------
Где
имя программы - это имя, которое Вы дали своей основной программе.
Имя программы - это глобальное имя. Поэтому оно не
может совпадать с именем любой внешней процедуры
или именем COMMON-блока.(Оно также является локаль-
ным именем основной программы и не должно вступать
в противоречие с любым локальным именем в основной
программе.) Оператор PROGRAM может быть только
первым оператором в основной программе.
Особенности.
Если у основной программы нет оператора PROGRAM, ей будет присвоено имя MAIN. Имя MAIN тогда нельзя будет использовать для именования любого другого объекта. Пример :
PROGRAM GAUSS
REAL COEF (10,10), COST (10)
.
.
.
END
-------------- - READ --------------
Передает данные из файла, связанного с определителем устрой- ства, в объекты списка-ввода/вывода, при условии, что нет конца файла или ошибки.
----------------------------------------------------------
READ (определитель устройства [,определитель формата]
[,IOSTAT=состояние] [,REC=номер записи] [,END=метка1]
[,ERR=метка2]) список-ввода/вывода
----------------------------------------------------------
Где
определитель- устройства
- это определитель требуемого устройства, который должен быть первым параметром.
определитель- формата
- требуется для формального чтения как второй параметр. Не должен появляться для неформатного чтения.
Остальные параметры если они есть, могут появляться в любом порядке.
состояние
- это целая переменная или элемент целого массива, которому присваивается : а) нуль, если встретилась ошибка или конец файла; b) машинно-зависимая положительная целая величина, если встретилась ошибка ; с) машинно-зависимая отрицательная целая величина, если встретится конец файла и не было ошибки.
номер записи
- определен только для файлов прямого доступа если номер записи определен для файла не типа прямого доступа возникнет ошибка. Номер-записи - это положительное целое выражение определяющее положение записи (первая запись в файле имеет номер равный 1) перед началом передачи данных. Если для файла прямого доступа этого параметра нет, чтение продолжится последовательно от позиции в файле.
метка 1
- это необязатальная метка оператора в той же са- мой программной единице, что и оператор READ. Если этот параметр отсутствует, чтение дошедшее до конца файла порождает ошибку счета. Если он есть, встре- тившееся условие конца файла передает управление на указанный выполняемый оператор.
метка 2
- необязательная метка оператора в той же самой программной единице, что и оператор READ. Если этот параметр отсутствует, ошибка ввода/вывода порождает ошибку счета. Если он есть, ошибка вво- да/вывода передает управление на указанный выпол- няемый оператор.
Список-ввода-вывода
- определяет объекты, в которые передаются величины из файла. Он может быть пустым, но обычно содержит объекты для ввода и неявные циклы, разделенные запятыми.
Особенности.
Если чтение внутреннее, источником ввода служит символьная переменная или массив символьных элементов; если чтение не внут- реннее, источником ввода является внешнее устройство. Для более подобной информации об определении внешних устройств и других эле- ментов операторов ввода/вывода смотрите часть 4.
Если файл не был открыт оператором OPEN, выполняется операция OPEN по умолчанию. Эта операция эквивалентна выполнению следующего оператора :
OPEN (оператор устройства, FILE=", STATUS='OLD',
ACCESS='SEQUENTIAL',FORM='формат'
Формат - это FORMATTED для форматного READ и UNFORMATTED для не форматного READ. Смотрите описание оператора OPEN для понимания действия параметра FILE=.
Пример:
С Описание двухмерного массива
DIMENSION IA(10,20)
С Чтение в границы массива. Эти границы не превышают
С 10 и 20 соответственно. Затем чтение в массив неявным
С циклом DO с вводным форматом 8 колонок по 5 цифр.
READ (3,990) IL, JL, ((IA(I,J), J=1, JL), I=1, IL)
990 FORMAT (215/,(8I5))
---------------- - RETURN ----------------
Возвращает управление в вызываемую программную единицу.
----------------------------------------------------------
RETURN
----------------------------------------------------------
RETURN может появляться только в функции или подпрограмме.
Особенности.
Выполнение оператора RETURN заканчивает выполнение всей под- программы или функции. Если оператор RETURN находится в функции, величине функции присваивается текущее значение переменной с тем же именем, что и функция.
Выполнение оператора END в функции или подпрограмме эквива- лентно выполнению оператора RETURN. Поэтому для окончания функции или подпрограммы требуется или RETURN или END,но не оба:
Пример
С Пример оператора RETURN
С Эта подпрограмма выполняет цикл
С пока вы не наберете "Y"
SUBROUTINE LOOP
CHARACTER IN
C
10 READ (*,'(A1)') IN
IF (IN.EG.'Y') RETURN
GO TO
C Неявный RETURN
END
-------------------------- - Функция-оператор --------------------------
Определяет функцию в виде одного оператора.
----------------------------------------------------------
имя-функции ([параметр[,параметр]...])=выражение
----------------------------------------------------------
Где имя-функции - это имя функции-оператора параметр - это имя формального параметра выражение - это любое выражение
Особенности.
Функция оператор подобна по виду оператору присваивания. Фун- кция-оператор может стоять только после операторов определения типа и перед любыми исполняемыыми операторами в програмной еденице, в которой она используется.
Функция-оператор - это невыполняемый оператор, хотя она и является первым оператором в программной единице. Однако, тело функции-оператора служит для определения значения функции-опера- тора. Как и другие любые функции функция-оператор вычисляется по ссылке в выражении.
Тип выражения должен быть совместим с типом имени функции- оператора. Список имени формальных параметров служит для определения числа и типа параметров функции-оператора. Областью действия имен фармальных параметров является сама функция оператор. Поэтому имена формальных параметров могут быть переопределены как другие имена пользователя в оставшейся части программной единици, за исключением определителя функции-оператора.
Имя функции-оператора, однако, локально, по отношению к программной единице; оно не должно быть использовано где либо еще, кроме имени COMMON-блока или имени формального параметра в другой функции-операторе. Впоследнем случае тип такого использования должен быть одинаковым.
Если имя формального параметра совпадает с любым другим ло- кальным именем, то следует иметь в виду, что ссылка на это время в функции-операторе определяет его как формальный параметр и ни в каком другом смысле.
В выражении допустимы ссылки на переменные, формальные параметры, другие функции, элементы массивов и константы. Ссылки на функции-операторы, однако, должны относится к функциям, описанным до того, как они употреблены здесь. На функцию-оператор не может быть вызвана рекурсивно, как прямо так и косвенно.
На функцию-оператор можно ссылаться только в той программной единице, где она описана. Имя функции-оператора не должно появлять- ся ни в каких описывающих операторах, за исключением описания типа (которые не могут описывать это имя, как массив) и оператора COMMON (как имя COMMON-блока).
Функция-оператор не может быть типа CHARACTER.
Пример
С Пример оператора функция-оператор
DIMENSION X(10)
ADD(A,B)=A+B
C
DO 1 I=1,10
X(I)=ADD(Y,Z)
1 CONTINUE
-------------- - STOP --------------
Оканчивает программу.
----------------------------------------------------------
STOP [n]
----------------------------------------------------------
Где
n - это либо символьная константа, либо строка из не более чем пяти цифр.
Особенности.
Параметр n, если он есть, высвечивается на экран, когда про- грамма оканчивается. Если n нет, высвечивается такое сообщение: STOP - Program terminated (STOP - Программа окончена)
Пример
С Пример оператора STOP
IF (IERROR.TQ.0) GO TO 200
STOP 'Определена ошибка'
200 CONTINUE
--------------------- - SUBROUTINE ---------------------
Определяет программную единицу как программу, присваивает ей имя и определяет формальные параметры для этой подпрограммы. Эти параметры могут содержать переменную метку возврата (*).
----------------------------------------------------------
SUBROUTINE имя подпрограммы [([форм-пар[,форм-пар]...])]
----------------------------------------------------------
Где
имя-подпрограммы - это определяемое пользователем глобальное внешнее имя подпрограммы.
форм-пар- это определяемое пользователем имя формального
параметра, называемого также фиктивным параметром.
Формальный параметр может быть переменной меткой возврата (*).
Особенности.
Подпрограмма начинается с оператора SUBROUTINE и заканчивается следующим за ним оператором END. Она может включать в себя любые операторы кроме PROGRAM, SUBROUTINE, BLOСK DATA и FUNCTION.
Список имен параметров определяет число и вместе с пос- ледующими операторами определения типа, IMPLICIT, EXTERNАL или DIMENSION - тип параметров этой подпрограммы. Имена параметров не могут появляться в операторах COMMON, DATA, EQVIVALENCE или INTRINSIC.
Фактические параметры в операторе CALL, вызывающем подпрог- рамму, должны соответствовать формальным параметрам в операторе SUBROUTINE по порядку следования, числу, типу или виду.
Компилятор будет проверять их на соответствие, если известны формальные параметры. Должно быть понятно, что оператор SUBROUTINE, определяющий формальные параметры, должен предшествовать оператору CALL в текущей компиляции.
Правила соответствия формальных и фактических параметров при- ведены описании оператора CALL.
Пример
SUBROUTINE GETNUM (NUM, UNIT)
INTEGER NUM, UNIT
10 READ (UNIT, '(I10)', ERR=10) NUM
RETURN
END
------------- - Тип -------------
Определяет тип имен, используемых пользователем.
----------------------------------------------------------
Тип имя-пер1 [,имя-пер2]...
----------------------------------------------------------
Где
тип - это один из следующих определителей типа данных.
INTEGER, INTEGER*2, INTEGER*4,
REAL, REAL*4, REAL*8, DOUBLE PRECISION,
COMPLEX, COMPLEX*8, COMPLEX*16,
LOGICAL, LOGICAL*2, LOGICAL*4,
CHARACTER, CHARACTER*n
имя-пер - это символьное имя переменной, массива, или фун-
кции-оператора, или подпрограммы-функции,или опера-
тора объявления массива.
n (в CHARACTER*n) это целое в диапазоне от 1 до 127.
Особенности.
Оператор определения типа может подтверждать или отвергать неявный тип имени. Оператор определения типа может также определить размер.
Пользовательское имя переменной, массива, внешней функции или функции-оператора может упоминаться в операторе определения типа. В этом случае тип этого имени определен во всей программной единице. В программной единице оператор определения типа однозначно определяет тип имени.
Оператор определения типа может также подтвердить тип встро- енной функции, но это не обязательно. В операторе определения типа не может встретится имя подпрограммы или основной программы.
К оператору определения типа применимы следующие правила:
Оператор определения типа должен предшествовать всем выполняемым операторам.
Тип данных с символьным именем может быть точно описан только однажды.
Оператор определения типа не должен иметь метки.
Оператор определения типа может описывать массив добав- лением описателя размерности к имени массива.
За символьным именем может следовать определитель длины типа данных в виде *длина, где длина - одна из доступных типов длин для провозглашенного типа данных. Такое описание отменяет атрибут длины, который подразумевался оператором определения типа, и присвает новую длину описываемому объекту. Если присутствуют как описатель длины типа, так и описатель массива, описатель длины типа должен быть последним.
Пример:
С Пример операторов определения типа
INTEGER COUNT, MATRIX(4,4), SUM
REAL MAN, IABS
LOGICAL SWITCH
.
INTEGER*2 Q, M12*4, IVEC(10)*4
.
CMARACTER NAME*10, CITY*80, CH
--------------- - WRITE ---------------
Передает данные из объектов списка-ввода/вывода в файл, связанный с указанным устройством.
----------------------------------------------------------
WRITE (определитель-устройства[,определитель-формата]
[,IOSTAT=состояние][,ERR=метка][,REC=номер-записи])
список-ввода/вывода
----------------------------------------------------------
Где
Определитель-устройства
- это определитель заданного устройства, он должен быть первым параметром. Для более подробной информации об определителе устройства и других элементах ввода/вывода смотрите часть 4 "Система ввода/вывода".
Определитель-формата
требуется, как второй параметр, для форматного WRITE. Не должен появляться для неформатного WRITE. Остальные параметры, если они есть, могут появля- ться в любом порядке.
Состояние
- это целая переменная или элемент целого массива, который присваивается:
нуль, если не встретились ошибка или конец файла.
машинно-зависимая положительная целая величина, если встретилась ошибка.
машинно-зависимая отрицательная величина, если встретится конец файла и не было ошибки.
Метка
- это необязательная метка оператора. Если ее нет, ошибка ввода/вывода порождает ошибку счета. Если она есть, ошибка ввода/вывода передает управление на заданный выполняемый оператор.
Номер-записи
определен только для файлов прямого доступа (в противном случае вызывает ошибку). Это положитель- ное целое выражение, определяющего с какого номера записи в файле производить запись. Первая запись в файле имеет номер 1. Если для файлов прямого доступа номер записи отсутствует, запись продол- жается с текущей позиции в файле.
Список- ввода/вывода
определяет объекты, чьи величины должны быть переданы оператором WRITE. Список ввода/вывода может быть пустым, но обычно он содержит объекты вывода и неявные циклы, разделенные запятыми.
Особенности.
Если запись внутренняя, то адресатом вывода является симво- льная переменная или массив символьных элементов, определенные как устройство; в противном случае, адресат - это внешнее устрой- ство.
Если файл не был открыт оператором OPEN, подразумевается, что выполняется неявная операция открытия. Эта операция эквивалентна следующему оператору:
OPEN (определитель-устройства,FILE=",STATUS=NEW', +ACCESS='SEQUENTIAL',FORM=формат).
Формат - это FORMATTED для форматной записи и UNFORMATTED для неформатного оператора OPEN для понимания действия FILE=пара- метр.
Пример
С Высветить сообщение "One=1, Two=2, Three=3"
С на экран, неделая это простейшим образом!
WRITE (* ,980)'One= ',1,1+1,'ee= ',+(1+1+1)
980 FORMAT (A,I2,Two= ',1X,I1,Thr',A,I2)
4. CИCTEMA BBOДA/BЫBOДA.
