====== Funkcje ====== * [[05_funkcje#Zmianne lokalne vs. globalne|Zmianne lokalne vs. globalne]] * [[05_funkcje#Zmiene statyczne vs. automatyczne|Zmiene statyczne vs. automatyczne]] * [[05_funkcje#Iteracja vs. rekurencja|Iteracja vs. rekurencja]] * [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]] * [[05_funkcje#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 /* definicja funkcji */ int silnia(int n) { int i=2; int s=1; while( i < n+1 ) { s = s * i; i = i + 1; } return s; } float parabola(float x, float a, float b, float c) { return a * x * x + x * b + c; } int main() { int liczba, s; float y; printf("Podaj liczbe: "); scanf("%d", &liczba); s = silnia(liczba); printf("Silnia z %d wynosi %d\n",liczba,s); y = parabola( 2.0, -4, 2, 3.3); return 0; } ===== Zadanie: Najmniejszy wspólny dzielnik ===== Zaimplementuj funkcję ''nwd'', która dla dwóch liczb całkowitych wyznaczy najmniejszy wspólny dzielnik za pomocą algorytmu Euklidesa. **Algorytm euklidesa**\\ Dane: liczby całkowite dodatnie ''a'' i ''b'' - jeżeli ''a'' jest równe ''b'' to wartość ''a'' jest najmniejsym wspólnym dzielnikiem i zakończ algorytm - jeżeli ''a > b'' to zastąp ''a'' wartością ''a-b'' i wróć do punktu 1 - jeżeli ''a < b'' to zastąp ''b'' wartością ''b-a'' i wróć do punktu 1 Napisz program, który wczyta 2 liczby całkowite dodatnie i wyświetli ich najmniejszy wspólny dzielnik. **Przykład** Podaj dwie liczby calkowite: 20 15 nwd=5 Podaj dwie liczby calkowite: 144 233 nwd=1 Podaj dwie liczby calkowite: 4673826832 47382974392 nwd=8 ===== Zadanie: Potega ===== Zaimplementuj funkcję o nazwie ''**potega**'', która dla danych argumentów ''x'' (wartość rzeczywista) i **y** (wartość całkowita) wyznacza wartość potęgi ''xy''. Napisz program, który wczyta dwie liczby ''x'' i ''y'' a następnie korzystając z funkcji ''potega'' wypisze wartość ''xy''. Spróbuj przystosować program tak aby działał poprawnie również dla wartości ''y<0''. **Przykład** Podaj dwie liczby: 2 2 2.000000 do potegi 10 wynosi 4.000000 Podaj dwie liczby: 2 10 2.000000 do potegi 10 wynosi 1024 Podaj dwie liczby: 2 -10 2.000000 do potegi -5 wynosi 0.031250 Podaj dwie liczby: 4.2 10 4.2 do potegi 10 wynosi 1708019.8 ===== Zadanie: Liczby pierwsze ===== Zaimplementuj funkcję o nazwie ''**czy_jest_pierwsza**'', która dla podanej liczby całkowitej ''n'' zwraca wartość 1 jeżeli ''n'' jest liczbą pierwszą. W przeciwnym wypadku funkcja zwraca wartość 0. \\ Napisz program, który wczyta dodatnią liczbę całkowitą ''x''i wypisze wszystkie liczby pierwsze w zakresie od 1 do ''x''. **Przykład** n = 10 Liczby pierwsze z zakresu od 1 do 10 1 2 3 5 7 n = 100 Liczby pierwsze z zakresu od 1 do 100 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ===== Tablica jako argument funkcji ===== #include #define MAX 100 void wczytaj(float t[], int n) { int i; printf("\nPodaaj kolejne liczby:\n"); for(i=0;i ===== Zadanie: Statystyki ===== Do powyższego przykładu prezentującego użycie tablicy jako argumentu funkcji dodaj: * funkcję ''wyswietl'', która wyświetli ''n'' pierwszych liczb rzeczywistych z podanej tablicy zmiennych typu ''float'' * funkcję ''suma'', która zwraca wartość sumy elementów podanej tablicy * funkcję ''srednia'', która zwraca wartość średnią dla danej tablicy liczb typu ''float'' o rozmiarze ''n'' * funkcję ''odchylenie'', która wyznaczy wartość odchylenia standardowego liczb zawartych w tablicy * funkcję ''maxind'', która zwróci pozycję (wartość od 0 do ''n-1'') największej wartości z pośród ''n'' pierwszych elementów tablicy * funkcję ''sortuj'' , która posortuje liczby w tablicy za pomocą algorytmu przez wybieranie (wykorzystaj tu funkcję ''maxind'') Napisz program, który wczyta ''n'' liczb rzeczywistych a następnie wyświetli wartość średnią, wartość odchylenia standardowego oraz posortowaną liste liczb. **Przykład:** Ile elementow ? n = 5 t[0] = 5.3 t[1] = 2.3 t[2] = -5.4 t[3] = 3.14 t[4] = 32 Suma = 37.340000 Srednia = 7.468000 Odchylenie = 12.787060 Posortowane elementy tablicy: t[0] = -5.400000 t[1] = 2.300000 t[2] = 3.140000 t[3] = 5.300000 t[4] = 32.000000 ===== 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); } ===== 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 funkcję, która odwróci kolejność elementów w tablicy - Napisz funkcję, która dokona przesunięcia cyklicznego wszystkich elementów tablicy o podaną wartość elementów - Napisz funkcję, która dla podanej liczby całkowitej ''n'' wypisze wszystkie liczby pierwsze od 1 do ''n'' korzystając z sita [[wppl>Sito_Eratostenesa|sita Eratotenesa]]