- •Предисловие
- •1. Элементы языка
- •1.1. Свободная форма записи программы
- •1.2. Консоль-проект
- •1.2.1. Создание проекта в CVF
- •1.2.2. Создание проекта в FPS
- •1.2.3. Операции с проектом
- •1.2.4. Файлы с исходным текстом
- •1.3. Операторы
- •1.4. Объекты данных
- •1.5. Имена
- •1.6. Выражения и операции
- •1.7. Присваивание
- •1.8. Простой ввод/вывод
- •1.8.1. Некоторые правила ввода
- •1.8.2. Ввод из текстового файла
- •1.8.3. Вывод на принтер
- •1.9. Рекомендации по изучению Фортрана
- •1.10. Обработка программы
- •2. Элементы программирования
- •2.1. Алгоритм и программа
- •2.2. Базовые структуры алгоритмов
- •2.2.1. Блок операторов и конструкций
- •2.2.2. Ветвление
- •2.2.3. Цикл
- •2.2.3.1. Цикл "с параметром"
- •2.2.3.2. Циклы "пока" и "до"
- •2.2.4. Прерывание цикла. Объединение условий
- •2.3. Программирование "сверху вниз"
- •2.3.1. Использование функций
- •2.3.2. Использование подпрограмм
- •2.3.3. Использование модулей
- •2.4. Этапы проектирования программ
- •2.5. Правила записи исходного кода
- •3. Организация данных
- •3.1. Типы данных
- •3.2. Операторы объявления типов данных
- •3.2.1. Объявление данных целого типа
- •3.2.2. Объявление данных вещественного типа
- •3.2.3. Объявление данных комплексного типа
- •3.2.4. Объявление данных логического типа
- •3.3. Правила умолчания о типах данных
- •3.4. Изменение правил умолчания
- •3.5. Буквальные константы
- •3.5.1. Целые константы
- •3.5.2. Вещественные константы
- •3.5.3. Комплексные константы
- •3.5.4. Логические константы
- •3.5.5. Символьные константы
- •3.6. Задание именованных констант
- •3.7. Задание начальных значений переменных. Оператор DATA
- •3.8. Символьные данные
- •3.8.1. Объявление символьных данных
- •3.8.2. Применение звездочки для задания длины строки
- •3.8.3. Автоматические строки
- •3.8.4. Выделение подстроки
- •3.8.5. Символьные выражения. Операция конкатенации
- •3.8.6. Присваивание символьных данных
- •3.8.7. Символьные переменные как внутренние файлы
- •3.8.8. Встроенные функции обработки символьных данных
- •3.8.9. Выделение слов из строки текста
- •3.9. Производные типы данных
- •3.9.1. Объявление данных производного типа
- •3.9.2. Инициализация и присваивание записей
- •3.9.2.1. Конструктор производного типа
- •3.9.2.2. Присваивание значений компонентам записи
- •3.9.2.3. Задаваемые присваивания записей
- •3.9.3. Выражения производного типа
- •3.9.4. Запись как параметр процедуры
- •3.9.5. Запись как результат функции
- •3.9.6. Пример работы с данными производного типа
- •3.9.7. Структуры и записи
- •3.9.7.1. Объявление и присваивание значений
- •3.9.7.2. Создание объединений
- •3.9.8. Итоговые замечания
- •3.10. Целочисленные указатели
- •3.11. Ссылки и адресаты
- •3.11.1. Объявление ссылок и адресатов
- •3.11.2. Прикрепление ссылки к адресатам
- •3.11.3. Инициализация ссылки. Функция NULL
- •3.11.4. Явное открепление ссылки от адресата
- •3.11.5. Структуры со ссылками на себя
- •3.11.6. Ссылки как параметры процедур
- •3.11.7. Параметры с атрибутом TARGET
- •3.11.8. Ссылки как результат функции
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Массивы нулевого размера
- •4.3. Одновременное объявление объектов разной формы
- •4.4. Элементы массива
- •4.5. Сечение массива
- •4.6. Присваивание массивов
- •4.7. Маскирование присваивания
- •4.7.1. Оператор и конструкция WHERE
- •4.7.2. Оператор и конструкция FORALL
- •4.8. Динамические массивы
- •4.8.1. Атрибуты POINTER и ALLOCATABLE
- •4.8.2. Операторы ALLOCATE и DEALLOCATE
- •4.8.3. Автоматические массивы
- •4.9. Массивы - формальные параметры процедур
- •4.9.1. Массивы заданной формы
- •4.9.2. Массивы, перенимающие форму
- •4.9.3. Массивы, перенимающие размер
- •4.10. Использование массивов
- •4.11. Массив как результат функции
- •4.12. Встроенные функции для массивов
- •4.12.1. Вычисления в массиве
- •4.12.2. Умножение векторов и матриц
- •4.12.3. Справочные функции для массивов
- •4.12.3.1. Статус размещаемого массива
- •4.12.3.2. Граница, форма и размер массива
- •4.12.4. Функции преобразования массивов
- •4.12.4.1. Элементная функция MERGE слияния массивов
- •4.12.4.2. Упаковка и распаковка массивов
- •4.12.4.3. Переформирование массива
- •4.12.4.4. Построение массива из копий исходного массива
- •4.12.4.5. Функции сдвига массива
- •4.12.4.6. Транспонирование матрицы
- •4.13. Ввод/вывод массива под управлением списка
- •4.13.1. Ввод/вывод одномерного массива
- •4.13.2. Ввод/вывод двумерного массива
- •5. Выражения, операции и присваивание
- •5.1. Арифметические выражения
- •5.1.1. Выполнение арифметических операций
- •5.1.2. Целочисленное деление
- •5.1.3. Ранг и типы арифметических операндов
- •5.1.4. Ошибки округления
- •5.2. Выражения отношения и логические выражения
- •5.3. Задаваемые операции
- •5.4. Приоритет выполнения операций
- •5.5. Константные выражения
- •5.6. Описательные выражения
- •5.7. Присваивание
- •6. Встроенные процедуры
- •6.1. Виды встроенных процедур
- •6.2. Обращение с ключевыми словами
- •6.3. Родовые и специфические имена
- •6.4. Возвращаемое функцией значение
- •6.5. Элементные функции преобразования типов данных
- •6.6. Элементные числовые функции
- •6.7. Вычисление максимума и минимума
- •6.8. Математические элементные функции
- •6.8.1. Экспоненциальная, логарифмическая функции и квадратный корень
- •6.8.2. Тригонометрические функции
- •6.9. Функции для массивов
- •6.10. Справочные функции для любых типов
- •6.11. Числовые справочные и преобразовывающие функции
- •6.11.1. Модели данных целого и вещественного типа
- •6.11.2. Числовые справочные функции
- •6.12. Элементные функции получения данных о компонентах представления вещественных чисел
- •6.13. Преобразования для параметра разновидности
- •6.14. Процедуры для работы с битами
- •6.14.1. Справочная функция BIT_SIZE
- •6.14.2. Элементные функции для работы с битами
- •6.14.3. Элементная подпрограмма MVBITS
- •6.14.4. Пример использования битовых функций
- •6.15. Символьные функции
- •6.16. Процедуры для работы с памятью
- •6.17. Проверка состояния "конец файла"
- •6.18. Неэлементные подпрограммы даты и времени
- •6.19. Случайные числа
- •6.20. Встроенная подпрограмма CPU_TIME
- •7. Управляющие операторы и конструкции
- •7.1. Оператор GOTO безусловного перехода
- •7.2. Оператор и конструкции IF
- •7.2.1. Условный логический оператор IF
- •7.2.2. Конструкция IF THEN END IF
- •7.2.3. Конструкция IF THEN ELSE END IF
- •7.2.4. Конструкция IF THEN ELSE IF
- •7.3. Конструкция SELECT CASE
- •7.4. DO-циклы. Операторы EXIT и CYCLE
- •7.5. Возможные замены циклов
- •7.6. Оператор STOP
- •7.7. Оператор PAUSE
- •8. Программные единицы
- •8.1. Общие понятия
- •8.2. Использование программных единиц в проекте
- •8.3. Работа с проектом в среде DS
- •8.4. Главная программа
- •8.5. Внешние процедуры
- •8.6. Внутренние процедуры
- •8.7. Модули
- •8.8. Оператор USE
- •8.9. Атрибуты PUBLIC и PRIVATE
- •8.10. Операторы заголовка процедур
- •8.10.1. Общие характеристики операторов заголовка процедур
- •8.10.2. Результирующая переменная функции
- •8.11. Параметры процедур
- •8.11.1. Соответствие фактических и формальных параметров
- •8.11.2. Вид связи параметра
- •8.11.3. Явные и неявные интерфейсы
- •8.11.4. Ключевые и необязательные параметры
- •8.11.5. Ограничения на фактические параметры
- •8.11.6. Запрещенные побочные эффекты
- •8.12. Перегрузка и родовые интерфейсы
- •8.12.1. Перегрузка процедур
- •8.12.2. Перегрузка операций и присваивания
- •8.12.3. Общий вид оператора INTERFACE
- •8.13. Ассоциирование имен
- •8.14. Область видимости имен
- •8.15. Область видимости меток
- •8.16. Ассоциирование памяти
- •8.16.1. Типы ассоциируемой памяти
- •8.16.2. Оператор COMMON
- •8.16.3. Программная единица BLOCK DATA
- •8.17. Рекурсивные процедуры
- •8.18. Формальные процедуры
- •8.18.1. Атрибут EXTERNAL
- •8.18.2. Атрибут INTRINSIC
- •8.19. Оператор RETURN выхода из процедуры
- •8.20. Оператор ENTRY дополнительного входа в процедуру
- •8.21. Атрибут AUTOMATIC
- •8.22. Атрибут SAVE
- •8.23. Атрибут STATIC
- •8.24. Атрибут VOLATILE
- •8.25. Чистые процедуры
- •8.26. Элементные процедуры
- •8.27. Операторные функции
- •8.28. Строка INCLUDE
- •8.29. Порядок операторов и директив
- •9. Форматный ввод/вывод
- •9.1. Преобразование данных. Оператор FORMAT
- •9.2. Программирование спецификации формата
- •9.3. Выражения в дескрипторах преобразований
- •9.4. Задание формата в операторах ввода/вывода
- •9.5. Списки ввода/вывода
- •9.5.1. Элементы списков ввода/вывода
- •9.5.2. Циклические списки ввода/вывода
- •9.5.3. Пример организации вывода
- •9.6. Согласование списка ввода/вывода и спецификации формата. Коэффициент повторения. Реверсия формата
- •9.7. Дескрипторы данных
- •9.8. Дескрипторы управления
- •9.9. Управляемый списком ввод/вывод
- •9.9.1. Управляемый именованным списком ввод/вывод
- •9.9.1.1. Объявление именованного списка
- •9.9.1.2. NAMELIST-вывод
- •9.9.1.3. NAMELIST-ввод
- •9.9.2. Управляемый неименованным списком ввод/вывод
- •9.9.2.1. Управляемый неименованным списком ввод
- •9.9.2.2. Управляемый неименованным списком вывод
- •10. Файлы Фортрана
- •10.1. Внешние и внутренние файлы
- •10.2. Позиция файла
- •10.3. Устройство ввода/вывода
- •10.4. Внутренние файлы
- •10.5. Внешние файлы
- •10.6. Записи
- •10.6.1. Типы записей
- •10.6.2. Записи фиксированной длины
- •10.6.3. Записи переменной длины
- •10.6.4. Сегментированные записи
- •10.6.5. Потоки
- •10.6.6. CR-потоки
- •10.6.7. LF-потоки
- •10.7. Передача данных с продвижением и без
- •10.8. Позиция файла перед передачей данных
- •10.9. Позиция файла после передачи данных
- •10.10. Двоичные последовательные файлы
- •10.11. Неформатные последовательные файлы
- •10.12. Текстовые последовательные файлы
- •10.13. Файлы, подсоединенные для прямого доступа
- •10.14. Удаление записей из файла с прямым доступом
- •10.15. Выбор типа файла
- •11. Операции над внешними файлами
- •11.1. Оператор BACKSPACE
- •11.2. Оператор REWIND
- •11.3. Оператор ENDFILE
- •11.4. Оператор OPEN
- •11.5. Оператор CLOSE
- •11.6. Оператор READ
- •11.7. Оператор ACCEPT
- •11.8. Оператор FIND
- •11.9. Оператор DELETE
- •11.10. Оператор UNLOCK
- •11.11. Оператор WRITE
- •11.12. Оператор PRINT
- •11.13. Оператор REWRITE
- •11.14. Оператор INQUIRE
- •11.15. Функция EOF
- •11.16. Организация быстрого ввода/вывода
- •12.1. Некоторые сведения об объектах ActiveX
- •12.2. Для чего нужен конструктор модулей
- •12.3. Интерфейсы процедур управления Автоматизацией
- •12.4. Идентификация объекта
- •12.5. Примеры работы с данными Автоматизации
- •12.5.1. OLE-массивы
- •12.5.2. BSTR-строки
- •12.5.3. Варианты
- •12.6. Другие источники информации
- •12.7. Как воспользоваться объектом ActiveX
- •12.8. Применение конструктора модулей
- •12.9. Пример вызова процедур, сгенерированных конструктором модулей
- •Приложение 1. Вывод русского текста в DOS-окно
- •Приложение 2. Нерекомендуемые, устаревшие и исключенные свойства Фортрана
- •П.-2.1. Нерекомендуемые свойства Фортрана
- •П.-2.1.1. Фиксированная форма записи исходного кода
- •П.-2.1.2. Оператор EQUIVALENCE
- •П.-2.1.3. Оператор ENTRY
- •П.-2.1.4. Вычисляемый GOTO
- •П.-2.1.5. Положение оператора DATA
- •П.-2.2. Устаревшие свойства Фортрана, определенные стандартом 1990 г.
- •П.-2.2.1. Арифметический IF
- •П.-2.2.2. Оператор ASSIGN присваивания меток
- •П.-2.2.3. Назначаемый GOTO
- •П.-2.2.4. Варианты DO-цикла
- •П.-2.2.5. Переход на END IF
- •П.-2.2.6. Альтернативный возврат
- •П.-2.2.7. Дескриптор формата H
- •П.-2.3. Устаревшие свойства Фортрана, определенные стандартом 1995 г.
- •П.-2.4. Исключенные свойства Фортрана
- •Приложение 3. Дополнительные процедуры
- •П.-3.1. Запуск программ
- •П.-3.2. Управление программой
- •П.-3.3. Работа с системой, дисками и директориями
- •П.-3.4. Управление файлами
- •П.-3.5. Генерация случайных чисел
- •П.-3.6. Управление датой и временем
- •П.-3.7. Ввод с клавиатуры и генерация звука
- •П.-3.8. Обработка ошибок
- •П.-3.9. Аргументы в командной строке
- •П.-3.10. Сортировка и поиск в массиве
- •П.-3.11. Управление операциями с плавающей точкой
- •Литература
- •Предметный указатель
- •Оглавление
О. В. Бартеньев. Современный ФОРТРАН
3.2. Операторы объявления типов данных
3.2.1. Объявление данных целого типа
Оператор INTEGER объявляет переменные, константы, функции целого типа. Объекты данных целого типа могут быть заданы как INTEGER, INTEGER(1), INTEGER(2) или INTEGER(4). Можно использовать и принятый в Фортране 77 синтаксис: INTEGER*1, INTEGER*2 или INTEGER*4.
Напомним, что указанные в скобках значения задают разновидность типа, значения после звездочки - число отводимых под тип байт. Задаваемую по умолчанию разновидность стандартного целого типа данных INTEGER можно изменить, используя опцию компилятора /4I2 или директиву $INTEGER:2.
Синтаксис оператора INTEGER:
INTEGER [[([KIND =] kind-value)][, attrs] ::] entity-list
kind-value - значение параметра разновидности KIND. В качестве kindvalue может быть использована ранее определенная именованная константа. attrs - один или более атрибутов, описывающих представленные в entity-list объекты данных. Если хотя бы один атрибут указан, то должен быть использован разделитель :: . Возможные атрибуты: ALLOCATABLE, AUNOMATIC, DIMENSION(dim), EXTERNAL, INTENT, INTRINSIC, OPTIONAL, PARAMETER, POINTER, PRIVATE, PUBLIC, SAVE, STATIC, TARGET и VOLATILE (последний атрибут применим только в CVF). Задание атрибутов может быть также выполнено и отдельным оператором, имя которого совпадает с именем атрибута. Атрибуты определяют дополнительные свойства данных и будут вводиться по мере изложения материала. Если задан атрибут
PARAMETER, то необходимо инициализирующее выражение, например: integer(4), parameter :: m= 10, n = 20
entity-list - разделенный запятыми список имен объектов данных (переменных, констант, а также внешних, внутренних, операторных и встроенных функций), содержащий необязательные инициализирующие значения переменных выражения. При этом инициализация может быть выполнена двумя способами:
integer :: a = 2, b = 4 |
! Наличие разделителя :: обязательно |
или |
|
integer a /2/, b /4/ |
! Разделитель :: может отсутствовать |
Если параметр KIND отсутствует, то применяемое по умолчанию значение разновидности равно четырем (если не использована опция компилятора /4I2 или директива $INTEGER:2). Значение параметра разновидности можно узнать, применив встроенную справочную функцию
KIND (разд. 6.10).
Диапазон изменения значений целых типов:
50
|
риложение3. Организация данных |
BYTE |
то же, что и INTEGER(1) |
INTEGER(1) |
от -128 до +127 |
INTEGER(2) |
от -32,768 до +32,767 |
INTEGER(4) |
от -2,147,483,648 до +2,147,483,647 |
INTEGER |
то же, что и INTEGER(4) |
Пример:
integer day, hour |
|
|
! Объявление без атрибутов |
|
integer(2) k/5/, limit/45/ |
|
! Объявление и инициализация |
||
byte vmin = -1 |
|
|
! То же, что и INTEGER(1) |
|
|
|
|
|
! Объявления с атрибутами |
integer, allocatable, dimension(:) :: days, hours |
||||
integer(kind = 2), target :: kt = 2 |
! Объявление и инициализация |
|||
integer(2), pointer :: kp |
|
|
||
integer(1), dimension(7) :: val = 2 |
! Объявление и инициализация |
|||
allocate(days(5), hours(24)) |
|
! Размещение массивов |
||
days = (/ 1, 3, 5, 7, 9/ ) |
|
! Генерация значений массивов |
||
hours = (/ (i, i = 1, 24) /) |
|
! при помощи конструктора массива |
||
day = days(5) |
|
|
|
|
hour = hours(10) |
|
|
|
|
kp => kt |
|
|
|
! Присоединение ссылки к адресату |
print *, day, hour |
|
|
|
|
print *, kt, kp |
|
|
|
|
print *, vmin, val(5), k*limit, kind(val), range(kp) |
||||
end |
|
|
|
|
Результат: |
|
|
|
|
9 |
10 |
|
|
|
2 |
2 |
|
|
|
-1 |
2 |
225 |
1 |
4 |
Замечание. Пользуясь синтаксисом Фортрана 77, первые 3 оператора можно объединить, указав размер типа в байтах после имени переменной:
integer day*4, hour*4, k*2 /5/, limit*2 /45/, vmin*1 /-1/
Число, стоящее после звездочки (*), указывает на количество байт, отводимых под переменную заданного типа. Такой способ объявления данных возможен и с другими встроенными типами.
Целая величина может быть в ряде случаев использована там, где ожидается логическое значение (в операторах и конструкциях IF и DO WHILE). При этом любое отличное от нуля целое интерпретируется как истина (.TRUE.), а равное нулю - как ложь (.FALSE.), например:
integer(4) :: i, a(3) = (/ 1, -1, 0 /) do i = 1, 3
if(a(i)) then write(*, *) 'True'
51
О. В. Бартеньев. Современный ФОРТРАН
else
write(*, *) 'False' end if
end do
Результат:
True
True
False
Также целая величина может быть присвоена логической переменной:
logical fl1, fl2 |
|
fl1 = 5; fl2 = 0 |
|
print *, fl1, fl2 |
! T F |
Замечание. Смешение логических и целых величин недопустимо, если используется опция компилятора /4Ys или директива $STRICT, при которой все расширения по отношению к стандарту Фортран 90 воспринимаются как ошибки.
3.2.2. Объявление данных вещественного типа
Синтаксис оператора объявления объектов вещественного типа аналогичен синтаксису оператора INTEGER:
REAL [[([KIND =] kind-value)] [, attrs] ::] entity-list
Параметр KIND может принимать значения 4 и 8. Первое значение используется для объявления объектов данных одинарной точности, а второе - для объектов двойной точности. Параметр разновидности может быть опущен. В таком случае принимаемое по умолчанию значение параметра разновидности вещественного типа равно четырем. Разумеется, возможно использование и альтернативного способа объявления данных, например вместо REAL(4) можно использовать REAL*4. Также вещественные данные двойной точности могут быть объявлены оператором DOUBLE PRECISION. Вещественные данные представляются в ЭВМ в виде чисел с плавающей точкой.
Параметром разновидности может также быть именованная константа или возвращаемое функцией KIND значение. Так, объявление
REAL(KIND(0.0)) эквивалентно объявлению REAL(4) или REAL(KIND = 4) (или REAL(8), если задана опция компилятора /4R8). Объявление REAL(KIND(0.0_8)) эквивалентно объявлению REAL(8) или REAL(KIND = 8). Задаваемая по умолчанию разновидность стандартного вещественного типа может быть изменена с 4 на 8 в результате использования опции компилятора /4R8 или директивы $REAL:8.
Диапазон изменения значений вещественных типов:
REAL(4) отрицательные числа: от -3.4028235E+38 до -1.1754944E-38;
52
риложение3. Организация данных
число 0;
положительные числа: от +1.1754944E-38 до +3.4028235E+38;
дробная часть может содержать до шести десятичных знаков. REAL то же, что и REAL(4)
REAL(8) отрицательные числа:
от -1.797693134862316D+308 до -2.225073858507201D-308;
число 0; положительные числа:
от +2.225073858507201D–308 до +1.797693134862316D+308;
дробная часть может содержать до 15 десятичных знаков.
Пример 1:
integer(4), parameter :: m = 3, n = 5, low = 4 real(kind = 4) :: d(m, n) = 15.0, hot = 3.4 real(4), pointer :: da(:, :)
real(low) d2(n)
Пример 2. Атрибут может быть задан в виде оператора.
real(8) :: da |
! Объявляем ссылочный массив da |
pointer da |
! Теперь, используя операторы, зададим атрибуты |
dimension da(:, :) |
|
parameter m = 10, n = 20 |
|
allocate(da(m, n)) |
! Первый исполняемый оператор |
3.2.3. Объявление данных комплексного типа
Комплексное число типа COMPLEX или COMPLEX(4) представляет собой упорядоченную пару вещественных чисел одинарной точности.
Комплексное число типа COMPLEX(8) (DOUBLE COMPLEX) -
упорядоченная пара вещественных чисел двойной точности. Например:
complex(4) :: c, z = (3.0, 4.0) |
|
|
c = z / 2 |
! |
(1.50000, 2.00000) |
Первый компонент пары представляет действительную, а второй - мнимую части числа. Оба компонента комплексного числа имеют одну и ту же разновидность типа.
Синтаксис оператора объявления объектов комплексного типа: COMPLEX [([KIND =] kind-value)] [[, attrs] ::] entity-list
3.2.4. Объявление данных логического типа
Объекты логического типа объявляются оператором
LOGICAL [([KIND =] kind-value)] [[, attrs] ::] entity-list
Разновидность типа может принимать значения 1, 2 и 4 и совпадает с длиной логической величины в байтах. Задаваемую по умолчанию
53