Цикл довузовской подготовки кафедры ЭФУ

ЛАБОРАТОРНЫЙ ПРАКТИКУМ:
«ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ»

СТРУКТУРА ПРАКТИКУМА

ВВЕДЕНИЕ

ВАЖНАЯ ИНФОРМАЦИЯ

1. ПРАВИЛА ЗАПИСИ ПРОГРАММЫ

1. Набор символов Фортрана

2. Форматы записи программы

3. Фиксированный формат

4. Свободный формат

2. ТРАНСЛЯЦИЯ ПРОГРАММЫ

1. Программа в одном исходном файле

2. Трансляция исходного файла

3. Трансляция нескольких исходных файлов

4. Трансляция модулей

3. КОНЦЕПЦИЯ ДАННЫХ ЯЗЫКА ФОРТРАН

1. Имена (идентификаторы)

2. Понятие типа

3. Буквальные константы

4. Разновидности типов и диапазоны значений

5. Скалярные переменные и константы

6. Массивы

7. Производные типы данных

4. ВЫРАЖЕНИЯ И ПРЕОБРАЗОВАНИЕ ТИПОВ

1. Скалярное присваивание

2. Арифметика Фортрана

3. Логические выражения

4. Работа с текстовыми строками

5. Операции с массивами

5. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ

1. Условный оператор и конструкция IF

2. Оператор варианта – конструкция CASE

3. Циклы – разновидности конструкции DO

4. Оператор GO TO

6. ВВОД/ВЫВОД ДАННЫХ

1. Простейшие операции ввода/вывода

2. Форматный ввод/вывод данных

3. Ввод/вывод массивов в неявных циклах

4. Файловый ввод/вывод

7. ПРОГРАММНЫЕ КОМПОНЕНТЫ И ЭЛЕМЕНТЫ ООП

1. Структура программных компонентов

2. Внешние подпрограммы

3. Внутренние подпрограммы

4. Модули как библиотеки производных типов

5. Встроенные функции Фортрана

ЗАДАЧИ ДЛЯ ПРОГРАММИРОВАНИЯ

7.4. Модули как библиотеки производных типов

В Фортране 90/95 модули используются хранения глобальных данных и как контейнер производных типов. В данном учебном пособии рассматривается именно последнее назначение модулей. В контексте использования модуля как контейнера производных типов его структура имеет общий вид:

MODULE имя модуля
...описание производных типов
...описание интерфейсов внутренние подпрограммы модуля
CONTAINS
...внутренние подпрограммы модуля
END имя модуля

В качестве примера рассмотрим создание производного типа VECTOR – обеспечивающего работу с векторами, лежащими на плоскости (x, y) и начало каждого вектора совпадает с началом координат (0, 0). Каждый такой вектор может быть описан конечной точкой, с координатами (X, Y). В соответствии с правилами векторной алгебры и аналитической геометрии могут быть описаны такие операции над векторами, как умножение вектора на число, сумма (разность) и т.д. В качестве примера реализуем операцию сложения данных типа VECTOR так, чтобы для трех векторов этого типа A, B и C с точки зрения Фортрана была правомерна операция сложения: «C=A+B». Это означает, что нужно создать задаваемую скалярную операцию сложения, с обозначением «+» для производного типа данных VECTOR.

Дело в том, что для производных типов данных не существует заведомо определенных операций – доступны операции только с элементами структуры, поскольку они являются данными встроенных типов, и для них определены соответствующие покомпонентные операции, что-то вроде:

C%X = A%X + B%X

C%Y = A%Y + B%Y

Модуль с реализацией типа VECTOR и векторной арифметики (Пример 7.6) так и называется: VECTOR_ARITHMETIC.


Пример 7.6. Модуль – контейнер векторной арифметики.

module VECTOR_ARITHMETIC
	type VECTOR
		real X, Y
	end type VECTOR
	interface operator(+)
		module procedure  ADD_VECTORS
	end interface
contains
	function ADD_VECTORS(A,B)
		type(VECTOR) ADD_VECTORS 
		type(VECTOR), intent(in)  :: A, B
		ADD_VECTORS%X = A%X +B%X
		ADD_VECTORS%Y = A%Y +B%Y
	end function ADD_VECTORS
end module VECTOR_ARITHMETIC
	

Описание производных типов следует в модулях сразу после заголовка. Тип VECTOR объявлен в соответствии с правилами объявления производных типов (п.3.7) и имеет в своей структуре два вещественных компонента – «X» и «Y» или, в геометрической интерпретации, координаты конца вектора.

Для создания операции сложения для элементов типа VECTOR нужно сделать две вещи – написать функцию, которая будет заниматься покомпонентным сложением, и связать ее с интерфейсом, виде знака плюс (если не нравится плюс – можно использовать обозначение любой встроенной операции Фортрана или последовательность букв, не длиннее 31, ограниченную точками – предположительно – .PLUS.).

Тип функции сложения (ADD_VECTORS – название произвольное) и возвращаемое ею значение, должно иметь должен быть таким же, как у слагаемых A и B – т.е. VECTOR.

Поскольку операция сложения бинарная, то входными параметрами функции с атрибутом INTENT(IN) объявлены два входных параметра: A и B.

При описании унарной операции потребуется только один входной параметр.

Функция ADD_VECTORS реализует операцию сложения на компонентном уровне: ADD_VECTORS%X = A%X +B%X и т.д., поскольку компоненты типа VECTOR являются вещественными и для них определена операция сложения вещественных чисел, а интерфейсный блок (INTERFACE ... END INTERFACE) связывает функцию ADD_VECTORS, являющуюся внутренней модульной процедурой с оператором «плюс».

Любой модуль должен располагаться в отдельном файле, название которого должно совпадать с названием модуля, а расширение зависит от компилятора – для компилятора Gfortran созданный модуль VECTOR_ARITHMETIC должен быть помещен в отдельный файл c именем «vector_arithmetic» и расширением «f95». Ограничений на имена программ и программных компонентов, использующих модули, не существует.


Пример 7.7. Использование модуля в программе.

program VECTOR_TEST
use  VECTOR_ARITHMETIC
type (VECTOR) :: A = VECTOR(1., 2.), B = VECTOR(3., 4.), C
C = A + B
print*, A; print*, B; print*, C
end
	

Чтобы использовать модуль в других программе и программных компонентах необходимо объявить об его использовании при помощи оператора USE (Пример 7.7). Подключив, таким образом, модуль VECTOR_ARITHMETIC можно объявлять переменные типа VECTOR, не описывая структуру типа и применять к переменным операции, определенные в модуле.

Два файла – с модулем и тестирующей программой необходимо правильно скомпилировать для получения запускаемой программы, для этого необходимо внимательно изучить специально посвященный этому п. 2.4 (§ 2).

В качестве упражнения и тренировки работы с модулями, полезно дополнить созданный модуль VECTOR_ARITHMETIC другими стандартными векторными операциями – такими, как скалярное и векторное произведение и т.д.