
- •Предисловие
- •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. Управление операциями с плавающей точкой
- •Литература
- •Предметный указатель
- •Оглавление

4. Массивы
end function fap end
Замечания:
1. Если оформить функцию fap как внешнюю, то к ней нужно в вызывающей программной единице явно задать интерфейс:
interface function fap(a, n) integer n
real fap(n)
real, dimension(:) :: a end function fap
end interface
2. Ту же задачу можно решить, не создавая довольно громоздкой функции fap, а дважды вызвав встроенную функцию PACK (разд. 4.12.4.2):
ap = pack(a, a > 0) + pack(b, b > 0)
Однако если длина возвращаемых функцией PACK массивов меньше n, часть элементов массива ap будет не определена, а результат - непредсказуем.
Функции, возвращающие массив, называют массивоподобными функциями. Из примера видно, что массивоподобные функции могут быть, как и обычные функции, операндами выражений.
4.12. Встроенные функции для массивов
В Фортран встроено большое число функций, позволяющих:
•выполнять вычисления в массивах, например находить максимальный элемент массива или суммировать его элементы;
•преобразовывать массивы, например можно получить из одномерного массива двумерный;
•получать справочные данные о массиве (размер, форма и значения границ каждого измерения).
Вызов любой функции для массивов может быть выполнен с ключевыми
словами, в качестве которых используются имена формальных параметров. Вызов с ключевыми словами обязателен, если позиции соответствующих фактического и формального параметров не совпадают.
Параметрами всех рассматриваемых в разделе функций могут быть и сечения массивов.
Некоторые функции возвращают результат стандартного целого или логического типа. По умолчанию значение параметра разновидности для этих типов KIND равно четырем. Однако если задана опция компилятора /4I2 или директива $INTEGER:2, значение разновидности стандартного целого и логического типов будет равно двум.
139

О. В. Бартеньев. Современный ФОРТРАН
Как и ранее, необязательные параметры функций обрамляются квадратными скобками.
4.12.1. Вычисления в массиве
ALL(mask [, dim]) - возвращает .TRUE., если все элементы логического массива mask вдоль заданного (необязательного) измерения dim истинны; в противном случае возвращает .FALSE.
Результатом функции является логический скаляр, если mask одномерный массив или опущен параметр dim (в этом случае просматриваются все элементы массива mask). Иначе результатом является логический массив, размерность которого на единицу меньше размерности mask. Разновидности типа результата и mask совпадают.
Параметр dim - целое константное выражение (1 ≤ dim ≤ n, где n - размерность массива mask). Параметр dim, если он задан, означает, что действие выполняется по всем одномерным сечениям, которые можно задать по измерению с номером dim. Функция вычисляет результат для каждого из сечений и заносит в массив на единицу меньшего ранга с экстентами, равными экстентам по остальным измерениям. Так, в двумерном массиве mask(1:2, 1:3) по второму измерению (dim = 2) можно задать два одномерных сечения: mask(1, 1:3) и mask(2, 1:3). Поэтому для хранения результата функции ALL(mask, 2) следует использовать одномерный логический массив из двух элементов.
ANY(mask [, dim]) - возвращает .TRUE., если хотя бы один элемент логического массива вдоль заданного (необязательного) измерения dim истинен; в противном случае функция возвращает .FALSE.
Результат функции и действие параметра dim определяются по тем же правилам, что и для функции ALL.
COUNT(mask [, dim]) - возвращает число элементов логического массива mask, имеющих значение .TRUE. вдоль заданного необязательного измерения dim. Результат функции имеет стандартный целый тип. Правила получения результата и действие параметра dim такие же, как и для функции ALL.
Для функций ALL, ANY, COUNT:
Пример 1:
logical ar1(3), ar2(2) |
|
! Массивы для хранения результатов |
logical mask(2, 3) / .true., .true., .false., .true., .false., .false. / |
||
! Массив mask: |
.true. |
.false. .false. |
! |
.true. |
.true. .false. |
ar1 = all(mask, dim = 1) |
! Оценка элементов в столбцах массива |
|
print *, ar1 |
|
! T F F |
ar2 = all(mask, dim = 2) |
! Оценка элементов в строках массива |
|
print *, ar2 |
|
! F F |
140

