- •1.1.2 Классификация структур данных
- •1.1.3 Обозначения и договоренности
- •1.1.4 Множества.
- •1.1.5 Прямоугольные структуры. Массивы
- •Лекция 2
- •2.1 Прямоугольные структуры. Таблицы
- •2.2 Реализация с использованием параллельных массивов (статическое представление таблицы)
- •2.3 Реализация операций для неупорядоченной таблицы с использованием статической памяти
- •2.4 Динамическая память. Куча
- •2.5 Операции над указателями
- •2.6 Геометрическая интерпретация
- •2.7 Динамическая цепочка
- •2.8 Реализация операций для неупорядоченной таблицы с использованием динамической памяти
- •3.2 Обратная польская (постфиксная) запись
- •Лекция 4
- •4.1 Списковые структуры. Линейный список
- •Атом есть линейный список (атомарный);
- •Атом есть линейный список (атомарный);
- •4.2 Об операции "расчленение"
- •4.3 Логическое описание линейного списка.
- •4.4 Вычисление значения арифметического выражения
- •Лекция 5
- •5.1 Деревья
- •5.2 Бинарные деревья
- •5.5 Дерево двоичного поиска
- •7.2 Инструментальные средства. Архивация файлов (пока без сжатия)
- •7.3 Программы хранения и обработки информации
- •7.4 Код Цезаря
- •7.5 Упаковка текста
- •7.6 Код Хаффмана
- •7.7 Код Хемминга
- •7.8 Вектор Айлиффа
- •Вектор Айлиффа
- •Лекция 8
- •8.1 Сортировка – перестановка элементов линейной структуры
- •8.2 Алгоритмы сортировки Три класса алгоритмов сортировки (включением, выбором, обменом)
- •8.2.1 Сортировка простым включением.
- •9.2 Источники погрешностей
- •9.3 Классификация погрешностей
- •9.4 Терминология
- •FoRmula traNslation (станд.66, станд.77(*))
- •10.0 Бланк для записи текста программы на Фортране
- •10.1 Элементы языка
- •10.2 Типы данных и операции
- •10.3 Описание переменных и констант
- •10.4 Арифметические операции
- •11.3 Операторы присваивания
- •11.4 Оператор continue
- •11.5 Оператор безусловной передачи управления
- •11.6 Вычисляемый оператор передачи управления
- •11.7 Оператор передачи управления по предписанию
- •11.8 Арифметический оператор условной передачи управления
- •11.9 Логический оператор условной передачи управления
- •11.10 Структурный оператор условной передачи управления*
- •11.11 Оператор цикла с параметром
- •Лекция 12
- •12.1 Реализация стандартных структур
- •12.2 Операции ввода/вывода
- •12.3 Операторы ввода/вывода
- •12.4 Оператор формата (format)
- •12.5 Логическая запись
- •12.6 Взаимодействие операторов в/в и оператора format.
- •Расширенная форма оператора read
- •12.7 Управляющие символы при печати
- •12.8 Представление целого и действительного в памяти.
- •12.9 Оператор data
- •12.10 Сравнение текстовых данных
- •12.11 Функции для данных типа character
- •Лекция 13
- •13.1 Программные единицы
- •13.2 Библиотечные и встроенные функции
- •13.3 Оператор-функция
- •Правило соответствия: Списки формальных и фактических параметров согласованы по количеству, типу и порядку следования. Пример
- •13.4 Подпрограмма-функция
- •13.5 Подпрограмма-процедура
- •О соответствии фактических и формальных параметров
- •13.6 Операторы external и intrinsic
- •Пример (параметр-переменная и параметр-значение)
- •14.3 Операторы ввода и вывода.
- •14.4 Параметры операторов ввода и вывода
- •Открытие (присоединение) файла.
- •14.5 Операторы open и close
- •14.6 Оператор read
- •14.7 Оператор write
- •14.8 Другие операторы
текстовые // - конкатенация
Выражение: Осмысленная конструкция, в которой операции (арифметические, логические, текстовые) связывают (арифметические, логические, текстовые) величины (константы, переменные).
Метки: 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 Полный приоритет операций
Вызов функций;
Возведения в степень;
Умножения и деления;
Сложения и вычитания;
Отношения;
Отрицания;
Логические умножения;
Логические сложения;
Эквивалентности и неэквивалентности.
Примеры логических выражений
Выражение (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 |
вывод данных |
вывод на системное печатающее устройство |
|
Для присоединения и отсоединения |
|
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
...