Информационные системы ускорителей

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

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

ВВЕДЕНИЕ

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

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. Встроенные функции Фортрана

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

4.5 Операции с массивами

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


unix-workdir

Пример 4.12. Объявление и инициализация массива констант с указанием верхней границы.

program OPERARR1
integer, parameter, dimension(5):: A = (/ 0, 1, 2, 3,4/), B = (/5, 6, 7, 8, 9/)
integer, dimension(5):: C, D, E, F, G
C = A + B; D = A – B; E = A * B; F = A / B; G = A**B
print*, A; print*, B; print*, C; print*, D; print*, E;  print*, F;  print*, G
end
	

Бинарная операция, примененная к двум массивам, имеет такой же результат, как если бы эта операция была попарно применена к элементам первого и второго массива с одинаковыми номерами (индексами). Это легко можно увидеть на примере арифметических операций (Таблица 4.2) между одномерными (Пример 4.12) и двумерными (Пример 4.13) массивами вещественных чисел – т.е. операции с массивами не имеют ничего общего с операциями над матрицами или векторами.

Допускаются бинарные операции между массивами и скалярами. Действие бинарной операции между массивом и скаляром равноценно совокупности операций между скаляром и всеми элементами массива – например операция умножения суммарного массива A+B (Пример 4.13) на скалярную переменную X = 2 равноценна удвоению каждого элемента этого массива. Действие унарных операций (например, унарный минус) имеет аналогичный характер.


unix-workdir

Пример 4.13. Объявление и инициализация массива констант с указанием верхней границы.

program OPERARR2
integer, parameter, dimension(2, 2):: A = RESHAPE ((/ 0, 1, 2, 3 /), (/2, 2/) )
integer, parameter, dimension(2, 2):: B = RESHAPE ((/ 4, 5, 6, 7 /), (/2, 2/) )
integer, dimension(2, 2):: C; integer :: X = 2
C = X*(A+B)
I=1; print*, (A(I, J), J = 1, 2); I=2; print*, (A(I, J), J = 1, 2)
I=1; print*, (B(I, J), J = 1, 2); I=2; print*, (B(I, J), J = 1, 2)
I=1; print*, (C(I, J), J = 1, 2); I=2; print*, (C(I, J), J = 1, 2)
end
		

Для пояснения текста программы (Пример 4.13) полезно напомнить, что для инициализации массивов A и B используется функция RESHAPE – позволяющая переформатировать одномерные массивы к требуемой форме.

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