4. Массивы
print *, any(mask, dim = 1) |
! T T F |
|
|
|
print *, any(mask, dim = 2) |
! T T |
|
|
|
print *, count(mask, dim = 1) |
! |
2 |
1 |
0 |
print *, count(mask, dim = 2) |
! |
1 |
2 |
|
end |
|
|
|
|
Пример 2. Если хотя бы один элемент второго столбца матрицы a меньше нуля, напечатать число положительных элементов ее первой строки.
integer a(4, 5) |
|
|
|
a = 2; |
|
! Инициализация массива |
|
a(2, 2) |
= 0 |
! Теперь второй элемент второго столбца равен нулю |
|
a(1, 3) |
= -1 |
! Теперь третий элемент первой строки меньше нуля |
|
if(any(mask = a(:, 2) == 0)) print *, count(a(1, :) > 0) |
|||
end |
|
! |
4 |
MAXLOC(array [, dim] [, mask]) - возвращает индексы максимального элемента массива array или максимальных элементов по заданному измерению dim. Значение каждого максимального элемента удовлетворяет заданным (необязательным) условиям mask. Если несколько элементов содержат максимальное значение, то берется первый по порядку их следования в array. Результат MAXLOC, если не задан параметр dim, записывается в одномерный массив, размер которого равен числу измерений array.
Параметр mask является логическим массивом, форма которого совпадает с формой массива array. Массив mask может получаться в результате вычисления логического выражения. Если массив задан, то действие функции распространяется только на те элементы массива array, для которых значение mask равно .TRUE. Если же параметр mask опущен, то действие функции распространяется на все элементы массива array.
Значения индексов берутся так, словно все нижние границы массива array равны единице. Если же маска такова, что наибольший элемент не может быть найден, то возвращаемые значения индексов превышают верхнюю границу каждой размерности массива array.
Если параметр dim задан, то:
•массив-результат имеет ранг, на единицу меньший ранга массива array,
и форму (d1, d2, ..., ddim - 1, ddim + 1, ..., dn), где (d1, d2, ..., dn) - форма массива array;
•если array имеет ранг, равный единице, то MAXLOC(array, dim [, mask]) возвращает то же, что и функция MAXLOC(array [, MASK = mask]);
иначе значение элемента (s1, s2, ..., sdim - 1, sdim + 1, ..., sn) результата функции MAXLOC(array, dim [, mask]) равно MAXLOC(array(s1, s2, ...,
sdim - 1, sdim + 1, ..., sn), [, MASK = mask(s1, s2, ..., sdim - 1, sdim + 1, ..., sn)]).
141

О. В. Бартеньев. Современный ФОРТРАН
MINLOC(array [, dim] [, mask]) выполняет те же действия, что и MAXLOC, но для минимальных элементов массива array. Смысл параметров dim и mask такой же, что и для функции MAXLOC. Значения индексов берутся так, словно все нижние границы массива array равны единице. Если же маска такова, что наименьший элемент не может быть найден, то возвращаемые значения индексов превышают верхнюю границу каждой размерности массива array.
Замечание. Необязательный параметр dim добавлен в функции MAXLOC и MINLOC стандартом 1995 г.
Пример для функций MAXLOC и MINLOC:
integer ir, maxf(1)
integer arra(3, 3) /7, 9, -1, -2, 5, 0, 3, 6, 9/ integer, allocatable :: ar1(:)
! Массив arra: |
7 |
-2 |
3 |
! |
9 |
5 |
6 |
! |
-1 |
0 |
9 |
ir = size(shape(arra)) |
|
! Ранг массива array (ir = 2) |
|
allocate(ar1(ir)) |
|
|
|
!Найдем в массиве array индексы наибольшего, но меньшего семи элемента ar1 = maxloc(arra, mask = arra < 7)
!Результатом выражения mask = arra < 7 является массив mask
!такой же формы, которую имеет и массив arra. Элементы массива mask имеют
!значение .TRUE., если соответствующий элемент массива arra меньше семи,
!и .FALSE. - в противном случае. Благодаря такой маске функция
!MAXLOC возвращает индексы максимального, но меньшего семи элемента
! Массив arra: |
7 |
-2 |
3 |
Массив mask: |
.false. |
.true. |
.true. |
! |
9 |
5 |
6 |
|
.false. |
.true. |
.true. |
! |
-1 |
0 |
9 |
|
.true. |
.true. |
.false. |
print *, ar1 |
! |
2 |
3 |
print *, minloc(arra, mask = arra > 0) |
! |
1 |
3 |
maxf = maxloc((/ 1, 4, 1, 4 /)) |
|
|
|
print *, maxf |
! |
2 (индекс первого максимума) |
|
print *, minloc((/ 1, 4, 1, 4 /)) |
! |
1 (индекс первого минимума) |
|
end |
|
|
|
Пример для функции MAXLOC с параметром dim:
integer(4), parameter :: m = 3, n = 5 real(4) :: a(m, n)
integer ip(n)
a = reshape((/ |
3.0, |
4.0, |
5.0, |
6.0, |
7.0, |
& |
|
2.0, |
3.0, |
4.0, |
5.0, |
6.0, |
& |
|
1.0, |
2.0, |
3.0, |
4.0, |
5.0 |
/), shape = (/ m, n /), order = (/ 2, 1 /)) |
142

