Funkcje

 

funkcje w c/c++

Funkcje czyli porządek w kodzie!

Funkcje c/c++ w programowaniu są czymś tak naturalnym że nawet nie zdajemy sobie sprawy że z nich korzystamy. Do tej pory poznałeś funkcje main() bez której programowanie byłoby niemożliwe. Jest to główna funkcja c/c++ która „kontroluje” cały kod. Program kończy się gdy zwróci ona wartość 0 chodź zakończenie można wymusić funkcją exit. Innymi funkcjami z których do tej pory korzystałeś są printf() scanf() z biblioteki stdio.h. Teraz czas na to aby pisać własne funkcje i ułatwić sobie programowanie. Funkcja jest określonego typu (na przykład int, void, float) ma unikatową nazwę oraz nawiasy okrągłe. W nawiasach podaje się agrumenty/zmienne z których będzie korzystać. Następnie są nawiasy klamrowe a w nich ciało czyli kod. Dosyć tego przydługawego wstępu pora zobaczyć to na jakiś przykładach.

Proste przykłady wprowadzające

Coś prostego na początek aby lepiej zrozumieć istotę tworzenia.

#include <stdio.h>

void przywitanie() //funkcja
{
    printf("Witaj\nAhoj\nHello\nBonjour\nAloha"); //"\n" znak nowej linii
}

int main()
{
    przywitanie(); //wywołanie funkcji

    return 0;
}

Ciekawić może typ funkcji void. Jest to typ pusty, nie przedstawia on żadnej konkretnej wartości wykorzystuje się w funkcjach takich jak ta. Funkcja przywitanie nie zwraca nam żadnej wartości jedynie co robi to wita się z nami w 5 różnych językach. A zatem nie ma potrzeby nadawania jej żadnego konkretnego typu skoro i tak nic nie zwraca (return). Teraz trochę bardziej rozbudowany przykład.

#include <stdio.h>

int dodawanie(int a, int b) //tworzymy funckję
{
    return a+b;
}

int main()
{
    int x,y,wynik;
    printf("Jakie liczby dodac: ");
    scanf("%d %d", &x,&y);
    wynik = dodawanie(x,y); //wywołujemy funkcję i przekazujemy argumenty
    printf("Wynik: %d", wynik);

    return 0;
}

Jak widzisz chodzi o to że funkcje pozwalają nam fragmentować kod. Funkcja dodawanie jest typu int a jako argumenty przyjmuje zmienne ab które również są typu int. Nazwy tych argumentów mogą być dowolne i są one widoczne tylko w ciele funkcji (zmienne lokalne) a więc jeżeli mamy zmienną i funkcji również jest zmienna nie zachodzi kolizja. Przejdźmy teraz do funkcji main a dokładniej mówiąc do 13 linijki. Wywołujemy tam naszą wcześniej stworzoną funkcje dodawanie a w jej nawiasach okrągłych podajemy zmienne do obliczenia. Oczywiście my nie pracujemy na „oryginalnych” zmiennych x y tylko na ich kopiach a b. Funkcja dodawanie zwraca nam sumę a ta jest przypisana do zmiennej wynik. Dużo teorii jak na sam początek a więc przejdźmy teraz do praktyki.

Kalkulator i biblioteka math.h

Kod jest podany modułowo najpierw będzie funkcja main w której to dzieję się cała „magia” a następnie funkcje przez nas stworzone. Ułatwi to czytanie i zrozumienie kodu. A więc zaczynajmy

#include <stdio.h>
#include <math.h> //biblioteka matematyczna potrzebna do wartość PI

int main()
{
    float x,y,wynik;
    int wybor;
    while(1) //nieskoczona pętla
    {
    printf("Podaj pierwsza liczbe: ");
    scanf("%f", &x);
    printf("Podaj druga liczbe: ");
    scanf("%f", &y);
    printf("Wybierz dzialanie:\n");
    printf("Dodawanie - 1   Odejmowanie - 2   Mnozenie - 3");
    printf("\nDzielenie - 4   Liczba PI - 5   Wyjscie - 0");
    printf("\nwybor: ");
    scanf("%d",&wybor);
    if(wybor==1) wynik = dodawanie(x,y);
    else if(wybor==2) wynik = odejmowanie(x,y);
    else if(wybor==3) wynik = mnozenie(x,y);
    else if(wybor==4) wynik = dzielenie(x,y);
    else if(wybor==5) wynik = liczbaPI();
    else break; //przerwanie pętli
    printf("Wynik: %.2f",wynik); //wynik z dokładnością 2 miejsc po przecinku
    printf("\n\n"); //zabieg estetyczny
    }
    
    return 0;
}

A poniżej funkcje wykorzystywane w programie

float dodawanie(float a, float b)
{
    return a+b;
}
float odejmowanie(float a, float b)
{
    return a-b;
}
float mnozenie(float a, float b)
{
    return a*b;
}
float dzielenie(float a, float b)
{
    if(b==0) printf("Nie dzieli sie przez 0\n"); //pamiętamy 
    else return a/b;
}
float liczbaPI()
{
    return M_PI; //liczba PI potrzebna biblioteka math.h
}

Aby przetestować program należy powyższe funkcje „wkleić” do kompilatora tak aby oba fragmenty stanowiły jedną spójną całość. Oczywiście napisanie takiego kalkulatora bez użycia funkcji było by o wiele szybsze i prostsze. Zgodzę się z tym jednak chodzi o to aby pokazać zastosowanie funkcji w praktyce. Funkcji najczęściej używa się przy dużych programach gdzie pewien blok kodu (załóżmy 20 linijek) trzeba użyć kilka razy ale dla różnych wartości. Wówczas zamiast pisać na przykład 5 takich bloków dla pięciu zestawów zmiennych wystarczy napisać go tylko raz. A następnie pięć razy wywołać a więc jest to olbrzymia oszczędność kodu co przekłada się na czytelność.

Podsumowanie

Pamiętaj że funkcje są po to aby ułatwić pracę i zapobiec tak zwanemu spaghetti code. Funkcje należy pisać w taki sposób aby były jak najbardziej elastyczne i funkcjonalne. Pozwoli to na wykorzystaniu ich wiele razy a być może nawet w innych programach. W takim przypadku należy stworzyć własny plik nagłówkowy (z rozszerzeniem .h) i w nim umieścić ciało funkcji a powstałą w ten sposób bibliotekę podpiąć. Analogicznie tak jak ma to miejsce z bibliotekę stdio.h i funkcją printf().