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 – фактичні параметри. Оператор звертання – викон