4. Массивы
ip = maxloc(array = a, mask = a < 5, dim = 1) |
|
|
|
|
|
|
print *, ip |
! |
1 |
1 |
2 |
3 |
0 |
MAXVAL(array [, dim] [, mask]) - возвращает максимальное, удовлетворяющее необязательной маске mask значение целочисленного или вещественного массива array вдоль заданного необязательного измерения dim.
Смысл параметра dim разъяснен при описании функции ALL, а параметра mask - при описании функции MAXLOC.
Возвращаемое значение имеет тот же тип и разновидность типа, что имассив array. Если параметр dim опущен или массив array одномерный, то результатом функции MAXVAL является скаляр, в противном случае результатом является массив, ранг которого на единицу меньше ранга массива array.
Если размер массива 0 или все элементы массива mask равны .FALSE., то функция MAXVAL возвращает наибольшее по абсолютной величине отрицательное допускаемое процессором число.
MINVAL(array [, dim] [, mask]) - возвращает минимальное, удовлетворяющее необязательной маске mask значение целочисленного или вещественного массива array вдоль заданного необязательного измерения dim.
Смысл параметра dim разъяснен при описании функции ALL, а параметра mask - при описании функции MAXLOC.
Возвращаемое значение имеет тот же тип и разновидность типа, что и массив array. Если параметр dim опущен или массив array одномерный, то результатом функции MINVAL является скаляр, в противном случае результатом является массив, ранг которого на единицу меньше ранга массива array.
Если размер массива 0 или все элементы массива mask равны .FALSE., то функция MINVAL возвращает наибольшее положительное допускаемое процессором число.
Пример для функций MAXVAL и MINVAL:
integer array(2, 3), isha(2), max integer, allocatable :: ar1(:), ar2(:)
array = reshape((/1, 4, 5, 2, 3, 6/), (/2, 3/))
! Массив array: |
1 |
5 |
3 |
|
|
! |
4 |
2 |
6 |
|
|
isha = shape(array) |
|
|
|
! isha = (2 3) |
|
allocate(ar1(isha(2))) |
|
|
! isha(2) = 3 - число столбцов в массиве |
||
allocate(ar2(isha(1))) |
|
|
! isha(1) = 2 - число строк в массиве |
||
max = maxval(array, mask = array < 4) |
! Возвращает 3 |
|
|||
ar1 = maxval(array, dim = 1) |
! Возвращает (4 |
5 6) |
|||
ar2 = maxval(array, dim = 2) |
! Возвращает (5 |
6) |
|||
print *, minval(array, mask = array > 3) |
! 4 (ключевое слово mask обязательно) |
143

О. В. Бартеньев. Современный ФОРТРАН
print *, minval(array, dim = 1) |
! |
1 |
2 |
3 |
print *, minval(array, dim = 2) |
! |
1 |
2 |
|
! В следующем вызове все ключевые слова опущены
print *, minval(array, 1, array /= 2) |
! |
1 |
5 |
3 |
end |
|
|
|
|
PRODUCT(array [, dim] [, mask]) - вычисляет произведение всех элементов целочисленного или вещественного массива вдоль необязательного измерения dim. Перемножаемые элементы могут отбираться необязательной маской mask.
Смысл параметра dim разъяснен при описании функции ALL, а параметра mask - при описании функции MAXLOC.
Возвращаемый функцией результат имеет тот же тип и разновидность типа, что и массив array.
Если размер массива array равен нулю или все элементы массива mask равны .FALSE., то результат функции равен единице.
SUM(array [, dim] [, mask]) - вычисляет сумму всех элементов целочисленного или вещественного массива вдоль необязательного измерения dim. Суммируемые элементы могут отбираться необязательной маской mask.
Смысл параметра dim разъяснен при описании функции ALL, а параметра mask - при описании функции MAXLOC.
Возвращаемый функцией результат имеет тот же тип и разновидность типа, что и массив array.
Если размер массива array равен нулю или все элементы массива mask равны .FALSE., то результат функции равен нулю.
Пример для функций PRODUCT и SUM:
integer arra (2, 3) /1, 4, 2, 5, 3, 6/ integer ar1(3), ar2(2)
! Массив array: 1 2 3
! |
4 5 6 |
|
|
|
|
ar1 = product(arra, dim = 1) |
! Произведение по столбцам |
||||
print *, ar1 |
|
! |
4 |
10 |
18 |
ar2 = product(arra, mask = arra < 6, dim = 2) |
|
|
|
|
|
print *, ar2 |
|
! |
6 |
20 |
|
print *, sum(arra, dim = 1) |
! |
5 |
7 |
9 |
|
ar2=sum(arra, mask = arra < 6, dim = 2) |
! Суммирование по строчкам |
||||
print *, ar2 |
|
! |
6 |
9 |
|
! Произведение сумм столбцов матрицы: (1 + 4) * (2 + 5) * (3 + 6) |
|||||
print *, product(sum(arra, dim = 1)) |
! |
315 |
|
|
|
end |
|
|
|
|
|
144