Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Fortran для персонального компьютера

..pdf
Скачиваний:
22
Добавлен:
15.11.2022
Размер:
12.5 Mб
Скачать

Уровень вложенности операторов IF не может превы-

ш я т ь S i 1

г

ПРИМЕР

IF (i .LT. 10) THEN

J= i

slice = TAN (angle) ELSE

j - 0 slice = 0

END IF

4.5.2Операторы цикла.

4.5.2.1Перечисляемый цикл. Оператор DO.

ДЕЙСТВИЕ

Предназначен для многократного выполнения операто­ ров, следующих за оператором DO, до оператора с меткой <label> или до оператора END DO.

СИНТАКСИС

DO <label>[, ]<dovar>=<start>,<stop>[,<inc> ]

.. тело цикла . <label> operator

или

DO <dovar>=<start>,<stop>[,<inc>]

.. тело цикла . END DO

где <label> — Операторная метка исполняемого оператора. <dovar> — Переменная типа INTEGER, REAL или

DOUBLE PRECISION, называемая "DO-переменная". <start><^stop> — Выражения типа INTEGER, REAL или

DOUBLE PRECISION, задающие начальное и конечное зна­ чения переменной <dovar>.

<inc> Необязательное выражение типа INTEGER, REAL или DOUBLE PRECISION, задающий приращение перемен­ ной <dovar>. Параметр <inc> не может быть равен 0; по умол­ чанию его значение равно 1.

ЗАМЕЧАНИЯ

Наиболее существенной чертой оператора DO, вклю­ ченной в язык MS Fortran-5.0 является возможность не исполь­

зовать метки для обозначе ния конца цикла.

Метка <label> является необязательной. Если она ис­ пользуется, то цикл завершается помеченным оператором. Ес­ ли метка не используется, то цикл завершается оператором END DO. Метка <label> должна указываться после оператора DO и присутствовать в том же программном модуле.

Оператор, отмеченный меткой <labcl>, называется "тер­ минальным" оператором (или закрывающим оператором) DOцикла и не должен быть безусловным оператором GOTO, "при-

.. тело цикла . END DO

CONT^NUF^ ^ етка ИСПОлнительного оператора или оператора

<logicalexpr> — Тестовое выражение, вычисляемое со зна­ чением истина или "ложь"

ЗАМЕЧАНИЯ

Метка <label> является необязательной. Если <label> используется, то цикл завершается помеченным оператором. Если <1аЪе1>нс используется, то цикл завершается оператором END DO. F

Терминальный оператор должен следовать за операто­ ром DO WHILE и находиться в том же самом программном модуле. Этот оператор не должен быть безусловным или при­ сваиваемым оператором GOTO, блочным или арифметичес­ ким оператором IF, CASE, CYCLE, DO, ELSE, ELSE IF, END, ENDIF, ENDSELECT CASE, EXIT. RETURN, SELECT CASE или STOP. Терминальный оператор может быть логическим оператором IF.

Тело цикла DO WHILE начинается с оператора, следу­ ющего сразу за оператором DOWHILE и заканчивается (вклю­ чительно !) терминальным оператором цикла END DO.

При выполнении оператора DO WHILE выполняется следующая последовательность шагов:

1.Вычисляется логическое выражение.

2.Если выражение вычисляется со значением "ложь", то ни

один оператор внутри тела цикла не исполняется. Исполнение передается в оператор, следующий за терминальным операто­

ром.

3. Если выражение ’’истинно", то операторы внутри цикла исполняются, начиная с первого оператора, следующего за

оператором DO WHILE.

4. По достижении терминального оператора исполнение возвращается в оператор ЬО WHILE. Вычисляется логическое

выражение и цикл повторяется.

На выполнение оператора DO WHILE влияют те же ог­ раничения, что и на выполнение оператора DO.

4.5.2.3Переход в конец цикла. Оператор CYCLE.

ДЕЙСТВИЕ

Внутри цикла передает управление на терминальный оператор DO или WHILE-цикла.

СИНТАКСИС

CYCLE

ЗАМЕЧАНИЯ

Оператор CYCLE выполняет переход через оставшуюся часть циклов DO или WHILE. Путем объединения оператора CYCLE с логическим оператором IF пользователь может уп­ равлять исполнением программного кода.

4.5.2.4Выход из цикла. Оператор EXIT.

ДЕЙСТВИЕ

Передача управления из цикла DO или DO WHILE в первый исполняемый оператор, следующий за концом цикла.

