Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji Funkcje biblioteczne Makrodefinicje 104
Co to jest funkcja? Funkcja (podprogram) to wydzielony fragment kodu przeznaczony do wielokrotnego użycia w programie. Nazwany fragment programu, do którego można się odwoływać, powodując wykonanie składających się na niego instrukcji. Funkcja może zwracać wartość określonego typu lub wartość pustą void. Funkcja, która zwraca wartość przekazuje tę wartość w miejsce swojego wywołania. 105
Dlaczego używamy funkcji? Powody uzasadniające użycie funkcji (podprogramów): dbałość o przejrzystą strukturę programu (podział programu na podprogramy); unikanie powtarzania tych samych ciągów instrukcji w wielu miejscach programu (zwartość i mniejszy rozmiar kodu); możliwość korzystania z gotowych funkcji (podprogramów) rozwiązujących mniejsze fragmenty zadania (programu) (wielokrotne użycie). Wielokrotne użycie funkcji umożliwia zmniejszenie rozmiaru kodu, ale obsługa wywołań funkcji zajmuje dodatkowy czas procesora. 106
Budowa funkcji NAGŁÓWEK FUNKCJI 1 2 3 <typ zwracany> <nazwa> ( <arg1>, <arg2>,... ) <deklaracja 1>; <deklaracja 2>;... część deklaracyjna (zawsze na początku) <instrukcja 1>; <instrukcja 2>;... instrukcje 4 CIAŁO FUNKCJI return <wartość>; instrukcja powrotu 107
Budowa funkcji NAGŁÓWEK FUNKCJI <typ zwracany> <nazwa> ( <arg1>, <arg2>,... )... PARAMETRY FORMALNE (zmienne lokalne) Wywołanie funkcji <nazwa> ( <arg1>, <arg2>,... ); PARAMETRY AKTUALNE 108
Deklaracja, definicja i wywołanie funkcji #include <stdio.h> void drukuj(int n); int main() int a; DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) printf( Podaj a = ); scanf( %d, &a); drukuj(a); WYWOŁANIE return 0; void drukuj(int n) int i; for (i = 1; i <= n; i++) printf( Napis %d\n, i); DEFINICJA 109
Deklaracja, definicja i wywołanie funkcji #include <stdio.h> void drukuj(int n) int i; for (i = 1; i <= n; i++) printf( Napis %d\n, i); DEFINICJA int main() int a; printf( Podaj a = ); scanf( %d, &a); drukuj(a); return 0; DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) JEST ZBĘDNA WYWOŁANIE 110
Przykład 1 brak argumentów void opis(); DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) void opis() DEFINICJA printf( Program oblicza to i tamto\n ); printf( Autor: Jan Kowalski\n ); opis(); WYWOŁANIE 111
Przykład 2 jeden argument void drukuj(int n); DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) void drukuj(int n) DEFINICJA int i; for (i = 1; i <= n; i++) printf( Napis %d\n, i); int a = 2, b = 3;... drukuj(5); drukuj(a); drukuj(a+b); WYWOŁANIE 112
Przykład 3 jeden argument i zwrócenie float pole(float promien); float pole(float promien) float p; const float pi = 3.14; DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) DEFINICJA p = pi*promien*promien; return p; float r = 3, S; S = pole(2.5); printf( %f, pole(r)); S = pole(4*sqrt(r)); WYWOŁANIE 113
Przykład 4 dwa argumenty i zwrócenie int dodaj(int a, int b); int dodaj(int a, int b) int c; DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) DEFINICJA c = a+b; return c; return a+b; int x = 2, y = 4, z;... z = dodaj(2, -7); printf( %d, dodaj(x, y)); WYWOŁANIE 114
Przykład 5 n! = 1 * 2 *... n unsigned long silnia(unsigned int n); unsigned long silnia(unsigned int n) unsigned int i; unsigned long wynik = 1; DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP) if (n > 12) return 0; for ( i = 1; i <= n; i++ ) wynik = wynik*i; return wynik; DEFINICJA printf( %ld, silnia(5)); WYWOŁANIE 115
Przekazywanie argumentów do funkcji METODA 1: PRZEZ WARTOŚĆ DEFINICJA: int dodaj(int a, int b) return a+b; WYWOŁANIE: int x = 2, y = 3, z;... z = dodaj(x, y); 116
Przekazywanie argumentów do funkcji METODA 2: PRZEZ ADRES (WSKAŹNIK) DEFINICJA: void dodaj(int a, int b, int *c) *c = a+b; WYWOŁANIE: int x = 2, y = 3, z;... dodaj(x, y, &z); 117
Przykład DEFINICJA: void swap1(int a, int b) int c; c = a; a = b; b = c; WYWOŁANIE: int x = 1, y = 2;... swap1(x, y); Funkcja operuje na kopiach zmiennych x i y Zostaną zamienione miejscami kopie zmiennych x i y, a nie oryginały! 118
Przykład DEFINICJA: void swap2(int *a, int *b) int c; c = *a; *a = *b; *b = c; WYWOŁANIE: int x = 1, y = 2;... Funkcja operuje na swap2(&x, &y); adresach zmiennych x i y Zostaną zamienione miejscami wartości znajdujące się pod adresami zmiennych x i y. 119
int main() int x = 1, y = 2; Przykład 1 2 3 printf( x = %d, y = %d\n, x,y); swap1(x, y); printf( x = %d, y = %d\n, x,y); swap2(&x, &y); printf( x = %d, y = %d\n, x,y); return 0; 1 2 3 x = 1, y = 2 x = 1, y = 2 x = 2, y = 1 _ 120
Tablica jako argument funkcji #include <stdio.h> int a[3] = 10, 20, 30 ; int b[] = 1, 2, 3, 4, 5 ; UNIEMOŻLIWIA MODYFIKACJĘ ZAWARTOŚCI TABLICY void drukuj( const int tablica[], int N ) int i; for (i = 0; i < N; i++) printf( element[%d] = %d\n, i, tablica[i]); /* tablica[0] = 5; */ NIEWYKONALNE Nazwa tablicy jest adresem pierwszego int main() elementu (wskaźnikiem na pierwszy element): a &a[0] drukuj(a, 3); b &b[0] drukuj(b, sizeof b/sizeof (int)); 121
Funkcje biblioteczne Biblioteka standardowa: pliki nagłówkowe assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h diagnostyka kodu (asercje) funkcje do klasyfikowania znaków ograniczenia implementacji (arytmetyka zmiennopozyc.) ograniczenia implementacji (typy całkowite) funkcje matematyczne funkcje do obsługi tzw. skoków odległych funkcje do obsługi sygnałów (zdarzeń wyjątkowych) funkcje do obsługi zmiennej listy argumentów funkcje obsługujące standardowe wejście-wyjście funkcje narzędziowe funkcje do operacji na ciągach znaków funkcje do obsługi daty i czasu 122
Makrodefinicje #include <stdio.h> #define KWADRAT(a) ((a)*(a)) #define MAX((a), (b)) ( ((a) > (b))? (a) : (b) ) int maximum(int a, int b) return (a > b)? a : b; if (a > b) return a; else return b; void main() int a; a = KWADRAT(3); a = MAX(2, 5); a = maximum(3, -2); WYWOŁANIE MAKRODEFINICJI (MAKROWYWOŁANIE MAKROINSTRUKCJA) WYWOŁANIE FUNKCJI 123