1 Język ANSI C Funkcje Wykład: Programowanie komputerówProwadzący: dr inż. Sławomir Nowak
2 Takie zadanie spełniają w języku C FUNKCJEWprowadzenie Często istnieje potrzeba wielokrotnego wykonywania tych samych operacji. Łatwiej było by zastąpić wielokrotnie wykonywany fragment przez uniwersalny podprogram, np.: wyznaczający określoną wartość dla zadanych parametrów. Takie zadanie spełniają w języku C FUNKCJE
3 Przykład: rozwiązywanie układu równań liniowych metodą wyznacznikówAlgorytm jest następujący: Pobierz współczynniki równań; Oblicz wyznacznik główny W; Jeśli wyznacznik główny jest różny od 0 skocz do 6 Oblicz wyznacznik Wx; Jeśli Wx <> 0 – poinformuj o braku rozwiązań, Wx=0 oznacza nieskończenie wiele rozwiązań. W obu przypadkach zakończ wykonywanie programu. Oblicz Wx i Wy, x=W/Wx, y=W/Wy, wypisz rezultaty wyjściowe i zakończ program.
4 #include
5 Można także, aby program uczynić bardziej uniwersalnym, zamknąć część programu obliczającą wynik równań w osobnej funkcji: unsigned RozwUklad( double a1, double a2, double a3 double b1, double b2, double b3, double * x, double * y) { double W; W = Wyzn(a1, a3, b1, b3); if (W != 0) if(!Wyzn(a1, a3, b1, b3)) return 0xffff; else return 0; } * x = Wyzn(a3, b3, a2, , b2) / W; * y = Wyzn(a1, a3, b1, b3) / W; return 1;
6 Przykład: rozwiązywanie układu równań liniowych metodą wyznacznikówWywołanie programu przybierze wtedy postać: int main (void) { double a1=1, a2=1, a3=2, b1=-1, b2=1, b3=4, W, x, y; unsigned lrozw = RozwUklad(a1, a2, a3, b1, b2, b3, &x, &y); ... wypisywanie wyników w zależności od liczby rozwiązań ... }
7 Czemu stosujemy funkcje?Przejrzystość struktury programu; Oszczędność czasu – raz napisana funkcja może być wielokrotnie wykorzystywana; Oszczędność pamięci – funkcja umieszczana jest w jednym miejscu pamięci;
8 Definicja funkcji Aby korzystać z funkcji, musi być ona zdefiniowana.Definicja obejmuje: Opcjonalne słowa kluczowe extern, static, inline; typ wartości funkcji; identyfikatora (nazwy) funkcji; listy parametrów; Ciała funkcji w nawiasach klamrowych.
9 Słowa kluczowe extern, static, inlineextern - informuje, że funkcja może być odstępna poza modułem programu (domyślnie) static – funkcja dostępna tylko w module, w którym ją zdefiniowano inline – dostępne w C++, oznacza, że skompilowane ciało funkcji umieszczane jest w miejscu jej wywołania, co powinno przyspieszyć wykonywanie programu
10 Typ wartości Typ wartości funkcji.Jeśli typ został pominięty, domyślnie przyjmuje się int Dozwolone są wszelkie typy z wyjątkiem tablic i funkcji
11 Typ wartości Typ wartości funkcji.Jeśli typ został pominięty, domyślnie przyjmuje się int Dozwolone są wszelkie typy z wyjątkiem tablic i funkcji
12 Nazwa funkcji W przypadku nazwy funkcji obowiązują te same zasady, co w przypadku identyfikatorów zmiennych. W języku C w obrębie jednego modułu nazwy funkcji nie mogą się powtarzać.
13 Lista deklaracji parametrówLista parametrów składa się z deklaracji parametrów rozdzielonych przecinkami. Deklaracja parametru wygląda identycznie jak deklaracja zmiennej określonego typu. Dopuszczalne jest użycie specyfikatora const
14 Ciało funkcji Ciało funkcji zbudowane jest z instrukcji ujętych w nawiasy klamrowe. W ciele funkcji następuje przekazanie wyniku funkcji przez użycie słowa kluczowego return wyrażenie. Instrukcja ta kończy działanie funkcji. Jeśli typ funkcji został określony jako void działanie funkcji może być zakończone bezparametrowym wyrażeniem return. W tym przypadku słowo return można też pominąć.
15 Definicje funkcji - przykładyFunkcja oblicza minimum dwóch elementów double min (double x, double y) { return x < y ? x : y; }
16 Definicje funkcji - przykładyFunkcja oblicza sumę elementów w tablicy double suma (double *tab, unsigned numel) { int i; double suma = 0; for (i=0; i
17 Deklaracja funkcji Funkcja w momencie wywołania musi być znana kompilatorowi. Jeśli jej wywołanie poprzedza definicję funkcji, musi być ona przynajmniej wcześniej zadeklarowana. Taką deklarację nazywa się prototypem funkcji. Prototyp zawiera nazwę i typ funkcji oraz opis jej parametrów. Opis parametrów może być uproszczony (ograniczać się tylko do typów zmiennych).
18 Deklaracja funkcji - przykładyvoid funkcja (void); fun1 (int a); double max (double aa, double bb); int wyzn (int, int, int, int); int dlugosc (char *);
19 Wywołanie funkcji ma postać:nazwa funkcji(lista_parametrów_wywołania);
20 Przekazywanie parametrów i zwracanie wartościZmienne globalne Funkcja Parametry Wartości Modyfikacja zmiennych globalnych
21 Przekazywanie parametrów i zwracanie wartościJeśli chodzi o formalne przekazywanie parametrów do funkcji w języku C mamy dwie możliwości: przekazywanie parametrów przez wartość przekazywanie parametrów przez wskaźnik W języku C++ pojawiła się możliwość przekazywanie parametrów przez referencje
22 Kolejny przykład – funkcja silniadouble silnia (unsigned n) { double wynik=1; for (; n ; --n) wynik *=n; return wynik;
23 Różnica pomiędzy przekazywaniem przez wartość a przez wskaźnik:Chcemy napisać funkcję swap, zamieniającą miejscami wartości dwóch zmiennych a i b. void swap(int x, int y){ int temp; temp = x; x = y; y = temp; } void swap(int *px, int *py){ temp = *px; *px = *py; *py = temp; Niepoprawnie
24 Kolejny przykład – funkcja sortuj – przekazywanie przez wskaźnikvoid sortuj (int *tab, int numel){ int nieuporz = 1, i; --numel; while (nieuporz) { nieuporz = 0; for (i=0; i
25 Kolejny przykład – funkcja sortuj – przekazywanie przez wskaźnikwywołanie: ... int tab[10] = {9,8,4,3,5,4,2,7,8,10}; sortuj(tab, 10);
26 Funkcja main i jej parametryDotychczas wykorzystywaliśmy main jako funkcję bezparametrową. Kod wynikowy programu, zapisany w postaci np. pliku *.exe może być wykorzystany z poziomu systemu operacyjnego. Jeśli chcemy z wiersza poleceń przekazać jakieś parametry, to możemy to zrobić w sposób prosty i naturalny, definiując main jako: int main(int argc, char * argv[]) argc – liczba parametrów argv[0] – ścieżka dostępu argv[1]..argv[argc-1] – kolejne parametry w formie tekstowej (łańcuchy znaków)
27 Funkcja rekurencyjne Niektóre pojęcia możemy zdefiniować jako odwołania do „siebie samego”. Takie odwołania nazywamy odwołaniami rekurencyjnymi. Np.. funkcję silnia możemy zdefiniować jako: n! = (n-1)! * n, co w języku C możemy zapisać jako: double silnia (unsigned n) { return n ? n*silnia(n-1) : 1.0; } Uwaga: musi istnieć „warunek stopu”!
28 Podsumowanie