Неактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зіркаНеактивна зірка
 

Розділ 8. Підпрограми

8.1. Поняття підпрограми

Коли програма стає великого обсягу і складною для сприйняття, виникає потреба розділити її на невеликі логічні частини, кожна з яких буде виконувати певне завдання. Ці частини програми утворюють функції. Створення функцій дає змогу уникнути створення двох чи бі­льшої кількості достатньо схожих фрагментів програмного коду для розв’язання однакових завдань із різними вхідними даними. Як наслідок, програма стає більш зрозумілою і простішою при відлагодженні.

Функцією називають незалежну частину програми, яка має власну назву і може викликатися з інших частин програми багато ра­зів, маніпулювати даними та повертати результат. Іншими словами функцією є група операторів, які в сукупності виконують певне завдання. Терміном “функція” ще називають метод, підпрограму, процедуру тощо.

Кожна C-програма має принаймні одну функцію – функцію main(). Крім неї, програма може містити необмежену кількість функцій, створених користувачем.

Існує два основні види функцій:

1)    стандартні (вбудовані) функції;

2)    функції, які створюються користувачем.

Кожна функція складається з таких частин:

  • тип результату;
  • ім’я функції;
  • список параметрів;
  • тіло функції.

Створена у програмі функція повинна бути оголошена і визначена. Оголошення функції повідомляє компілятор як її викликати, а визначення (реалізація) функції описує її тіло.

Виконання функції починається тоді, коли у тексті програми зустрічається оператор виклику цієї функції, тобто ім’я функції з фактичними параметрами у дужках. При цьому формальні параметри послідовно отримують значення фактичних: значен­ня першого фактичного аргумента копіюється у перший формальний аргумент, другий фактичний – у другий формальний і т.д. Тому дуже важливими є кількість, поря­док запису та відповідність типів усіх аргументів, інакше можуть виникнути помилки. Таким чином послідовність змінних, які є фактичними параметрами, має співпадати з послідовністю формальних параметрів.

При виклику функції у першу чергу обчислюються вирази, які стоять на місці фактичних параметрів; потім у стеку виділяється пам’ять під формаль­ні параметри функції відповідно до їхнього типу і кожному з них присвоюється значення відповідного фактичного параметра. При цьому перевіряється відповідність типів і, за потреби, виконуються їхні перетворення. При невідповідно­сті типів видається відповідне повідомлення.

Правила організації функцій:

  1. Фактичними параметрами можуть бути константи, змінні та вирази. Якщо фактичним параметром є вираз, то спочатку обчислюється його значення, а потім результат пе­редається у функцію.
  2. Типи змінних, які є фактичними параметрами, мають співпадати з типа­ми відповідних формальних параметрів або мають бути перетворе­ні до типів відповідних формальних параметрів.
  3. Імена змінних, які є фактичними параметрами, можуть відрізнятися від імен формальних параметрів.
  4. Тип значення, яке повертає функція, може бути масивом чи функцією. Якщо функція має повернути масив, то її тип можна оголосити як вказівник на перший елемент масива, при цьому кількість його елементів має бути відомою:

int* func();

  1. У програмі може бути декілька функцій з однаковим ім’ям, але з різ­ними параметрами.

8.2. Параметри та їх види

Оголошення функції описується за допомогою прототипу і має бути описане раніше за її виклик. Прототип функції не містить інформації про внутрішню будову функції, він описує лише її зовнішній вигляд, тобто як до неї звертатися. Тому, щоб мати змогу викликати функцію, транслятор наперед повинен знати її ім’я, тип результату, кількість і типи аргументів.

Прототип функції має такий формат:

<тип_результату> <ім’я_функції> ([<список_параметрів>]);

Список параметрів описується так:

<тип_параметра_1> [<параметр_1>]

[, <тип_параметра_2> [<параметр_2>]

...

[, <тип_параметра_N> [<параметр_N>]

Значення змінних, які передаються у функцію при виклику, називаються фактичними параметрами або аргументами, а параметри, оголошені у функції, що приймають значення аргументів функції, називаються формальними параметрами функції або параметрами.

Формальні параметри є звичайними локальними змінними функції, які створюються при вході у функцію і знищуються при виході з неї.

Якщо функція не повертає жодного значення, то типом її результату є тип void. В інших випадках типом результату функції є певний тип даних.

Якщо функція не має формальних параметрів, то вказують, що вона має один параметр типу void або ж позначають парою порожніх дужок, при цьому дужки є обов’язковими.

Приклад 8.1. Оголошення функцій (прототипи функцій).

/* функція не повертає значення і не містить аргументів */

void f1(void)

void f2()

/* функція не повертає значення, але містить два аргументи типу int */

void f3(int, int)

/* функція повертає значення типу int і не містить аргументів */

int f4(void)

int f5()

/* функція не повертає значення, але містить два аргументи типу int */

void f3(int, int)

/* функція повертає значення типу double
і містить два аргументи типу int */

double middle(int a, int b);

В оголошенні функції імена формальних параметрів вказувати необов’язково, а от їхні типи – обов’язково:

double middle(int, int);

Прототип функції може бути розміщений як безпосередньо у програмі, так і в заголовочному файлі.

Якщо програмний код знаходиться в одному файлі, то всі прототипи функцій рекомендується оголошувати на його початку, одразу ж після директив #include, але перед усіма визначеннями функцій. Якщо програма складається з кількох модулів, то прототипи функцій розміщаються в заголовочних файлах, які мають розширення .h, і підключаються директивою #include.

Крім оголошення, кожна функція повинна мати своє визначення. Визначення функції складається із заголовка та тіла. Заголовок функції фактично дублює інформацію з прототипу функції, а в її тілі описується алгоритм, за яким вона працює та обчислює результат.

Визначення функції має такий формат:

<тип_результату> <ім’я_функції> ([<список_параметрів>]){

<тіло_функції>

}

Список параметрів описується так:

<тип_параметра_1> <параметр_1>[= <значення_1>]

[, <тип_параметра_2> <параметр_2>[= <значення_2>]]

...

[, <тип_параметра_N> <параметр_N>[= <значення_N>]]

ВАЖЛИВО: порядок визначення функцій у програмі не має жодного значення. Функції виконуються не в тому порядку, як записані їхні тіла, а в тому, як вони викликаються.

Визначення функції може розташовуватись у будь-якому місці програми, за винятком тіла інших функцій, у тому числі функції main().

Добрим стилем програмування вважається на початку програмного коду оголошувати функції, а після функції main() їх визначати.

У функціях, що не повертають жодного значення, оператор повернення не записується взагалі або записується без жодного значення, але із крапкою з комою (return;).

Приклад 8.2. Написати функцію, що виводить на екран повідомлення і не повертає жодного результату:

 

(Для ознайомлення з повним текстом статті необхідно залогінитись)