Функція - це блок коду, який виконує певну задачу, має ім'я і може бути викликаний з інших частин програми за ім’ям.
Функції дозволяють структурувати і повторно використовувати той самий код, покращують його читаність.
Опис функції – це власне код цієї функції.
Виклик функції — це звернення до функції за ім’ям, при якому програма передає керування цієй функції для виконання її коду. Після завершення функції, керування передається назад, у програму, що викликала функцію, і оперативна пам'ять, яку займала функція, звільняється.
Якщо функція описана, але не викликана, вона не виконується.
Існують: головна функція, стандартні функції, функції, написані користувачем.
Ця функція називається main. З неї починається виконання програми. Із неї викликаються інші функції.
int main() // Головна функція програми
{
// Основний код програми буде розміщений тут
return 0; // Повертаємо 0 при успішному завершенні програми
}
Стандартні функції описані у стандартній бібліотеці або інших бібліотеках.
Для виклику стандартної функції потрібно за допомогою директиви #include підключити бібліотеку, в якій описана ця функція, а в тілі програми викликати цю функцію за ім'ям.
Наприклад, підключаємо бібліотеку
У цьому випадку, опис та виклик функції знаходяться у тому ж файлі, що і головна програма.
Якщо потрібно викликати цю функцію в іншій програмі, то код функції потрібно копіювати.
Наприклад,
int NumDiv(int n) // Заголовок функції, n - вхідний параметр
{
// Тіло функції
if (n <= 0) return -1; // Якщо число менше або дорівнює 0, повертаємо -1
int k = 0; // Лічильник дільників
// Перебір всіх можливих дільників від 1 до n
for (int i = 1; i <= n; i++)
{
if (n % i == 0) // Якщо i є дільником n
{
k++; // Збільшуємо лічильник
}
}
return k; // Повертаємо кількість знайдених дільників
}
Ця функція знаходить кількість дільників натурального числа n.
Описи функцій користувача можуть бути розташовані в різних місцях. Ми будемо використовувати лише один вид розташування.
Перед main будемо описувати прототип функції (тільки заголовок, потім крапка з комой). При описі заголовка обов'язково вказувати типи параметрів, імена вказувати необов'язково.
Повний опис функції (весь код) будемо розташовувати після main.
Наприклад,
#include <iostream> // Підключення бібліотеки введення/виведення
using namespace std;
int NumDiv(int n); // Прототип функції
int main() // Головна функція програми
{
int x = 23, k; // Ініціалізація змінних
k = NumDiv(x); // Виклик функції для підрахунку дільників
cout << k; // Виведення результату
return 0; // Завершення програми
}
int NumDiv(int n) // Функція підрахунку дільників числа
{
if (n <= 0) return -1; // Обробка некоректного вхідного значення
int k = 0; // Лічильник дільників
// Цикл для перевірки всіх можливих дільників
for (int i = 1; i <= n; i++)
{
if (n % i == 0) // Якщо i є дільником n
{
k++; // Збільшуємо лічильник
}
}
return k; // Повертаємо кількість дільників
}
У тілі функції, як правило, немає операторів введення та виведення. Вхідні дані надходять через параметри, результат повертається в точку виклику функції (main або іншу функцію) командою return.
У попередньому прикладі вхідні дані це ціле число n, яке є параметром. Воно описано у заголовку і всередині функції не описується.
Функція повертає:
Тип змінної в return і тип значення, що повертається в заголовку функції повинні збігатися.
Функція – це інша програма і в ній можуть використовуватись будь-які імена змінних.
Змінні в середині функції можуть мати такі ж імена, що і змінні в головній функції, і в інших функціях.
Змінні з однаковими іменами у різних функціях – це різні змінні.
Коли функція завершує свою роботу, змінні, описані в ній, перестають існувати.
Формальні параметри — це параметри, які вказуються у заголовку функції під час її опису.
Фактичні параметри — це параметри, які вказуються під час виклику функції.
Імена формальних та фактичних параметрів можуть бути однаковими, а можуть бути різними. Типи формальних та фактичних параметрів обов'язково повинні збігатися.
При виклику функції формальні параметри замінюються фактичними. Це означає, що значення фактичного параметра присвоюється формальному параметру.
У нашому прикладі:
У описі функції int NumDiv(int n) формальний параметр n.
Під час виклику функції k=NumDiv(x) фактичний параметр x=23.
При цьому значення x=23 присвоюється змінній n і функція працює для n =23. Вона обчислює значення k, яке повертається до основної програми оператором return k. На цьому функція завершує свою роботу і управління передається в main.
Отримане значення k присвоюється в main теж змінної k. Ця змінна могла мати й інше ім'я. Потім результат виводиться на екран.
Такий спосіб передачі параметрів називається передачею параметрів за значенням.
Загалом, існують такі способи передачі параметрів:
Кожен із цих способів має свої переваги та підходить для різних ситуацій залежно від вимог до змінюваності параметрів та продуктивності програми.
Коли буде необхідно, ми докладно розглянемо і використовуватимемо другий і третій способи передачі параметрів, а поки використовуватимемо перший спосіб.
Чиста функція: