.::FUNKCJE::.

 

Parametry funkcji

    Nie tylko w programowaniu trudno wskazać operację, którą można wykonać bez

posiadania o niej dodatkowych informacji. Przykładowo, nie można wykonać operacji

kopiowania czy przesunięcia pliku do innego katalogu, jeśli nie jest znana nazwa tegoż

pliku oraz nazwa docelowego folderu.

Gdybyśmy napisali funkcję realizującą taką czynność , to nazwy pliku oraz katalogu

finalnego byłyby jej parametrami.

 

Parametry funkcji to dodatkowe dane, przekazywane do funkcji podczas jej wywo ł ania.

Parametry pełnią rolę dodatkowych zmiennych wewnątrz funkcji i można ich używa ć

podobnie jak innych zmiennych, zadeklarowanych w niej bezpośrednio. Różnią się one

oczywiście tym, że wartości parametrów pochodzą z „zewnątrz” – są im przypisywane

podczas wywołania funkcji.

Po tym krótkim opisie czas na obrazowy przykład. Oto zmodyfikujemy nasz program

liczący tak, żeby korzystał z dobrodziejstw parametrów funkcji:

 

// Parameters - wykorzystanie parametrów funkcji

#include <iostream>

#include <conio.h>

void Dodaj (int nWartosc1, int nWartosc2)

{

int nWynik = nWartosc1 + nWartosc2;

std::cout << nWartosc1 << " + " << nWartosc2 << " = " << nWynik;

 std::cout << std::endl;

}

void main()

{

int nLiczba1;

std::cout << "Podaj pierwsza liczbe: ";

std::cin >> nLiczba1;

int nLiczba2;

 std::cout << "Podaj druga liczbe: ";

std::cin >> nLiczba2;

Dodaj (nLiczba1, nLiczba2); getch();

 }

Rzut oka na działający program pozwala stwierdzić , iż wykonuje on taką samą pracę , jak

jego poprzednia wersja. Z kolei spojrzenie na kod ujawnia w nim widoczne zmiany –

przyjrzyjmy się im.

Zasadnicza czynność programu, czyli dodawanie dwóch liczb, została wyodrębniona w

postaci osobnej funkcji Dodaj() . Posiada ona dwa parametry nWartosc1 i nWartosc2 ,

które są w niej dodawane do siebie i wyświetlane w konsoli.

Wielce interesujący jest w związku z tym nagłówek funkcji Dodaj() , zawierający

deklarację owych dwóch parametrów:

void Dodaj(int nWartosc1, int nWartosc2)

Jak sam widzisz, wygląda ona bardzo podobnie do deklaracji zmiennych – najpierw

piszemy typ parametru, a następnie jego nazwę . Nazwa ta pozwala odwoływać się do

wartości parametru w kodzie funkcji, a więc na przykład użyć jej jako składnika sumy.

Określenia kolejnych parametrów oddzielamy od siebie przecinkami, zaś całądeklarację

umieszczamy w nawiasie po nazwie funkcji.

Wywołanie takiej funkcji jest raczej oczywiste:

Dodaj (nLiczba1, nLiczba2);

Podajemy tu w nawiasie kolejne warto ś ci, które zostaną przypisane jej parametrom;

oddzielamy je tradycyjnie już przecinkami. W niniejszym przypadku parametrowi

nWartosc1 zostanie nadana wartość zmiennej nLiczba1 , zaś nWartosc2 nLiczba2 .

Myślę , że jest to dość intuicyjne i nie wymaga więcej wyczerpującego komentarza :)

Reasumując: parametry pozwalaj ą nam przekazywać funkcjom dodatkowe dane, których

mogą użyć do wykonania swoich działań . Ilość , typy i nazwy parametrów deklarujemy w

nagłówku funkcji, zaś podczas jej wywoływania podajemy ich wartości w analogiczny

sposób.

 

Wartość zwracania przez funkcje

Spora część funkcji pisanych przez programistów ma za zadanie obliczenie jakiegoś

wyniku (często na podstawie przekazanych im parametrów). Inne z kolei wykonują

operacje, które nie zawsze muszą się udać (choć by usunięcie pliku – dany plik może

przecież już nie istnie ć ).

W takich przypadkach istnieje więc potrzeba, by funkcja zwróci ł a jakąś wartość .

Niekiedy będzie to rezultat jej intensywnej pracy, a innym razem jedynie informacja, czy

zlecona funkcji czynność została wykonana pomyślnie.

Zgodnie ze zwyczajem, popatrzymy teraz na odpowiedni program przykładowy :) Pyta

on użytkownika o długości boków prostokąta, wyświetlając w zamian jego pole

powierzchni oraz obwód. Czyni to ten kod (jest to fragment funkcji main() ):

 

// ReturnValue - funkcje zwracaj ą ce warto ść

int nDlugosc1;

std::cout << "Podaj dlugosc pierwszego boku: ";

std::cin >> nDlugosc1;

int nDlugosc2;

std::cout << "Podaj dlugosc drugiego boku: ";

std::cin >> nDlugosc2;

std::cout << "Obwod prostokata: " << Obwod(nDlugosc1, nDlugosc2) << std::endl;

std::cout << "Pole prostokata: " << Pole(nDlugosc1, nDlugosc2) << std::endl; getch();

 

Linijki wyświetlające gotowy wynik zawierają wywołania dwóch funkcji – Obwod() i

Pole() . Można je umieścić w tym miejscu, gdyż zwracają one wartości – w dodatku te,

które chcemy zaprezentować :) Wyświetlamy je dokładnie w ten sam sposób jak wartości

zmiennych i wszystkich innych wyrażeń liczbowych.

Cała istota działania aplikacji zawiera się więc w tych dwóch funkcjach. Prezentują się

one następująco:

int Obwod(int nBok1, int nBok2)

{

return 2 * (nBok1 + nBok2);

}

int Pole(int nBok1, int nBok2)

{

return nBok1 * nBok2;

}

Cóż ciekawego możemy o nich rzec? Widoczną różnicą w stosunku do dotychczasowych

przykładów funkcji, jakie mieliśmy okazję napotkać , jest chociażby zastąpienie słówka

void przez nazwę typu, int . To oczywiście nie przypadek – w taki właśnie sposób

informujemy kompilator, iż nasza funkcja ma zwracać wartość oraz wskazujemy jej typ.

Kod funkcji to tylko jeden wiersz, zaczynający się od return (‘powrót’). Określa on ni

mniej, ni więcej, jak tylko ową wartość , która będzie zwrócona i stanie się wynikiem

działania funkcji.

return powoduje jeszcze jeden efekt, który nie jest tu tak wyraźnie widoczny. Użycie tej

instrukcji skutkuje mianowicie natychmiastowym przerwaniem działania funkcji i

powrotem do miejsca jej wywołania. Wprawdzie nasze proste funkcje i tak kończą się

niemal od razu, więc nie ma to większego znaczenia, jednak w przypadku poważniejszych

podprogramów należy o tym fakcie pamiętać .

Dowiedzieliśmy się zatem, iż funkcja może zwracać wartość jako wynik swej pracy.

Rezultat taki winien być określonego typu – deklarujemy go w nagłówku funkcji jeszcze

przed jej nazwą . Natomiast w kodzie funkcji możemy użyć instrukcji return , by wskazać

wartość będącą jej wynikiem. Jednocześnie instrukcja ta spowoduje zakończenie

działania funkcji.