7. Функції та підпрограми
Часто виникає необхідність використання одного і того ж фрагменту у різних частинах програми. Змінюватися повинні лише значення параметрів цього фрагменту. Тривіально було б включити цей фрагмент у відповідні місця програми, однак це супроводжується затратами часу на програмування і відлагодження та нераціональним використанням пам’яті комп’ютера внаслідок суттєвого видовження програми. Оформлення такого фрагменту у вигляді підпрограми, підпрограми-функції чи оператора-функції дає можливість зекономити час і пам’ять. При такому оформленні фрагмент записується один раз, а у відповідні місця програми вставляються лише звертання до цього фрагменту.
7.1. Оператор-функція
Оператор-функція складається з одного оператора. Він має вигляд:
f (a1, a1, …, an) = e
Тут f – ім’я функції; a1, a1, …, an – імена формальних параметрів; e – вираз. Функція і кожен формальний параметр мають тип. Тип може бути заданий неявно чи за допомогою оператора описання типу. У виразах e можуть входити константи, формальні параметри, змінні та звертання до підпрограм-функцій. В e не можуть входити елементи масивів і звертання до того ж самого оператора-функції.
Приклади операторів-функцій:
Оператор описання типу та оператор-функція
Тип оператора-функції

FORM(A, B, C) = A–B/C+COS(A*B)–5.3
Дійсний

INTEGER FUN
FUN(K, M1) = 2*K1–ALJG(M1)

Цілий

LOGICAL LG
LG(X,Y,Z) = X .GT. Y .AND. Y .GT. Z

Логічний


