====== Funkcje ====== * [[zajecia3#Zmianne lokalne vs. globalne|Zmianne lokalne vs. globalne]] * [[zajecia3#Zmiene statyczne vs. automatyczne|Zmiene statyczne vs. automatyczne]] * [[zajecia3#Iteracja vs. rekurencja|Iteracja vs. rekurencja]] * [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]] * [[zajecia3#Funkcje matematyczne - biblioteka math.h|Funkcje matematyczne - biblioteka math.h]] Na zajęciach obowiązuje **zakaz używania zmiennych globalnych** ! ===== Definicja funkcji i jej użycie ===== #include /* deklaracja funkcji */ int silnia(int n); int main() { int liczba,s; printf("Podaj liczbe: "); scanf("%d",&liczba); s = silnia(liczba); printf("Silnia z %d wynosi %d\n",liczba,s); return 0; } /* definicja funkcji */ int silnia(int n) { int i=2, s=1; while( i < n+1 ) { s = s * i; i = i + 1; } return s; } ** Ćwiczenia ** * Napisz funkcję o nazwie ''**jest_pierwsza**'', która dla danej liczby całkowitej zwraca wartość 1 gdy podana liczba jest liczbą pierwszą a wartość 0 - gdy jest nie jest * Korzystając z funkcji ''jest_pierwsza'' napisz program który wyświetli wszystkie liczby pierwsze mniejsze lub równe pewnej podanej przez użytkownika liczbie całkowitej * Napisz funkcję o nazwie ''**trojkat**'', która dla danej liczby całkowitej wyświetla trójkąt prostokątny złożony z podanej liczby linii, np.: ***** **** *** ** * * dodaj kolejny argument do funkcji ''**trojkat()**'', który określa jaki znak będzie użyty zamiast ''*'' * Sprawdź dla jakich danych wejściowych program obliczający silnię przestaje dawać wiarygodne wyniki? Spróbuj zwiększyć zakres dokładnie obliczanych wartości. * Napisz funkcję o nazwie ''**potega**'', która dla danych argumentów ''x'' (wartość rzeczywista) i **y** (wartość całkowita) wyznacza wartość potęgi ''xy'' * Napisz funkcję ''rpotega()'', która dla danych argumentów ''float p'' i ''int w'' wyznacza **rekurencyjnie** wartość potęgi ''pw'' * Napisz funkcję o nazwie **licznik**, która zwraca liczbę określającą ile razy dotychczas ta funkcja została uruchomiona ===== Funkcje matematyczne - biblioteka math.h ===== [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#math.h|Spis funkcji math.h]]\\ ** Ćwiczenia ** * zobacz opis funkcji ''scanf()'', ''printf()'', ''getchar()'' i ''putchar()'' (biblioteka ''stdio.h'') * korzystając z odpowiednich funkcji z biblioteki standardowej napisz funkcję ''**void pierwiastki(float a,float b,float c)**'', która wyświetla miejsca zerowe równania y = ax2 + bx +c lub komunikat o ich braku ** Uwaga ** Kompilując program korzystający z funkcji matematycznych zadeklarowanych w pliku ''**math.h**'' należy dodać opcję ''**-lm**'', czyli dla programu zawartego w pliku ''pirwiatek.c'' kompilacja w Linuksie wygląda tak cc pierwiastek.c -lm -o pierwiastek ===== Zadania domowe ===== - Napisz funkcję ''**Fibonacci**'' (w postaci iteracyjnej lub rekurencyjnej), która wyświetla ''**n**'' pierwszych elementów [[http://pl.wikipedia.org/wiki/Ci%C4%85g_Fibonacciego|ciągu Fibonacciego]].\\ Elementy ciągu wynoszą: F0=0, F1=1 i Fn=Fn-1+Fn-2 dla ''n > 1'' - Napisz funkcję ''**Newton**'', która dla podanych dwóch liczb całkowitych oblicza wartość [[http://pl.wikipedia.org/wiki/Symbol_Newtona|symbolu Newtona]] - Napisz funkcję ''**Gauss**'', która dla podanej wartości centrum (wartości średniej) i rozmycia (odchylenia standardowego) oblicza wartość [[http://pl.wikipedia.org/wiki/Rozk%C5%82ad_normalny#Funkcja_g.C4.99sto.C5.9Bci|funkcji Gaussa]] - Napisz funkcję wyznaczającą sumę ''n'' pierwszych elementów ciągu arytmetycznego - Napisz funkcję wyznaczającą sumę ''n'' pierwszych elementów ciągu geometrycznego - Napisz i przetestuj funkcję, która znajduje największy wspólny dzielnik dwóch liczb naturalnych. Można skorzystać z algorytmu Euklidesa podanego poniżej\\ Dla danych dwóch liczb X i Y 1. jeśli X jest równe Y to jest to największy dzielnik 2. jeśli X > Y to niech X <- X - Y i wróć do punktu 1 3. jeśli X < Y to niech Y <- Y - X i wróć do punktu 1 ===== Pomocne przykłady ===== ==== Zmianne lokalne vs. globalne ==== #include int globalna; void f(void) { int lokalna = 6; globalna++; printf("wewnatrz funkcji: globalna = %d\tlokalna = %d\n",globalna,lokalna); } int main() { int lokalna; printf("globalna = %d\tlokalna = %d\n",globalna,lokalna); f(); printf("globalna = %d\tlokalna = %d\n",globalna,lokalna); return 0; } ==== Zmiene statyczne vs. automatyczne ==== #include void dodaj(int a) { static int x = 0; /* zmienna statyczna */ int y = 0; /* zmienna automatyczna */ x = x + a; y = y + a; printf("x = %d\ty = %d\n",x,y); } int main() { dodaj(1); dodaj(3); dodaj(4); dodaj(1); return 0; } ==== Iteracja vs. rekurencja ==== **Wersja iteracyjna** int silnia(int n) { int i, s=1; for(i=1; i < n+1 ; i++) s*= i; return s; } **Wersja rekurencyjna** int rsilnia(int n) { if(n <= 1) return 1; return n*rsilnia(n-1); }