.::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ącydeklarację 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
:) Pytaon 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() iPole()
. 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óbinformujemy 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 nimniej, 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 tejinstrukcji skutkuje mianowicie natychmiastowym
przerwaniem działania funkcji ipowrotem 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.