СИНТАКСИС

EXIT

ЗАМЕЧАНИЯ

В общем случае^ цикл DO исполняется фиксированное число раз. Оператор EXIT позволяет пользователю прерывать цикл раньше, если некоторое заданное условие будет выпол­ нено (или не выполнено).

ПРИМЕР

Цикл прерывается преждевременно, если одно из дан­ ных установится в значение 0. Отрицательные значения не суммируются.

INTEGER point

REAL datarray(lOOO), sum sum = 0.0

DO point = 1,1000

IF(datarray(point) .LT. 0.0) CYCLE sum = sum + datarray(point)

iF (datarray (point) .EQ. 0.0) EXIT END DO

4.5.3 Выбор одного из многих выриантов. Оператор SELECT CASE...END SELECT.

ДЕЙСТВИЕ

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

СИНТАКСИС

SELECT CASE (<testcxpr>)

CASE (<expressionlist>) [<statemen tblock>] [CASE(<expressionh5t>) f<statpmentblock> 1]

CASE DEFAULT f<statementblock> | ]

END SELECT

где <testexpr> — Выражение типа INTEGER, LOGICAL или CHARACTER*!.

<expressionlist> — Список значений, которые могут быть константными и должны соответствовать типу данных

<testexpr>. Значения должны быть типа INTEGER, LOGICAL или CHARACTER* 1. Если <testexpr> соответствует одному из

значений, то исполняется следующий блок <stat’ementblock>.

<statcmcntblock> — Один или более исполняемых операто­ ров.

ЗАМЕЧАНИЯ

Существуют два способа включения значений в <expressionlist>.

Первый — задать список отдельных значений, разделен­ ных запятыми.

Второй — специфицировать диапазон значений, разделен­ ных двоеточием, например 5:10 или T :’N \ Нижняя граница должна быть меньше верхней. Если значения символьные, то первый символ должен появляться перед вторым в последова­ тельности ASCII-кодов. Если нижняя граница опущена (на­ пример,: 10), то все значения, меньшие или равные верхней границе, будут совпадать. Если опущена верхняя граница (например, 5:), то все значения, большие или равные нижней границе, должны совпадать. Оба способа могут быть реализо­ ваны в одном списке <expressionlist>.

Пользователь не может специфицировать диапазон зна­ чений, когда <testexpr> имеет тип LOGICAL. Значение (даже когда оно неявно специфицировано как часть диапазона зна­ чений) может появляться только в одном списке.

Блоке <statementblock> может не содержать исполняе­ мых операторов. Могут использоваться также и пустые блоки (при этом для группы значений выражени ядействия не выпол­

няются).

Оператор CASE DEFAULT является необязательным. Пользователь может включить в блок SELECT CASE только один оператор CASE DEFAULT.

Если значение <testexpr> не соответствует ни одному из значений в любом <expressionlist>, и оператор CASE DEFAULT отсутствует, то исполнение передается за пределы конструкции SELECT CASE в следующий исполняемый опе­

ратор.

Блоки SELECT CASE могут быть встроенными. Каждый блок должен иметь "свой собственный" оператор END SELECT; один оператор END SELECT может прервать выпол­

нение только одного блока.

Если опеоатор SELECT CASE появляется внутри цик­ лов DO или DO WHILE, либо внутри конструкций IF, ELSE или ELSE IF; прерывающий оператор END SELECT должен указываться внутри этого цикла или структуры.

ПРИМЕР

CHARACTER*! emdehar

SELECT CASE (emdehar)

CASE (’O’)

WRITE (*, *) "Must retrieve one to nine files"

CASE (’l ’:*9’)

CALL RetrieveFiles (emdehar)

CASE DEFAULT

WRITE (*, *) "Command not recognized, re-enter END SELECT

строке ( ), то ему будет выдана подсказка о вводе соответст­ вующего имени файла. При исполнении последовательных

операторов OPEN выполняется считывание последовательных параметров из командной строки.

2.Если таких операторов OPEN больше, чем параметров

вкомандной строке, то программа выдает подсказки для тре­

буемых имен файлов. Подсказка выводится на устройство, ассоциированное со звездочкой *. Например, предположим,

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

myprog first.fi! " и third.txt

Программа MYPROG содержит четыре оператора OPEN с пустыми именами файлов в следующем порядке:

OPEN (2, FILE= ’ ’)

OPEN (4, FILE= ’ ’)

OPEN (5, FILE= ’ ’)

