Funkcje
Funkcje piszemy, aby nasz kod stał się czytelniejszy. Jest to pewien rodzaj podprogramu, znajdującego się poza funkcją main
. Zazwyczaj korzysta się z funkcji, kiedy program ma wielokrotnie wykonać jakieś operacje. Funkcja wykonuje określone operacje i może zwracać jakąś wartość.
Deklaracja funkcji
Najpierw, przed funkcją main
, piszemy typ zmiennej, który ma zwracać, lub void
, jeśli funkcja nic nie zwraca. Następnie, po spacji, piszemy nazwę funkcji. Po nazwie, w nawiasach okrągłych piszemy argumenty, jakie funkcja przyjmuje, poprzedzone ich typem danych. Jeśli funkcja nie przyjmuje argumentów, pozostawiamy puste nawiasy.
int policz_iloczyn(int a, int b)
Z powyższej linii możemy dowiedzieć się, że jest to funkcja zwracająca wartość typu int
, przyjmująca dwie wartości, również typu int
.
Ciało funkcji
Ciało funkcji znajduje się w całości w nawiasach klamrowych, wszystko co jest poza nimi nie będzie wykonywane po wywołaniu funkcji. Każda funkcja, oprócz funkcji void
, powinna coś zwracać. Do zwracania wartości używamy komendy return
, a następnie podajemy nazwę zmiennej i kończymy średnikiem. Funkcja policz_iloczyn
, będzie wyglądała tak:
int policz_iloczyn(int a, int b)
{
int wynik = a * b;
return wynik;
}
Aby wywołać daną funkcję, należy napisać jej nazwę, następnie nawiasy okrągłe - w nich należy umieścić argumenty przyjmowane przez funkcje, bez typów danych, lub nic nie umieszczać, jeśli funkcja nie przyjmuje żadnych argumentów. Wywołanie funkcji policz_iloczyn
będzie wyglądało tak:
policz_iloczyn(czynnik1, czynnik2)
Można wartość zwracaną przez tę funkcję bezpośrednio wypisać, lub przypisać do jakiejś zmiennej. Poniższy program będzie wczytywał dwie liczby i wypisywał ich iloczyn;
#include <iostream>
using namespace std;
int policz_iloczyn(int a, int b) {
int wynik = a * b;
return wynik;
}
int main()
{
int czynnik1, czynnik2;
cin >> czynnik1 >> czynnik2;
cout << policz_iloczyn(czynnik1, czynnik2);
return 0;
}
Co ważne, zmienne zadeklarowane w funkcji main
nie będą dostępne w innych funkcjach, i odwrotnie. Oznacza to, że zmienne możemy nazwać tak samo w funkcji main
jak w innych funkcjach i nie wystąpi kolizja oznaczeń. Jeśli zadeklarujemy jakąś zmienną poza funkcjami, będzie ona zmienną globalną - będzie dostępna we wszystkich funkcjach.
Inne typy funkcji - przykłady
Przykładowa funkcja typu void
- funkcja przyjmująca liczbę i napis, a następnie wypisuje ten napis tyle razy ile podano:
#include <iostream>
using namespace std;
void wypisz_n_razy(int n, string napis) {
for(int i = 0; i < n; i++) cout << napis << '\n';
}
int main()
{
int n;
string napis;
cin >> n >> napis;
wypisz_n_razy(n, napis);
return 0;
}
Jak widać, zarówno w funkcji main
, jak w funkcji wypisz_n_razy
występują te same nazwy funkcji, jednak nie występuje kolizja oznaczeń. Funkcja wypisz n razy
kopiuje wartości n
i napis
, więc może zmieniać ich wartość, nie zmieniając wartości zmiennych n
i napis
w funkcji main
.
Poniższa funkcja sprawdza, czy liczba jest parzysta i zwraca wartość typu bool
:
bool czy_parzysta(int x) {
if (x % 2 == 0) return true;
return false;
}
W tym przypadku nie potrzebujemy umieszczać konstrukcji else
w tej funkcji, ponieważ komenda return
automatycznie kończy jej wykonywanie.
Przydatne informacje:
- Funkcje mogą zwracać maksymalnie jedną wartość (może to być m.in. zmienna, vector/tablica)
- Funkcja może wywoływać inne funkcje (w tym samą siebie)
- Funkcja może odwoływać się tylko do funkcji znajdujących się nad nią (w kodzie) - program czytany jest od “góry”
- Funkcja typu
void
“automatycznie” się kończy po wykonaniu wszystkich operacji - nie potrzebna jest komendareturn