Strona główna » C++ » Kurs » Własne funkcje w C++
f( )x

Własne funkcje w C++

Wstęp

Na początek wyjaśnię co to jest funkcja. Jest to przede wszystkim ciąg instrukcji, który na początku może przyjmować pełne argumenty. Działanie funkcji polega na uzyskaniu wyniku na podstawie argumentów. Funkcji używa się najczęściej w programie do pominięcia pisania tego samego kodu kilka razy. Dotychczas do tego można było użyć pętli. Jednak zaletą funkcji jest możliwość wykorzystania kodu w dowolnym miejscu w programie, w dowolnej innej funkcji.

main()

Podczas pisania programu funkcja musi mieć jasno określoną nazwę, jakiego typu i ile argumentów przyjmuje oraz co będzie jej wynikiem. Warto sobie zdać sprawę, że każdy ciąg instrukcji w komputerze może być funkcją, dlatego główna funkcja main() też do takich sie zalicza. Przypatrzmy się jej bliżej:

  1. int main() {
  2.   return 0;
  3. }

Jest to najprostszy, ale w pełni poprawny program, który nie robi nic, ale pozwoli przyjrzeć się budowie funkcji bliżej. Przede wszystkim funkcja ma swoją nazwę: main. Za nią stoją puste nawiasy okrągłe. To oznacza, że funkcja nie przyjmuje żadnych argumentów. Natomiast przed nazwą funkcji znajduje się typ int. Określa on jakiego typu będzie wynik zwracany przez funkcję. Po deklaracji funkcji jest część zawierająca ciąg instrukcji i znajduje się w nawiasach klamrowych { }. Ze względu na fakt, że program zwraca wartość to funkcja musi na koniec (2.) zwrócić wartość określonego wcześniej typu. W przypadku głównej funkcji main zwracana wartość 0 przekazuje systemowi informację, że program został wykonany prawidłowo.

Często jednak spotyka się programy, które przyjmują określone argumenty podczas uruchomienia. Ze względu na fakt, że program to właściwie bardzo rozbudowana funkcja to istnieje możliwość, aby dodać przyjmowane argumenty przez funkcję main():

  1. int main(int argc, char *argv[]) {
  2.   return 0;
  3. }

(1.) Tym razem funkcja nie ma już pustych nawiasów okrągłych. Oznacza to, że do jej wywołania należy podać określone argumenty. Argumenty są rozdzielone znakiem przecinka ",". Każdy argument składa się z jego typu np. int oraz nazwy zmiennej. W dalszej części programu podane argumenty używa się jak zadeklarowane w trakcie działania programu zmienne. Wystarczy znać ich nazwę, aby je odczytać czy zmodyfikować.

Pierwsza funkcja

Spróbujmy teraz napisać własną funkcję o nazwie suma. Funkcja powinna przyjmować dwa argumenty a i b będących liczbami całkowitymi. Wynikiem natomiast powinna być ich suma.

  1. int suma(int a, int b) {
  2.   return a + b;
  3. }

(1.) Z polecenie trzeba się domyśleć, że jeżeli a i b są liczbami całkowitymi to ich suma też będzie, dlatego w deklaracji należy podać, że funkcja zwraca typ int. Dalej idzie nazwa funkcji: suma. W okrągłych nawiasach są dwa argumenty rozdzielone przecinkiem a i b, oba typu int. W ciele funkcji jest tylko jedna instrukcja return, która zwraca sumą a + b.

Kolejną ważną kwestią jest ustawienie funkcji w programie. W C++ program musi znać coś zanim to wykorzysta, dlatego funkcja suma() musi być zadeklarowana w pliku zanim ją wywołamy. Czyli w przypadku, gdy będziemy testować funkcję suma() przy pomocy głównej funkcji main() to należy całą funkcję wkleić przed funkcją main():

  1. #include <iostream>
  2. using namespace std;
  3. int suma(int a, int b) {
  4.   return a + b;
  5. }
  6. int main() {
  7.   cout << suma(2, 3) << endl;
  8.   return 0;
  9. }

Teraz program działa następująco: na początek wykonana zostaje linijka (8.). Potem (9.) gdzie program ma wypisać działanie funkcji suma dla argumentów 2 i 3. Program przechodzi do linijki (5.) i oblicza sumę. Na podstawie typu zwracanej zmiennej (int) program wie jak należy wypisać wynik na konsolę. Jeśli typ byłby np. char to zwrócona wartość zostały potraktowane jako numer znaku do wypisania. Na sam koniec program prawidłowo kończąc pracę (10.) zwraca 0.

Deklarowanie funkcji

Istnieje możliwość, aby cała funkcja nie znajdowała się przed funkcją main(), a za nią. W tym celu należy wpierw poinformować program, że taka funkcja się znajduje. Jaką ma nazwę, jakie argumenty przyjmuje i co zwraca. Samo ciało funkcji może znajdować się dalej w kodzie źródłowym. Dostosowując poprzedni przykład otrzymujemy:

  1. #include <iostream>
  2. using namespace std;
  3. int suma(int a, int b);
  4. int main() {
  5.   cout << suma(2, 3) << endl;
  6.   return 0;
  7. }
  8. int suma(int a, int b) {
  9.   return a + b;
  10. }

(4.) Deklaracja funkcji. Bez tego fragmentu po skompilowaniu program powie, że nie zna funkcji suma() chociaż istnieje ona w pliku. Program musi mieć podaną całą funkcję, albo chociaż wiedzieć, że takowa istnieje, aby jej użyć. Potem (6. - 9.) w kodzie jest cała funkcja main(), a na sam koniec (1. - 13.) należy wstawić całą funkcję suma().

Tego typu deklaracje mogą wydawać się w tym momencie zbędne jako, że później poprawki w deklaracji funkcji trzeba nanosić w dwóch miejscach. Jednak zdecydowanie lepiej zrozumieć ich role kiedy zajdzie potrzeba stworzenia pliku nagłówkowego pliku do napisanego kodu wszystkie deklaracje funkcji znajdują się w pliku *.h, a kod źródłowy *.cpp. Na chwilę obecną należy mieć świadomość, że takie deklaracje istnieją.

Podsumowanie

Lekcja 11 dobiegła końca. Zajrzyj do kodu źródłowego, aby przeanalizować wypisywanie danych jeszcze raz. Następnie spróbuj wykonać zadania, aby utrwalić materiał.

Zadania

Do każdego zadania dopisz funkcję main(), która przetestuje działanie napisanej funkcji.

Zadanie 1

Napisz funkcję mnozenie(), która przyjmie dwie liczby całkowite, a na koniec zwróci ich iloczyn.

Przykładowo dla wywołania mnozenie(3, 6) funkcja powinna zwrócić wartość 18.

Zadanie 2

Napisz funkcję czy_dzieli(), która przyjmie dwie liczby całkowite n i k. Wynikiem działania funkcji powinna być wartość logiczna czy k dzieli n.

Przykładowo dla wywołania czy_dzieli(6, 3) funkcja powinna zwrócić wartość true.

Zadanie 3

Napisz funkcję lowerToUpper(), która podany mały znak łacińskiego alfabetu c zamieni na duży znak alfabetu łacińskiego.

Przykładowo dla wywołania lowerToUpper('c') funkcja powinna zwrócić wartość 'C'.