Функції. Що таке функція. Як створити та використовувати
У повсякденному житті зазвичай не вдається виконувати одну роботу не перериваючись на щось інше. Навіть, коли ви відпочиваєте дивлячись телевізор або сидячи за комп’ютером ви все одно можете піти попити води або взяти собі щось смачненьке. Тобто, ви зупиняєте (перериваєте) виконання однієї дії щоб виконати іншу, після чого повертаєтеся до виконання попередньої дії. Аналогічну поведінку може мати програма.
Ми вже знаємо, що дії виконуються по порядку з верху до низу.
#include <iostream>
int main()
{
std::cout << "Action 1\n";
std::cout << "Action 2\n";
std::cout << "Action 3\n";
std::cout << "Action 4\n";
return 0;
}
Для малих програм цього буває цілком достатньо але з часом ваші програми будуть лише збільшуватися. Зовсім скоро вони можуть досягнути сотень, а то і тисяч стрічок коду. В таких ситуаціях вже поміщувати все у буде не то, що а і «дуже поганою ідеєю».
Часто доводиться повторювати один і той же код або буває код який займає багато місця але використовується лише при певних обставинах і майже не зв’язаний з іншою частиною програми. В таких ситуаціях використовують
Функцію варто сприймати як дію: В такий спосіб ви розіб’єте свій день на окремі дії. Функції дозволяють економити час, якщо під час виконання програми вам необхідно виконувати/повторювати декілька разів одні і ті ж дії.
Погляньте на код програм які виконують одне і теж, але перша не використовує функцію, а друга використовує (детальніше ми розберемо пізніше).
Без використання функції:
#include <iostream>
int main()
{
int a, b, c;
std::cout << "Input number\n";
std::cin >> a;
std::cout << "Input number\n";
std::cin >> b;
std::cout << "Input number\n";
std::cin >> c;
std::cout << "a + b + c = " << a + b + c << std::endl;
return 0;
}
З використанням функції:
#include <iostream>
int fun()
{
int num;
std::cout << "Input number\n";
std::cin >> num;
return num;
}
int main()
{
int a, b, c;
a = fun();
b = fun();
c = fun();
std::cout << "a + b + c = " << a + b + c << std::endl;
return 0;
}
Не хвилюйтеся. Ми зараз розберемо як все працює.
Розглянемо як створити функцію:
1. В першу чергу потрібно вказати тип функції. Тип функції це тип змінної яку має повернути функція (значення повертають за допомогою ключового слова та після чого вказують яке має повернути функція). Наприклад, якщо функція має повернути ціле число (або змінну яка є типу ціле число), то і функція має бути типу Якщо функція не має нічого повертати, то вказується тип (в такій ситуації не вказують). Значення яке повертає функція можна присвоїти змінній або використати у програмі.
2. Далі необхідно вказати ім’я функції. Ім’я функції це те ж саме, що ім’я змінної. Тому, не варто їх розпочинати з чисел, символів або писати декількома різними словами. Також не можна використовувати в якості імені функції ключові слова, що є зарезервованими мовою Ім’я функції має символізувати дію яку виконує дана функція.
3. Після іменні функції йдуть круглі дужки. В круглих дужках вказують аргументи функції (детальніше розглянемо цей момент в наступному уроці). Якщо функція не приймає жодних аргументів, то круглі дужки мають залишатися порожніми. яку передають у функцію ззовні. Наприклад, якщо ви пишете функцію яка буде нагадувати випити ліки, то в якості аргументу можна вказати час та назву ліків (актуально тим, кому трішки за
4. Далі нам варто у фігурних дужках написати дії які має виконувати функція.
Зауважимо ще декілька правил яких варто дотримуватися при створенні функції:
1. Функція має бути створена (або оголошена, розглянемо це трішки пізніше) до моменту свого використання. Це цілком логічно. Не можна використати те чого ще не має.
2. Функції мають мати унікальні імена. Єдиний момент, коли функції можуть мати одне і теж ім’я це, коли вони мають різну кількість аргументів (розглянемо це в наступному уроці).
3. Не варто в одну функцію поміщати пів програми. Ви звісно можете так зробити але краще робити за принципом
4. Функції варто використовувати, коли у вашій програмі є код який повторюється декілька разів.
Для того щоб оголосити функцію вам достатньо вказати її тип, ім’я та аргументи в круглих дужках. Після чого поставити крапку з комою, а реалізацію виконати пізніше.
#include <iostream>
int fun(); //оголошення функції
int main()
{
int a, b, c;
a = fun();
b = fun();
c = fun();
std::cout << "a + b + c = " << a + b + c << std::endl;
return 0;
}
int fun() //реалізація функції
{
int num;
std::cout << "Input number\n";
std::cin >> num;
return num;
}
Також, зверніть увагу на рядок Як помітно ми присвоюємо змінній функцію. Так робити можна і це використовується доволі часто. Враховуючи, що функція повертає якесь значення, то ми відповідно присвоюємо його змінній. Ця зміна має бути такого ж типу як і функція.
Якщо вам потрібно використати значення яке повертає функція лише один раз, то можна його не присвоювати ні якій змінні, а просто використати у програмі.
#include <iostream>
int fun()
{
int a;
std::cout << "input number" << std::endl;
std::cin >> a;
return a;
}
int main()
{
if(fun() > 5)
{
std::cout << "Hello!";
}
else
{
std::cout << "Hi!";
}
return 0;
}
Як ми вже вияснили функція може повертати якесь значення. Для цього необхідно вказати тип значення яке має повернути функція (тип функції) та після ключового слова вказати яке має повернути функція.
Але, насправді, у функції може бути декілька ключових слів Це не означає, що функція почне повертати декілька значень.
Давайте розглянемо наступний приклад:
#include <iostream>
int fun()
{
int a = 55, b = 7;
return a;
return b;
}
int main()
{
int c = fun();
int d = fun();
std::cout << "fun = " << fun() << "\nc = " << c << "\nd = " << d << std::endl;
return 0;
}
Якщо ви запустите програму, то побачите, що всі рази було виведено число тобто, значення змінної
Насправді все дуже просто. Якщо програма у функції доходить до то вона виходить із цієї функції і весь код який був після цього просто ігнорується.
Розглянемо це на наступному прикладі:
#include <iostream>
int fun()
{
int a;
std::cout << "input number: ";
std::cin >> a;
//якщо значення "а" є більшим за "17"
if (a > 17)
{
//то ми побачимо цей рядок
std::cout << a << " > 17. the end function" << std::endl;
//та вийдемо з функції
return a;
}
//відповідно, цей рядок ми побачимо лише, коли
//"а" буде меншим-рівним за 17
std::cout << a << " <= 17" << std::endl;
return a;
//цього рядка взагалі не будемо бачити
//бо перед ним є "return" який гарантовано
//спрацює
std::cout << "not see" << std::endl;
}
int main()
{
std::cout << "fun = " << fun() << std::endl;
return 0;
}
Як помітно, коли спрацьовує «return», то програма ігнорує весь наступний код. Тому, вам не виконувати весь код функції щоб вийти з неї. Ви можете використати «return» де вам буде це необхідним.
Також, програма буде працювати і функція завершиться навіть, коли жоден з не спрацює. Але, в такій ситуації ви можете отримати не очікуваний результат.
#include <iostream>
int fun()
{
int a;
std::cout << "input number: ";
std::cin >> a;
//якщо значення "а" є більшим за "17"
if (a > 17)
{
//то ми побачимо цей рядок
std::cout << a << " > 17. the end function" << std::endl;
//та вийдемо з функції
return a;
}
else if(a == 17)
{
//цей рядок ми побачимо лише, коли
//"а" буде рівним 17
std::cout << a << " = 17" << std::endl;
return a;
}
std::cout << "not see" << std::endl;
//хоча тут не має "return" але функція завершиться
//бо програма дійде до її кінця
}
int main()
{
std::cout << "fun = " << fun() << std::endl;
return 0;
}
Просто, в такій ситуації функція поверне Тому, будьте обережні.
Функція може повертати не лише базові типи змінних такі як а й структуру та масиви (ще багато чого іншого, але ми це розглянемо в майбутньому).
Для того щоб функція повернула структуру вам потрібно:
1) Створити дану структуру.
2) Вказати її ім’я (структури) в якості типу функції.
3) І звісно повернути зміну типу даної структури.
Розглянемо це все на прикладі:
#include <iostream>
//створюємо структуру з іменем "Cat"
struct Cat
{
std::string name;
int age;
};
//вказуємо ім'я структури в якості
//типу функції
Cat fun()
{
//створюємо змінну типу нашої структури
//щоб пізніше її повернути
Cat cat;
std::cout << "input name: ";
std::cin >> cat.name;
std::cout << "input age: ";
std::cin >> cat.age;
//зауважимо, що ми можемо повернути змінну
//тип структури якої є таким же як і
//тип структури функції
return cat;
}
int main()
{
Cat kotuk;
//враховуючи, що ми повертаємо структуру з функції
//то збережемо це значення в змінну
kotuk = fun();
std::cout << "name: " << kotuk.name << "\nage: " << kotuk.age << std::endl;
return 0;
}
Зазвичай структуру повертають, коли необхідно повернути з функції декілька значень різного типу. Після чого, ви зможете присвоїти ці значення різним змінним (або залишити в одній) та використовувати в подальшому.
Повернення масиву з функції ми розглянемо пізніше у відповідному уроці.