OPEN (10, FILE=” )

Устройство 2 связано с файлом FIRST.FIL. Поскольку для второго имени файла в командной строке был специфи­ цирован фиктивный (null) параметр, то оператор OPEN для устройства 4 будет выдавать следующее сообщение:

File паше missing or blankPlease enter name UNIT 4? Устройство5 связано с файлом THIRD.TXT. Поскольку

других файлов в командной строке специфицировано не было',

оператор OPEN для устройства 10 выдает следующее сооб­ щение:

File name missing or blank - Please enter name UNIT 10? <form> — Символьное выражение, которое вычисляется со

значением ’FORMATTED’, ’UNFORM ATTED’ или ’BINARY’. Если доступ последовательный, то по умолчанию для <form> принимается значение ’FORMATTED’*при пря­ мом доступе принимается значение ’UNFORMATTED’.

<iocheck> — Целочисленная переменная, элемент массива или элемент структуры, которые определяются со значением отрицательного целого числа, если встретилась запись "конец - файла”; со значением "ноль”, если ошибок при выполнении не было; со значением положительного целого числа, если возникли некоторые ошибки (см. также подразд.3.2.6).

<mode> — Символьное выражение, которое вычисляется со значением ’READ’ (процесс может читать сЬайл),?’WRITE' (процесс может писать в файл), или ’READWRITE’ (процесс может читать и писать в файл), когда "хвостовые” пробелы удаляются. Параметр <mode> указывает тип доступа к файлу, который выполняется оригинальным процессом (процесс, ко­ торый начально открыл файл). Если пользователь открывает файл без спецификации параметра <mode>, то исполняющая система ФОРТРАНа всегда пытается открыть файл со значе­ нием ’READWRITE’ параметра <mode>. Если операция от­ крытия файла "оканчивается неудачей", то исполняющая сис­ тема пытается открыть файл повторно, сначала используя значение ’READ’ для параметра <mode>, а затем значение

’WRITE’.

случае генерируется сообщение об ошибке. Если пользователь открывает файл с параметром STATUS=’NEW’ и затем закры­

вает его с параметром STATUS = ’KEEP’,либо если программа завершается без выполнения операции закрытия нового фай­ ла, то создается постоянный файл.

’SCRATCH’ — Если при открытии файла не указано никакого имени, то параметр <status> принимает значение SCRATCH’. Рабочие файлы являются временными. Они уда­ ляются при явном закрытии файла, либо по завершении вы­ полнения программы. Пользователь также может явно от­ крыть поименованный файл с параметром STATUS^ ’SCRATCH’. Он будет удаляться при завершении выполнения программы.

’UNKNOWN’ — Если файл открывается с параметром STATUS=’UNKNOWN’, то компилятор прежде всего пытает­ ся открыть файл со значением ’OLD’ параметра <status>, а затем со значением ’NEW’ Поэтому, если файл существует, то он открыт; если он не существует, то он создается. По умол чанию принимается параметр STATUS=’UNKNO'WN’ Использование состояния ^UNKNOWN’ позволяет пользова­ телю избегать ошибок исполняющей системы, возможных при открытии существующего файла с параметром STATUS=’NEW’ или при открытии несуществующего файла с параметром STATUS-OLD’ Следует отметить, что значение состояния "влияет" только на дисковые файлы. Если устройст­ во, например клавиатура или принтер, открыто, то значение параметра STATUS= игнорируется.

ЗАМЕЧАНИЯ

Открытие файла для устройства, помеченного как звез­ дочка (*), не имеет смысла, поскольку это устройство постоян­ но"присоединено" к клавиатуре иэкрану. Пользователь, одна­ ко, может использовать оператор OPEN для присоединения других "предопределенных" устройств (с номерами 0, 5 и 6).

Если пользователь открывает файл, используя номер устройства уже присоединеного к другому файлу, то уже от­ крытый файл автоматически закрывается, затем файл с новым именем присоединяется к устройству; ошибок при этом не возникает. Однако, пользователь не может присоединить один

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

первой является операция READ или WRITE, то исполнитель­ ная система предпринимает попытку открыть файл как если бы было специфицировано пустое имя, описанное для пара­

метра <file>.

Если параметром в операторе OPEN является выраже­ ние, которое вызывает функцию, то эта функция не должна вызывать выполнения операторов ввода/вывода или встроен­ ной функции EOF, поскольку вэтих случаях результаты могут оказаться непредсказуемыми.