1
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
DR INŻ.
M
AŁGORZATA
J
ANKOWSKA
2
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
WPROWADZENIE
W procesie tworzenia algorytmu niejednokrotnie spotykamy się z koniecznością
wielokrotnego wykonywania tego samego zadania, lecz dla różnych danych
i w różnych sytuacjach.
Zadanie, o którym wiemy, że będzie wykonywane kilka razy możemy zrealizować
osobno w odpowiednim podprogramie. Rozwiązanie takie zapewniają w języku
C/C++ funkcje.
Funkcje pozwalają programistom na budowę programu w sposób modułowy.
Dzięki takiemu podejściu możliwe jest wyodrębnienie pewnych operacji wykonywa-
nych na podstawie danych parametrów wejściowych.
Zalety używania funkcji w programie:
• możliwość wielokrotnego używania funkcji w tym samym bądź w różnych
programach, a przez to oszczędność czasu (funkcję piszemy tylko raz),
• unikanie powtarzania kodu,
• przejrzystość i zwiększenie czytelności programu,
• oszczędność pamięci.
WSKAZÓWKA PRAKTYCZNA
Dobrym zwyczajem jest ograniczenia działania funkcji do przeprowadzenia
pojedynczego zadania. Nazwa funkcji powinna wyrażać to zadanie.
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
DEFINICJA FUNKCJI
Definicja funkcji stanowi o tym jakie zadanie funkcja wykonuje.
Jest zapisem pewnego algorytmu lub jego części. Powoduje również przydzielenie
obszaru pamięci, w którym znajdować się będzie kod wynikowy funkcji.
Najważniejsze elementy definicji funkcji:
• typ wartości funkcji – może nim być dowolny typ za wyjątkiem tablic i funkcji;
- jeżeli typ wartości funkcji nie jest określony w sposób
jawny, wówczas przyjmowany jest typ int;
- jeżeli funkcja nie przekazuje wartości wówczas używamy
słowa kluczowego void,
• identyfikator (nazwa) funkcji,
• lista deklaracji parametrów funkcji – może być ona pusta co oznacza, że funkcja
jest bezparametrowa (brak parametrów funkcji możemy oznaczyć używając
słowa kluczowego void),
• ciało funkcji, które umieszczamy w nawiasach klamrowych.
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
4
DEFINICJA FUNKCJI
Definicja funkcji o nazwie określonej przez identyfikator-funkcji, typie wartości
funkcji danej przez typ-wartości oraz liście parametrów funkcji danej przez listę-
parametrów,
a) w przypadku, gdy funkcja nie zwraca wartości:
void identyfikator-funkcji ( lista-parametrów )
{
deklaracje i instrukcje
}
b) w przypadku, gdy funkcja zwraca wartości:
typ-wartości identyfikator-funkcji ( lista-parametrów )
{
deklaracje i instrukcje
return zwracana-wartość;
}
5
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
WYWOŁANIE FUNKCJI
Wywołanie funkcji – użycie danej funkcji w programie dla danego zbioru
wymaganych przez funkcję wartości parametrów.
WYWOŁANIE FUNKCJI
Wywołanie funkcji o nazwie określonej przez identyfikator-funkcji dla danej listy-
parametrów-wywołania:
identyfikator-funkcji ( lista-parametrów-wywołania )
Lista-parametrów-wywołania składa się z oddzielonych od siebie przecinkami
wyrażeń zgodnych z typem parametrów danej funkcji.
Typy parametrów wywołania powinny być identyczne z typami określonymi w
definicji lub prototypie funkcji. W przeciwnym razie przeprowadzane są, w miarę
możliwości, konwersje do typów określonych w prototypie.
UWAGI
6
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
DEKLARACJA FUNKCJI – PROTOTYP FUNKCJI
Deklaracja funkcji – pojęcie logiczne stanowiące jedynie informację dla kompilatora,
ż
e funkcja o danej nazwie, typie wartości oraz liczbie, typach
parametrów oraz określonym porządku występowania może
zostać użyta w programie.
Deklaracja funkcji w obowiązującym standardzie ANSI oraz w języku C++ nazywana
jest prototypem funkcji.
DEKLARACJA FUNKCJI
Deklaracja funkcji ma najczęściej następującą postać:
typ-wartości identyfikator-funkcji ( lista-parametrów );
Typem wartości funkcji może być może być dowolny typ za wyjątkiem tablic
i funkcji. Jeżeli typ wartości funkcji nie jest określony w sposób jawny, wówczas
przyjmowany jest typ int.
Lista deklaracji parametrów składa się z nazw typów kolejnych parametrów.
Identyfikatory (nazwy) parametrów mogą (lecz nie muszą!) być podane i pełnią
zasadniczo rolę dokumentującą.
Deklaracja funkcji zakończona jest średnikiem.
UWAGI
7
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZYKŁAD – FUNKCJA Z PUSTĄ LISTĄ PARAMETRÓW, NIE ZWRACAJĄCA WARTOŚCI
void Komunikat ();
int main (void)
{
Komunikat ();
return 0;
}
void Komunikat ()
{
cout << ”Hello World!” << endl;
}
8
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
void Komunikat ();
int main (void)
{
Komunikat ();
return 0;
}
void Komunikat ()
{
cout << ”Hello World!” << endl;
}
PRZYKŁAD – FUNKCJA Z PUSTĄ LISTĄ PARAMETRÓW, NIE ZWRACAJĄCA WARTOŚCI
PROTOTYP
FUNKCJI
WYWOŁANIE
FUNKCJI
DEFINICJA
FUNKCJI
9
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
void Komunikat ();
int main (void)
{
Komunikat ();
return 0;
}
void Komunikat ()
{
cout << ”Hello World!” << endl;
}
PROTOTYP
FUNKCJI
WYWOŁANIE
FUNKCJI
DEFINICJA
FUNKCJI
TYP WYNIKU
NAZWA FUNKCJI
LISTA PARAMETRÓW
CIAŁO
FUNKCJI
PRZYKŁAD – FUNKCJA Z PUSTĄ LISTĄ PARAMETRÓW, NIE ZWRACAJĄCA WARTOŚCI
10
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZEKAZYWANIE PARAMETRÓW I ZWRACANIE WARTOŚCI
W ogólności możemy powiedzieć, że działanie danej funkcji polega na tym, że
na podstawie danych wejściowych, którymi mogą być wartości:
• parametrów wejściowe przekazywanych do funkcji,
• dane z urządzenia wejściowego,
• zmienne globalne,
funkcja wykonuje szereg operacji, których rezultatem są wartości:
• zwracane przez funkcję,
• przekazane do programu przez listę parametrów,
• zmodyfikowanych zmiennych globalnych,
• wysłane na urządzenie wyjściowe.
Przekazywanie wartości do funkcji odbywa się w naturalny sposób poprzez listę
parametrów funkcji (przekazywanie parametru do funkcji przez wartość – język
C/C++).
Więcej uwagi wymaga sposób zwracania wyników do programu. Jeżeli bowiem
rezultatem wykonania funkcji jest tylko jedna wielkość, wówczas wystarczy, aby stała
się ona wartością funkcji. W przeciwnym razie parametry przekazujemy do funkcji
przez wskaźnik (język C/C++) lub przez referencję (język C++).
11
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZEKAZYWANIE PARAMETRÓW PRZEZ WARTOŚĆ
W wyniku przekazania parametru funkcji przez wartość funkcja otrzymuje kopię
zmiennej umieszczoną na stosie procesora lub w jego rejestrze.
Główny cel, któremu służy przekazywanie parametrów przez wartość:
• przekazywanie do funkcji wartości danych wejściowych potrzebnych do
wykonania przewidzianego w algorytmie zadania.
Parametr jest traktowany tak samo jak inne zmienne zadeklarowane w ciele definicji
funkcji – istnieje więc jedynie w czasie jej wykonywania.
UWAGA
12
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
przekazanie parametrów
przez wartość
wynik działania funkcji ObliczSume (suma dwóch liczb)
zostanie zwrócony do programu i przypisany zmiennej wynik
PRZYKŁAD – PRZEKAZYWANIE PARAMETRÓW PRZEZ WARTOŚĆ
int ObliczSume (int a, int b);
int main (void)
{
int wynik, liczba1 = 10, liczba2 = 20;
wynik = ObliczSume (liczba1, liczba2);
cout << ”Wynik sumowania = ” << wynik;
return 0;
}
int ObliczSume (int a, int b)
{
int w = a + b;
return w;
}
Cel
przekazanie
do funkcji
wartości
zmiennych
liczba1
oraz liczba2 …
13
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZEKAZYWANIE PARAMETRÓW PRZEZ WSKAŹNIK
Przekazywanie parametrów funkcji przez wskaźnik jest pewną odmianą przekazy-
wania przez wartość. Podobnie jak w poprzednim przypadku funkcja otrzymuje
kopię zmiennej – w tym przypadku kopię wskaźnika.
UWAGA
Wskaźnik przekazany do funkcji może identyfikować zmienną, która należy do innej
funkcji. Przypisanie wartości dla zmiennej, na którą wskazuje parametr wskaźnikowy
pozwala więc zmienić wartości zmiennych utworzonych w innych funkcjach
programu.
Cele, którym służy przekazywanie parametrów przez wskaźnik:
• przekazywanie struktur danych o dużych rozmiarach (np. tablice, łańcuchy),
• umożliwienie modyfikacji wartości zmiennych utworzonych w innych funkcjach
programu, czyli tym samym zwrócenie przez funkcję więcej niż jednej wartości.
14
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
wynik działania funkcji ObliczSumeElementow (suma elementów tablicy) zostanie
zwrócony do programu i przypisany zmiennej suma
PRZYKŁAD 1 – PRZEKAZYWANIE PARAMETRÓW PRZEZ WSKAŹNIK
double ObliczSumeElementow (int n, double * tab);
int main (void)
{
int n = 10;
double a[10] = {0,1,2,3,4,5,6,7,8,9};
double suma = ObliczSumeElementow (n, a );
cout << ”Wynik sumowania = ” << suma;
return 0;
}
double ObliczSumeElementow (int n, double * tab)
{
double w = 0.0;
for (int i=0; i<=n-1; i++)
w = w + tab[i];
return w;
}
Cel
przekazanie
do funkcji
tablicy o dużych
rozmiarach ...
przekazanie parametrów
przez wskaźnik (nazwa
tablicy jest wskaźnikiem
do pierwszego elementu
tablicy)
15
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZYKŁAD 2 – PRZEKAZYWANIE PARAMETRÓW PRZEZ WSKAŹNIK
void ObliczSume (double a, double b, double * c);
int main (void)
{
double x = 3.5, y = 5.0, z;
ObliczSumeLiczb( x,y,&z );
cout << ”Wynik sumowania = ” << z;
return 0;
}
void ObliczSume (double a, double b, double * c)
{
*c = a + b;
}
Cel
modyfikacja
wartości
zmiennej
utworzonej
w programie ...
- przekazanie parametrów
przez wartość (w przypadku
zmiennych x,y),
- przekazanie parametrów przez
wskaźnik (w przypadku
zmiennej z) – operacja &z
pobiera adres zmiennej z;
funkcja ObliczSume modyfikuje przy pomocy parametru
wskaźnikowego c wartość zmiennej z w programie
16
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZEKAZYWANIE PARAMETRÓW PRZEZ REFERENCJĘ
Przekazując parametry funkcji przez referencję umożliwiamy przeprowadzanie
operacji bezpośrednio na zmiennej, której referencja została przekazana do
funkcji.
UWAGA
W przypadku niezgodności typu referencyjnego i zmiennej, do której została
utworzona referencja operacje są przeprowadzane jedynie na zmiennej (obiekcie)
tymczasowej, a nie bezpośrednio na tej zmiennej.
Cele, którym służy przekazywanie parametrów przez referencję:
• przekazywanie parametrów do funkcji,
• przekazywanie parametrów z funkcji do programu / innej funkcji, a tym samym
zwrócenie przez funkcję więcej niż jednej wartości.
17
M
.
J
ANKOWSKA –
W
YKŁAD
5 F
UNKCJE JĘZYKA
C
++
PRZYKŁAD – PRZEKAZYWANIE PARAMETRÓW PRZEZ REFERENCJĘ
void ObliczSume (double a, double b, double & c);
int main (void)
{
double x = 3.5, y = 5.0, z;
ObliczSume( x,y,z );
cout << ”Wynik sumowania = ” << z;
return 0;
}
void ObliczSume (double a, double b, double & c )
{
c = a + b;
}
Cel
modyfikacja
wartości
zmiennej
utworzonej
w programie ...
- przekazanie parametrów
przez wartość (w przypadku
zmiennych x,y),
- przekazanie parametru przez
referencję wskaźnik (w przypad-
ku zmiennej z)
funkcja ObliczSume oblicza sumę dwóch liczb
i podstawia ją zmiennej referencyjnej c,
czyli tym samym zmiennej z w programie
c jest zmienną referencyjną;
działając na zmiennej c działamy
bezpośrednio na zmiennej z
w programie