Оператори-функції повинні бути розміщеними перед першим виконуваним оператором. На початку виконання програмної одиниці записані у ній оператори-функції пропускаються. Звертання до них відбувається із деяких арифметичних виразів. Для організації такого звертання в арифметичних виразах записується ім’я функції, а далі, у дужках, розділені комами так звані фактичні параметри. Фактичними параметрами можуть служити і вирази. Між формальними та фактичними параметрами повинні зберігатися відповідності у типах, кількості та порядку чергування. У процесі звертання до оператора-функції спочатку обчислюються значення всіх фактичних параметрів. Обчислені значення присвоюються відповідним формальним параметрам (говорять, що відбувається обмін параметрами). Потім обчислюється значення оператора-функції, яке далі використовується у тому виразі, з якого відбулося звертання до даного оператора-функції.
Увага! Оператори-функції можуть використовуватися тільки у тих програмних одиницях, де вони визначені.
Приклади використання операторів-функцій, показаних у попередній таблиці:
D3 = P+FORM(P, R+1.2, –3.25)
TT = FUN(K4, 21)*FORM(–P, 2*R, S)–ABC
H = FORM(FORM(–5.1, R, S), D1, F)
Після кінцевого обміну параметрів перший оператор стає еквівалентним оператору
D3 = P+P–(R+1.2)/(–3.25)+COS(P*(R+1.2))–5.3
В останньому прикладі оператор-функція викликається двічі. Спочатку обчислюється значення виразу FORM(–5.1, R, S). Після цього знову відбувається звертання до того ж оператора-функції при нових значеннях фактичних параметрів. Отримане значення присвоюється змінній Н.
7.2. Підпрограма-функція
Підпрограма-функція – це самостійна програмна одиниця. Вона починається оператором FUNCTION і закінчується оператором END. Підпрограма-функція виконується після звертання до неї з іншої програмної одиниці. Інформація, необхідна для роботи підпрограми-функції, доставляється параметрами. Підпрограми-функції можуть компілюватися окремо від інших програмних одиниць, що надає вигоди при відлагоджуванні програми.
Оператор початкового рядка підпрограми-функції має вигляд:
t FUNCTION f (a1, a1, …, an)
Тут FUNCTION – символ Фортрану; f – ім’я підпрограми-функції; a1, a1, …, an – імена формальних параметрів (n(1); t – оператор описання типу підпрограми-функції. На місці t можуть використовуватися символи INTEGER, REAL, DOUBLE PRECISION, COMPLEX чи LOGICAL, або він може бути упущений. Якщо на місці t вказаний один із перерахованих символів, то цей символ визначає тип підпрограми-функції. Якщо оператор описання типу відсутній, то тип підпрограми-функції заданий неявно, тобто визначається першою буквою його імені. Формальними параметрами можуть бути:
змінна;
масив;
підпрограма;
інша підпрограма-функція.
Формальні параметри (крім імені підпрограми) мають тип. Він може бути заданий неявно чи встановлений оператором описання типу, який розташовується після оператора початкового рядка підпрограми-функції.
Після оператора початкового рядка і операторів описання типу параметрів (якщо такі мають місце) записуються виконувані й невиконувані оператори, які вже описані у попередніх розділах.
Приклади заголовків підпрограм-функцій:
Оператор початкового рядка та оператор описання типу
Тип підпрограми-функції

FUNCTION FUN(X)
Дійсний

FUNCTION ABDM(Z5, B, N)
INTEGER B
Дійсний

FUNCTION MFUN (Y, J, K)
Цілий

INTEGER FUNCTION FUN(X)
Цілий

LOGICAL LG(X, Y, Z)
LOGICAL Y, Z
Логічний

Чи LOGICAL FUNCTION LG(X, Y, Z)????
Всередині підпрограми-функції не можуть знаходитися інші підпрограми-функції, а також підпрограми, однак допустима присутність операторів-функцій, розташованих перед першим виконуваним оператором. Формальні параметри підпрограми-функції не можна вказувати в операторі еквівалентності. Всередині підпрограми-функції її ім’я можна використовувати як змінну. Ім’я підпрограми-функції можна вказувати у виразах. Йому можна присвоювати значення. Якщо формальним параметром виступає ім’я масиву, то воно повинне бути описане всередині підпрограми-функції оператором описання розмірності масиву. Виконання підпрограми-функції починається з першого виконуваного оператора. Дальше виконується другий оператор і т. д. Після виконання оператора повернення RETURN робота підпрограми-функції закінчується.
Підпрограма-функція може мати декілька операторів повертання. Імені функції повинне бути присвоєне значення перед виконуваним оператором повертання.
Приклад підпрограми-функції:
С
С
С
Підпрограма-функція обчислення
скалярного добутку двох векторів



1
FUNCTION SKALAR (X, Y, N)
DIMENSION X(100), Y(100)
S=0.0
DO 1 I = 1, N
S = S+X(I)*Y(I)
SRALAR = S
RETURN
END


Тут SKALAR – ім’я підпрограми-функції; X, Y і N – формальні параметри. Підпрограма-функція і формальні параметри X і Y мають дійсний тип, формальний параметр N має цілий тип. Параметри X і Y є іменами масивів, описаних оператором DIMENSION X(100), Y(100). Перші три виконуваних оператори обчислюють скалярний добуток

Отримане значення присвоюється імені SKALAR підпрограми-функції (див. четвертий виконуваний оператор). П’ятий виконуваний оператор RETURN забезпечує повертання до тієї програмної одиниці, звідки надійшло звертання. Підпрограма-функція закінчується оператором кінцевого рядка END.
7.3. Підпрограма
Підпрограма – самостійна програмна одиниця. Вона починається оператором SUBROUTINE і закінчується оператором END. Виконання підпрограми починається після звертання до неї з іншої програмної одиниці. Інформація, необхідна для роботи підпрограми, поставляється параметрами. Підпрограма може компілюватися окремо від інших програмних одиниць. Підпрограма подібна до підпрограми-функції, однак має і відмінності: одні з найбільших полягають в тому, що ім’я підпрограми не приймає чисельного значення та підпрограма викликається так званим оператором звертання.
Оператор початкового рядка підпрограми має вигляд:
SUBROUTINE s (a1, a1, …, an)
або
SUBROUTINE s
Тут SUBROUTINE – символ Фортрану; s – ім’я підпрограми; a1, a1, …, an – формальні параметри. Сама підпрограма типу не має, а формальні параметри мають тип. У підпрограмі допускаються такі ж види формальних параметрів і ті ж методи їх описування, що і в підпрограмах-функціях.
Приклади заголовків підпрограм:
Оператор початкового рядка та оператор описання типу

SUBROUTINE MMM(A, B, C, M, N, K)

SUBROUTINE GRAD

SUBROUTINE ALPHA (C, B, Z)
INTEGER B
LOGICAL Z


Після оператора початкового рядка і операторів описання типу параметрів записуються виконувані й невиконувані оператори. Підпрограма не може містити в собі інших підпрограм чи підпрограм-функцій, але може включати у себе один чи декілька операторів-функцій. Ім’я підпрограми не може згадуватися в операторах цієї підпрограми, крім, очевидно, оператора початкового рядка. Також ім’я підпрограми не може приймати значень. Формальні параметри не можна вказувати в операторах еквівалентності. У підпрограму повинен входити хоча б один оператор повертання RETURN. Масиви, які є формальними параметрами, повинні бути описані у підпрограмі.
Приклад підпрограми:
С
С
С
Підпрограма множення
матриці на вектор



1
2
SUBROUTINE MATRIX (A, X, Y, N)
DIMENSION A(10,10), X(10), Y(10)
DO 2 I = 1,N
S=0.0
DO 1 J = 1, N
S = S+A(I,J)*X(J)
Y(I) = S
RETURN
END


Підпрограма має чотири параметри. Три із них представлені іменами масивів A, X і Y, а четвертий – іменем змінної N.
Підпрограма викликається оператором звертання, який має вигляд:
CALL s (a1, a1, …, an)
або
CALL s
Тут CALL – символ Фортрану; s – ім’я підпрограми; a1, a1, …, an – фактичні параметри. Оператор звертання – викон