Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр2.doc
Скачиваний:
7
Добавлен:
19.09.2019
Размер:
1.26 Mб
Скачать
  • текстовые // - конкатенация

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

    Метки: 1..99999

    Комментарии: Часть текста программы, игнорируемая транслятором.

    10.3 Описание переменных и констант

    Тип и длина

    Константы

    Переменные

    Целый, 4

    I

    Неявное

    IJKLMN

    INTEGER

    INTEGER*4

    Целый, 2

    -

    INTEGER*2

    Действительный, 4

    E

    F

    Неявное

    кроме IJKLMN

    REAL

    REAL*4

    Действительный, 8

    E

    D

    REAL*8

    DOUBLE PRECISION

    Комплексный, 8

    (E,E)

    COMPLEX, COMPLEX*8

    Комплексный, 16

    (D,D)

    COMPLEX*16

    Логический, 4

    .TRUE. .FALSE.

    LOGICAL, LOGICAL*4

    Логический, 2

    -

    LOGICAL*2

    Текстовой, n<127

    nHxxx...x ‘xxx...x’

    CHARACTER*n (*)

    10.4 Арифметические операции

    А#B

    I2

    I4

    R4

    R8

    C8

    C16

    I2

    I2

    I4

    R4

    R8

    C8

    C16

    I4

    I4

    I4

    R4

    R8

    C8

    C16

    R4

    R4

    R4

    R4

    R8

    C8

    C16

    R8

    R8

    R8

    R8

    R8

    -

    C16

    C8

    C8

    C8

    C8

    -

    C8

    C16

    C16

    C16

    C16

    C16

    C16

    C16

    C16

    Старшинство (приоритет) операций: 1) **, 2) *, / 3). +, -

    Обратить внимание I/I=I; R8#C8

    Операция ** определена не для всех типов

    10.5 Арифметические выражения

    Арифметические выражения – это конструкции, в которых арифметические величины связанны арифметическими операциями. Для указания последовательности операций следует использовать скобки. К моменту вычисления выражения все переменные должны быть инициализированы (т.е. значения их определены). Промежуточные результаты не должны выходить за разрядную сетку. В процессе вычислений производится преобразование типов данных в соответствии с таблицей п.10.4.

    Пример: Сравнить 1/6*(А1+А2); (А1+А2)/6; 1./6*(А1+А2)

    10.6 Отношения

    Отношения – это операции преобразования типа. Отношения связывают арифметические величины, результат – логическая величина.

    Примеры:

    5.GT.3 - "истина";

    3.GE.3 - "истина";

    4.NE.4 - "ложь";

    X.LE.3 - истинностная форма, принимает значение "истина", если X строго меньше трех, в противном случае - "ложь".

    10.7 Логические операции

    Операции над логическими величинами, результат - логические величины.

    В.1

    В.2

    Отрицание

    Умножение

    Сложение

    Эквивалентность

    Неэквивалентность

    L1

    L2

    .NOT.L1

    L1.AND.L2

    L1.OR.L2

    L1.EQV.L2

    L1.NEQV.L2

    и

    и

    л

    и

    и

    и

    л

    и

    л

    л

    л

    и

    л

    и

    л

    и

    и

    л

    и

    л

    и

    л

    л

    и

    л

    л

    и

    л

    Логические выражения - осмысленные комбинации логических величин, связанных логическими операциями.

    10.8 Полный приоритет операций

    1. Вызов функций;

    1. Возведения в степень;

    1. Умножения и деления;

    2. Сложения и вычитания;

    3. Отношения;

    4. Отрицания;

    5. Логические умножения;

    6. Логические сложения;

    7. Эквивалентности и неэквивалентности.

    Примеры логических выражений

    Выражение (i/2*2.EQ.i).EQV.(j/2*2.EQ.j) принимает значение "истина" на элементах матрицы (i - номер строки, j - номер столбца), расположенных в шахматном порядке относительно элемента с индексами i=1, j=1.

    Выражение (X*X + Y*Y).LT.1 принимает значение "истина" на множестве точек (X,Y) на плоскости, лежащих внутри круга единичного радиуса с центром в начале координат.

    Лекция 11

    11.1 Операторы Фортрана

    Выполняемые

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

    Присваивания

    Ввода/вывода

    Управления

    Описания

    Распределения памяти

    Заголовки

    Остальные

    11.2 Программный модуль

    Независимо транслируемая часть программы.

    • Головная программа,

    • подпрограмма-функция,

    • подпрограмма-процедура,

    • BLOCKDATA.

    Порядок следования операторов в программном модуле

    PROGRAM,BLOCKDATA,FUNCTION,SUBROUTINE

    IMPLICIT

    PARAMETER

    ENTRY

    COMMON

    DIMENSION

    EQUIVALENCE

    EXTERNAL

    INTRINSIC

    Операторы описания типа

    FORMAT

    Операторные функции

    DATA

    Выполняемые операторы

    END

    11.3 Операторы присваивания

    Oпepaтop пpиcвaивaния являетcя выпoлняeмым oпepaтopом. Он служит для переопределения знaчeния простой пepeмeнной или элeмeнтa мaccивa и имеет вид:

    А=В

    где А - арифметическая (логическая) переменная, В - арифметическое (логическое) выражение. Символ присваивания "=" означает, что величина А принимает значение выражения В, возможно преобразование типа результата к типу переменной.

    Имя оператора - знак "=".

    А=В

    I2

    I4

    R4

    R8

    C8

    C16

    I2

    Ул

    [ ]

    ул

    [ ]

    ул

    [ ] -i

    ул

    [ ] -i

    ул

    I4

    О

    [ ]

    ул

    [ ]

    ул

    [ ] -i

    ул

    [ ] -i

    ул

    R4

    уп

    -i

    -i

    уп

    R8

    О

    -i

    -i

    C8

    0i

    0i

    0i

    0i

    уп

    уп

    C16

    0i

    0i

    0i

    О

    0i

    О

    Обозначения:

    ул - усечение старших разрядов;

    уп - усечение младших разрядов;

    [ ] - выбирается целая часть числа;

    0 - дополняется нулями;

    0i - добавляется нулевая мнимая часть;

    -i - отбрасывается мнимая часть.

    11.4 Оператор continue

    Выполняемый пустой оператор – носитель метки. Играет важную роль в структурном программировании как средство отделения логики программы от вычислительных кодов.

    11.5 Оператор безусловной передачи управления

    Имя оператора – GOTO.

    Формат записи – GOTO <метка>.

    Осуществляется передача управления на оператор с меткой <метка>.

    Существует ограничение на использование оператора GOTO – нельзя передавать управление внутрь тела цикла DO, а также внутрь блоков структурного оператора IF.

    Пpимep:

    GOTO 4022

    ...

    4022 CONTINUE

    11.6 Вычисляемый оператор передачи управления

    Имя оператора – GOTO.

    Формат записи – GOTO(<метка>[,<метка>]...)[,]<целочисленное выражение>

    гдe:

    <метка> – мeткa выпoлняeмoгo oпepaтopa, находящегося в той же программной единице. Однa и тa жe мeткa мoжeт пoвтopятьcя в списке.

    Вычисляется значение i целочисленного выражения. Если это значение в диапазоне от 1 до n, где n – количество меток в скобках, то управление передается оператору с меткой, стоящей на i-том месте в списке меток.

    Пpимep:

    GOTO (15,17,84,3) k+1

    Если k=2, то управление будет передано оператору с меткой 84.

    Если k=7, то управление передается следующему оператору программы.

    11.7 Оператор передачи управления по предписанию

    Имя оператора – GOTO.

    Формат записи – GOTO <целочисленная переменная>(<метка>[,<метка>]...)

    гдe:

    <метка> – мeткa выпoлняeмoгo oпepaтopa, находящегося в той же программной единице.

    С помощью оператора ASSIGN <метка> TO <целочисленная переменная> целочисленная переменная связывается с конкретной меткой из списка меток оператора «GOTO по предписанию». На оператор с этой меткой будет передано управления при выполнении оператора «GOTO по предписанию». Если метка отсутствует в списке, управление передается следующему оператору.

    Пример :

    ASSIGN 10 TO I

    GOTO I(4,10,777)

    10 CONTINUE

    11.8 Арифметический оператор условной передачи управления

    Имя оператора IF

    Формат записи IF(<арифметическое выражение>)<метка1>,<метка2>,<метка3>

    гдe:

    <метка1>,<метка2>,<метка3> – мeтки выпoлняeмых oпepaтopов, находящихся в той же программной единице.

    Bычиcляeтся арифметическое выpaжeниe и упpaвлeниe пepeдaeтся oпepaтopу, пoмeчeннoму oднoй из oпиcaнныx мeтoк в cooтвeтcтвии c peзультaтoм вычисления выpaжeния. Если значение выражения меньше нуля, то управление передается оператору с меткой <метка1>, если значение выражения равно нулю, то управление передается оператору с меткой <метка2>, если значение выражения больше нуля, то управление передается оператору с меткой <метка3>. Метки в списке меток могут повторяться. Оператор IF(A)17,17,17 эквивалентен оператору GOTO 17.

    Пpимep:

    I = 0

    IF (I) 10,20,30

    10 CONTINUE

    20 CONTINUE

    30 CONTINUE

    11.9 Логический оператор условной передачи управления

    Имя оператора IF

    Формат записи IF(<логическое выражение>)<оператор>

    Bычиcляeтся логическое выpaжeниe и, если значение .TRUE., то выполняется оператор <оператор>, в противном случае управление передается следующему оператору. В качестве оператора <оператор> может использоваться любой выпoлняeмый oпepaтop, кpoмe оператора цикла DO, логического и структурного операторов условной передачи управления.

    Пpимep:

    IF (I.EQ.O) J = 2

    IF (X.GT.2.3) GOTO 100

    100 CONTINUE

    11.10 Структурный оператор условной передачи управления*

    Формат оператора

    IF (<логическое выражение>) THEN

    <Блок операторов, выполняемых при значении .TRUE.>

    [ELSE

    <Блок операторов, выполняемых при значении .FALSE.>]

    ENDIF

    Строка ELSE с соответствующим блоком может отсутствовать.

    Пepeдaвaть упpaвлeниe внутpь блоков нeдoпуcтимo.

    П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

    Конструкция

    ELSEIF <операторы>

    эквивалентна

    ELSE

    IF <операторы>

    Блок IF с операторами ELSEIF.

    11.11 Оператор цикла с параметром

    DO<метка>[,]<переменная>=<выражение1>,<выражение2>[,<выражение3>]

    Метка <метка> – метка конечного оператора цикла.

    Переменная <переменная> называется параметром цикла – переменная целого (любого арифметического*) типа.

    Выражения в списке – выражения целого (любого арифметического*) типа.

    Конечный оператор цикла должен находиться после оператора DO и содержаться в той же программной единице.

    В качестве конечного оператора цикла можно использовать любой выполняемый оператор, кроме оператора безусловной передачи управления, арифметического оператора условной передачи управления, операторов STOP, RETURN, DO и логического оператора условной передачи управления с перечисленными выше операторами.

    Операторы, расположенные после оператора DO, вплоть (включая) до конечного оператора цикла, составляют тело цикла.

    Тело цикла выполняется последовательно для каждого значения параметра цикла <переменная> начиная со значения <выражение1> до (включая) значения <выражение2> с шагом равным значению <выражение3>.

    Если выражение <выражение3> отсутствует, то шаг изменения параметра цикла равен 1.

    О вложенности операторов (гнезда операторов DO)

    Предостерегающий пример:

    INTEGER*2I

    DO 100 I=32760,32767

    . . .

    100 CONTINUE

    В этом примере параметр цикла объявлен как переменная целого типа длины 2 байта. При реализации цикла транслятор использует в качестве счетчика итераций 32-битное слово. Поэтому тело цикла будет выполнено благополучно, не смотря на то, что после последней итерации значение параметра цикла превышает максимальное двухбайтное целое.

    Лекция 12

    12.1 Реализация стандартных структур

    Задача. Реализовать на Фортране структуры и их частные случаи. Выполните эту работу самостоятельно, а потом проверьте полученные решения

    Наименование структуры

    Структура

    Реализация

    1

    Линейная

    Ф1

    Ф2

    2

    Выбор (стандарт)

    IF (усл) GOTO 17

    Ф2

    GOTO 18

    17 CONTINUE

    Ф1

    18 CONTINUE

    3

    Выбор (Фортран-77)

    IF (усл) THEN

    Ф1

    ELSE

    Ф2

    ENDIF

    4

    Односторонний выбор «истина» (стантарт)

    IF (.NOT. усл) GOTO 18

    Ф1

    18 CONTINUE

    5

    Односторонний выбор «истина» (Фортран-77)

    IF (усл) THEN

    Ф1

    ENDIF

    6

    Односторонний выбор «ложь» (стантарт)

    IF (усл) GOTO 17

    Ф2

    17 CONTINUE

    7

    Односторонний выбор «ложь» (Фортран-77)

    IF (.NOT. усл) THEN

    Ф2

    ENDIF

    8

    Односторонний выбор «истина» (элементарная операция)

    IF (усл) Ф1

    9

    Цикл итерационный

    17 CONTINUE

    Ф1

    IF (усл) GOTO 18

    Ф2

    GOTO 17

    18 CONTINUE

    10

    Цикл с предусловием

    17 CONTINUE

    IF (.NOT. усл) GOTO 18

    Ф2

    GOTO 17

    18 CONTINU

    11

    Цикл с постусловием

    17 CONTINUE

    Ф1

    IF (.NOT. усл) GOTO 17

    12

    Цикл с параметром

    DO 17 i=1,n,1

    Ф1

    17 CONTINUE

    12.2 Операции ввода/вывода

    Ввод данных в программу осуществляется:

    • с клавиатуры,

    • из файла,

    • с внешнего устройства (сканера, стриммера...)

    Вывод данных из программы осуществляется:

    • на экран монитора,

    • в файл,

    • на внешнее устройство (принтер, графопостроитель...)

    Принятые имена устройств ввода/вывода в операционной системе MS-DOS:

    • консоль (клавиатура при вводе, экран монитора при выводе) – CON,

    • файл – полное имя файла,

    • принтер – PRN.

    12.3 Операторы ввода/вывода

    Указывают, какие данные подлежат вводу или выводу, куда или откуда.

    READ (<N устр.>,<M формата>)<список элементов>

    WRITE(<N устр.>,<M формата>)<список элементов>

    <N устр> – номер устройства ввода или вывода – целое число 1..99.

    Если вместо номера устройства используется символ «*», то подразумевается CON.

    Зарезервированные системой номера устройств:

    5 - ввод с системного устройства ввода (в MS DOS – клавиатура);

    6 - вывод на системное устройство печати (в MS DOS – экран монитора);

    7 - вывод на системное перфокарточное устройство.

    Каждому устройству сопоставлено системное имя по его номеру:

    FTХХF001 - имя устройства номер ХХ (используется в системных сообщениях)

    <M формата> - метка оператора формата (* – формат по умолчанию)

    <список элементов> – последовательность объектов ввода или вывода.

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

    Неявный цикл представляет собой следующую конструкцию:

    (<список выражений>, <параметр>=n1,n2,n3).

    Такая запись обозначает последовательность объектов, полученных последовательными подстановками в выражения, стоящие в списке, значений параметра <параметр>, начиная со значения n1 до значения n2 с шагом n3.

    Два особых оператора в/в:

    READ<M формата>,<спис.элементов>=READ(5,<M форм>)<спис.элементов>

    PRINT<M формата>,<спис.элементов>=WRITE(6,<M форм>) <спис.элементов>

    12.4 Оператор формата (format)

    Указывает, в каком виде должны быть представлены данные.

    <M формата> FORMAT(<список спецификаций>)

    <М формата> - метка оператора формата.

    Спецификации (w - число позиций, d – точность – целые константы)

    • Iw – целое в w позициях;

    • Fw.d – действительное с фиксированной точкой, всего w позиций, из них d после десятичной точки;

    • Ew.d – действительное в экспоненциальной форме, всего w позиций, 4 позиции под символ E, знак порядка и порядок, одна позиция под десятичную точку и, возможно, одна под знак числа, d знаков под дробную часть;

    • Dw.d – то же, но для числа с удвоенной точностью;

    • Lw – логическое в w позициях (только при выводе);

    • Aw – текстовое;

    • Zw – целое в шестнадцатеричном представлении;

    • wX – w пробелов;

    • 'text' – любой текст;

    • / – переход на новую строку.

    В списках спецификаций могут использоваться объединения нескольких спецификаций в группы (заключаются в скобки), повторители (целые положительные числа перед спецификацией или группой) указывают, сколько раз нужно повторить спецификацию или группу спецификаций.

    12.5 Логическая запись

    Логическая запись интерпретируется в текстовых файлах как строка.

    • при каждом обращении к оператору ввода/вывода начинается новая логическая запись;

    • конец списка спецификаций заканчивает очередную логическую запись, чтение списка спецификаций осуществляется с последней группы спецификаций с учетом повторителя, если групп спецификаций в списке нет, то чтение списка спецификаций осуществляется с начала списка;

    • символ "/" в списке спецификаций заканчивает текущую логическую запись.

    12.6 Взаимодействие операторов в/в и оператора format.

    При выполнении форматного оператора ввода/вывода читаются одновременно список элементов ввода/вывода и список спецификаций соответствующего оператора FORMAT. Данное списка ввода/вывода вводится или выводится по соответствующей ей спецификации списка спецификаций.

    Расширенная форма оператора read

    READ(<Nустр>,<Mформ>,ERR=<Merr>,END=<Mend>,IOSTAT=<i>)<список> <список> - список элементов ввода>

    <Merr> – метка оператора, на который передается управление в случае возникновения ошибки ввода;

    <Mend> – метка оператора, на который передается управление в случае возникновения ситуации "конец файла" на устройстве ввода.

    <i> – переменная целого типа.

    Установки

    Ситуация

    IOSTAT

    END

    ERR

    Конец файла

    Ошибка

    Нет

    нет

    Нет

    Ошибка этапа выполнения

    Ошибка этапа выполнения

    Нет

    нет

    Да

    Переход к <M err>

    Переход к <M err>

    Нет

    да

    Нет

    Переход к <M end>

    Ошибка этапа выполнения

    Нет

    да

    Да

    Переход к <M end>

    Переход к <M err>

    Да

    нет

    Нет

    <i> не ноль, выполн прод

    <i> не ноль, выполн прод

    Да

    нет

    Да

    <i> не ноль, выполн прод

    <i> не ноль, к <M err>

    Да

    да

    Нет

    <i> не ноль, к <M end>

    <i> не ноль, выполн прод

    Да

    да

    Да

    <i> не ноль, к <M end>

    <i> не ноль, к <M err>

    12.7 Управляющие символы при печати

    При осуществлении вывода в текстовый файл (в частности, при выводе данных на экран монитора) используется договоренность, что первый символ каждой записи является управляющим. Это означает, что этот символ не записывается в файл, а используется для управления записями файла. Вот некоторые действия, определяемые управляющими символами:

    Управляющий символ

    Действие

    ' ' (пробел)

    переход на следующую логическую запись

    '+'

    в начало той же логической записи

    '0'

    вставляется пустая логическая запись и переход на следующую

    Имеется возможность «отключить» эту договоренность.

    12.8 Представление целого и действительного в памяти.

    (Используется спецификация Z):

    Величина

    Шестнадцатеричное представление

    Машинное представление

    INTEGER

    0

    00000000

    00000000

    1

    00000001

    01000000

    -1

    FFFFFFFF

    FFFFFFFF

    10

    0000000A

    0A000000

    100

    00000064

    64000000

    REAL

    0.

    00000000

    00000000

    1.

    3F800000

    0000803F

    -1.

    BF800000

    000080BF

    10.

    41200000

    00002041

    100.

    42C80000

    0000C842

    1 бит - знак числа, 8 бит - порядок, 23 биты – мантисса

    Действительный 0. 0000 0000 0|000 0000 0000 0000 0000 0000

    Действительная 1 0011 1111 1|000 0000 0000 0000 0000 0000

    Действительная 2. 0100 0000 0|000 0000 0000 0000 0000 0000

    Действительная 4. 0100 0000 1|000 0000 0000 0000 0000 0000

    Действительная 8. 0100 0001 0|000 0000 0000 0000 0000 0000

    Действительная -1. 1011 1111 1|000 0000 0000 0000 0000 0000

    Действительная 10. 0100 0001 0|010 0000 0000 0000 0000 0000

    Действительная 100. 0100 0010 1|100 1000 0000 0000 0000 0000

    Мантисса (со слепой единицей) умножается на 2 в степени <показатель> - 1111111

    Пример

    DIMENSION A(10),B(3,2)

    WRITE(*,77)I,X,J,Y,A,B,(A(I),I=1,3),((B(I,J),I=1,3),J=1,2)

    77 FORMAT(' ',2(I5,F10.3),/,5E10.3,/,5E10.3,/,(3F10.5))

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

    Полагая, что все данные не инициализированы, получаем выдачу:

    ^^^^0^^^^^^.000^^^^0^^^^^^.000

    ^.000E+00^^.000E+00^^.000E+00^^.000E+00^^.000E+00

    ^.000E+00^^.000E+00^^.000E+00^^.000E+00^^.000E+00

    ^.000E+00^^.000E+00^^.000E+00

    ...

    ^.000E+00^^.000E+00^^.000E+00

    12.9 Оператор data

    Инициализация переменных начальными значениями.

    DATA cписок-п/cписок-к/[[,]список-п/cписок-к]...

    гдe:

    список-п – список пepeмeнныx, элeмeнтoв мaccивa или имeн мaccивoв.

    список-к – cпиcoк кoнcтaнт, или кoнcтaнт с повторителем.

    Повторителем является конструкция <n>*, где n – целое число.

    Пpимep:

    DIMENSION Y(100)

    CHARACTER str

    DATA x1,x2(3),x3,x4,n/5*3.14159/,str,A,I,Y/3*'Help',100*0/

    Ocoбeннocти:

      • Пpизнaк пoвтopeния, co cтoящeй пocлe нeгo кoнcтaнтoй, эквивaлeнтeн cпиcку вcex кoнcтaнт, имeющиx oднo и тoжe знaчeниe и пoвтopяющиxcя cтoлькo paз, cкoлькo oпpeдeлeнo знaчeниeм кoнcтaнты пoвтopeния.

      • Oпepaтop DATA являeтcя нeвыпoлняeмым oпepaтopoм. Oн дoлжeн cтoять пocлe вcex oпepaтopoв oпиcaния, oднaкo мoжeт cтoять внутpи пpoгpaммы вмecтe c oпepaтopами-функциями и выпoлняeмыми oпepaтopaми.

      • Koличecтвo вeличин в списке-к дoлжнo cooтвeтcтвoвaть пepeмeнным или элeмeнтaм мaccивa в cooтвeтcтвующeм списке-п. Появление имени массива в списке cooтвeтcтвуeт пepeчню вcex элeмeнтoв этoгo мaccивa в порядке расположения в пaмяти. Элeмeнты мaccивa дoлжны "индeкcиpoвaтьcя" тoлькo пpи пoмoщи констант.

      • Символьный элeмeнт дoлжен быть paвной или мeньшей длины, чтo и длинa cooтвeтcтвующeй пepeмeннoй или элeмeнтa мaccивa. Ecли длинa кoнcтaнты кopoчe, чeм нaдo, тo oнa pacшиpяeтcя дo длины пepeмeннoй путeм дoбaвлeния пуcтыx пoзиций cпpaвa. Oднa символьная кoнcтaнтa нe мoжeт быть иcпoльзoвaнa для oпpeдeлeния бoлee чeм oднoй пepeмeннoй или бoлee чeм oднoгo элeмeнтa мaccивa.

      • Toлькo лoкaльныe пepeмeнныe, массивы и элeмeнты мaccивoв мoгут иcпoльзoвaтьcя в oпepaтope DATA. Пpи пoмoщи oпepaтopa DATA нe мoгут быть инициализированы фopмaльные пapaмeтpы, пepeмeнные из бeзымянныx COMMON-блoкoв и имeнa функций.

      • Знaчeния пepeмeнным и мaccивaм из имeнованныx COMMON – блoкoв мoгут быть инициализированы oпepaтopoм DATA, ecли этoт DATA coдepжитcя в пoдпpoгpaммe BLOCK DATA.

      • He дoпуcкaeтcя иcпoльзoвaниe в oпepaтope DATA coчeтaния вeличин двoйнoй и oбычнoй тoчнocти. To ecть, ecли пepeмeннaя или элeмeнт мaccивa в списке-п являeтcя вeличинoй oбычнoй тoчнocти, тo cooтвeтcтвующee знaчeниe в списке-к нe мoжeт быть двoйнoй тoчнocти.

    Пpимepы:

    INTEGER N,ORDER,ALPHA

    REAL COEF(4),EPS(2)

    DATA N/0/,ORDER/3/

    DATA ALPHA/'A'/

    DATA COEF/1.0,2*3.0,1.0/,EPS(1)/.00001/

    DATA t1/1/,t10/10/,t100/100/,r1,r10,r100/1.,10.,100./

    WRITE(6,70)t1,t10,t100,r1,r10,r100

    70 FORMAT(6A4)

    STOP

    END

    Данные трактуются как текстовые. На печать будет выдано (^ – пробел)

    ^^А?^^^A^^LB^^А?^^^A^^LB

    или в шестнадцатеричном виде:

    0000803F 00002041 0000C842 0000803F 00002041 0000C842

    Текстовые данные можно хранить в переменных действительного и целого типа, с помощью спецификации А их можно распечатать:

    DATA t1/'a'/,t2/'ab'/,t3/'abc'/,t4/'abcd'/,t5/'abcde'/

    WRITE(6,70)(t1,t2,t3,t4,t5,i=1,5)

    70 FORMAT(' ',5A1,/,' ',5A2,/,' ',5A3,/,' ',5A4,/,' ',5A5)

    STOP

    END

    Внимательно изучите выдачу (символом ^ обозначены пробелы):

    aaaaa

    a^abababab

    a^^ab^abcabcabc

    a^^^ab^^abc^abcdabcd

    ^a^^^^ab^^^abc^^abcd^abcd

    Еще один полезный пример:

    CHARACTER*4 c1*1,c2*2,c3*3,c4,c5*5

    c1='abc'

    c2='abc'

    c3='abc'

    c4='abc'

    c5='abc'

    WRITE(6,* )c1,c2,c3,c4,c5

    WRITE(6,70)(c1,c2,c3,c4,c5,i=1,2)

    70 FORMAT(' ',5A2,/,' ',5A6)

    STOP

    END

    Результат (символом ^ обозначены пробелы):

    aababcabc^abc^^

    ^aabababab

    ^^^^^a^^^^ab^^^abc^^abc^^abc

    12.10 Сравнение текстовых данных

    Текстовые данные в переменных типа REAL и INTEGER (неявное описание)

    X='A' - нельзя!

    X.EQ.'A' - нельзя

    DATA A/'A'/

    X=A – нормально

    DATA A/'A'/,X/'A'/

    A.EQ.X - истина

    DATA I/'A'/

    X=I - преобразование типа

    DATA A/'A'/,I/'A'/

    A.EQ.I - ложь!

    12.11 Функции для данных типа character

    Для данных типа CHARACTER определены отношения (.EQ. .NE. .GT. .GE. .LT. .LE.), лексиграфический порядок, более короткая строка дополняется справа пробелами. Логические функции двух переменных (LLT,LLE,LGT,LGE) возвращают логическую величину – результат соответствующего сравнения.

    LEN(<текстовое выражение>) - возвращает количество символов в строке.

    INDEX(<текст.выр1>,<текст.выр2>) – возвращает номер позиции (целое), начиная с которой текст.выр2 входит контекстом в текст.выр1.

    ICHAR(<текст.выр>) - возвращает целое - ASCII код первого символа в строке.

    CHAR(<целое>) - трактует целое как код и возвращает соответствующее значение типа CHAR.

    // - операция конкатенации (склейки) текстовых данных.

    Лекция 13

    13.1 Программные единицы

    • Программная единица – часть программы, которая может быть отдельно откомпилирована. Начинается с заголовка, заканчивается оператором END.

    • Программная единица может находиться в отдельном файле. В одном файле могут находиться несколько программных единиц.

    • Два прохода транслятора осуществляются над каждым файлом (над каждой программной единицей в файле), создаются новые файлы с объектными кодами программных единиц. На шаге редактирования связей следует указать все файлы, содержащие объектные коды всех программных единиц через запятую.

    • Головная программа – всегда одна, заголовок [PROGRAM], заголовка может не быть.

    • Подпрограмма-процедура – дополнительный оператор языка, заголовок SUBROUTINE

    • Подпрограмма-функция типа Т – дополнительная операция над данными типа Т, заголовок FUNCTION.

    • Блок данных – единственный в программе (если он есть). В блоке данных осуществляется формирование начального состояния переменных в программе, заголовок BLOCK DATA

    13.2 Библиотечные и встроенные функции

    • Встроенные в транслятор функции: ABS(цел/действ/компл), ... При трансляции в объектный код вместо обращения к функции вставляется непосредственно код реализации этой функции.

    • Библиотечные функции действительного аргумента: SQRT, EXP, LOG, SIN, COS, TAN, ASIN, ACOS, ATAN, COTAN, SINH, COSH, TANH, ... Объектный код библиотечной функции подсоединяется к пакету программных единиц программы на этапе редактирования связей. Обращение к библиотечной функции как и к обычной (пользовательской) функции.

    13.3 Оператор-функция

    Оператор-функция определена единственным оператором и по виду подобна оператору присваивания. Функция-оператор может появиться только после операторов описания и перед выполняемыми операторами в программной единице. Оператор-функция может быть только арифметического или логического типа.

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

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

    Тип оператора-функции определяется по имени <имя>, выражение <выражение> должно относиться к тому же типу.

    Вызов (обращение к оператор-функции) в выражении:

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

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

    Фактические параметры – константы, переменные, выражения.

    Значения фактических параметров передаются в выражение, выражение вычисляется и результат присваивается переменной – имени оператор-функции.

    Правило соответствия: Списки формальных и фактических параметров согласованы по количеству, типу и порядку следования. Пример

    SUM(A,B)=A+B

    Описание

    SRED(X,Y)=SUM(X,Y)*0.5

    Описание и обращение

    ...

    C=SRED(0.314,Z+17.2)+1

    Обращение

    13.4 Подпрограмма-функция

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

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

    ...

    <имя>=<выражение> - обязательный оператор

    ...

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

    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^^^1065353216^^^^^^^^^^^^1

    ^^^^^^^^^^2.0000000^^^1073741824^^^^^^^^^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

    ...