====== Funkcje c.d. ====== ===== Biblioteka standardowa ===== Język C udostępnia zbiór podstawowych funkcji zawartych w tzw. [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|bibliotece standardowej]]. \\ Oto kilka przydatnych plików nagłówkowych dostępnych w każdej wersji języka C: * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#math.h|math.h]] - funkcje matematyczne, np.: * funkcje trygonometryczne ''sin()'', ''cos()'', * pierwiastek kwadratowy ''sqrt()'', potęga ''pow()'' * logarytm naturalny ''log()'', logarytm dziesiętny ''log10()'', funkcja wykładnicza ''exp()'' * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#ctype.h|ctype.h]] - klasyfikacja znaków, np.: * ''isupper()'' sprawdza, czy znak jest mała literą, * ''toupper()'' zamienia mała literę na dużą * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdlib.h|stdlib.h]] - zbiór podstawowych funkcji, np.: * ''rand()'' generator liczb losowych * ''exit()'' zamknięcie programu * ''system()'' uruchomienie polecenia systemowego * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#string.h|string.h]] - funkcje do manipulacji napisami, np.: * ''strcmp()'' porównanie kolejności alfabetycznej dwóch napisów * ''strcpy()'' skopiowanie napisu * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#time.h|time.h]] - obsługa czasu, np.: * ''clock()'' czas wykonywania programu * ''time()'' czas, który upłynął od dnia 1 stycznia 1970 roku * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdio.h|stdio.h]] - obsługa wejścia/wyjścia, np. ''fprintf()'', ''fscanf()'' Chcąc skorzystać z funkcji z biblioteki należy na początku pliku włączyć odpowiedni plik nagłówkowy za pomocą dyrektywy ''#define''. Przykładowo, funkcja obliczająca pierwiastek kwadratowy ''sqrt()'' jest dostępna w bibliotece ''math.h''. Poniższy przykład demonstruje sposób użycia tej funkcji: #include #include int main() { float x, y; scanf("%f", &x); y = sqrt(x); printf("Pierwiastek z %f wynosi %f\n", x, y); } ==== Ćwiczenie: funkcje matematyczne ===== Zapoznaj się z funkcjami matematycznymi dostępnymi w bibliotece [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#math.h|math.h]] a następnie zaimplementuj jedną z poniższych funkcji: * funkcja o nazwie ''sigmoida()'', która dla danej wartości rzeczywistej $x$ zwraca wartość funkcji sigmoidalnej (logistycznej) danej wzorem \[ f(x) = \frac{1}{1+e^{-x}}\] * funkcja o nazwie ''fx()'', która dla danej wartości rzeczywistej $x$ zwraca wartość \[ f(x) = \frac{x^{2.7} + \log_{10}(x)}{1+ \sqrt{\cos^2(x) + 1}} \] * funkcja o nazwie ''gauss()'', która wyznacza wartość funkcji Gaussa podanej wzorem: \[ f(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] \\ Zwróć uwagę, że funkcja ''gauss()'' będzie posiadała trzy argumenty ($x$, $\mu$, $\sigma$), które są wartościami rzeczywistymi. Parametr $\mu$ określa centrum funkcji, zaś parametr $\sigma$ określa "szerokość" funkcji. W pliku ''math.h'' może brakować definicji stałej $\pi$, wówczas przyjmij przybliżenie $\pi \approx 3,1415$ Napisz program, który tablicuje wartości jednej z powyższych funkcji $f(x)$ w przedziale $[a,b]$. Program wypisuje w kolejnych liniach $n$ wartości $x$ z przedziału od $a$ do $b$ ze stałym krokiem oraz odpowiadające wartości funkcji $f(X)$ tak jak na poniższym przykładzie. **Dane wejściowe programu**: * wartość rzeczywista $a$ określająca dolną granicę przedziału * wartość rzeczywista $b$ określająca górną granicę przedziału * liczba całkowita $n$ określająca liczbę kroków * opcjonalnie: wartość średnia $\mu$ i odchylenie $\sigma$ jeżeli zastosowano funkcję Gauss **Dane wyjściowe prigramu**: * lista zawierająca $n$ kolejnych wartości $x$ oraz odpowiadających wartości $f(x)$, gdzie $x$ określone jest na odcinku od $a$ do $b$ ze stałym krokiem. **Przykład działania programu:** Zakładając, że w programie zaimplementowano funkcję ''sigmoid()'' przykładowy wynik działania programu może wyglądać tak: Wartosc minimalna: -5 Wartośc maksymalna: +5 Ile krokow: 10 x f(x) ---------------------- -5.000000 0.006693 -4.000000 0.017986 -3.000000 0.047426 -2.000000 0.119203 -1.000000 0.268941 0.000000 0.500000 1.000000 0.731059 2.000000 0.880797 3.000000 0.952574 4.000000 0.982014 5.000000 0.993307 ===== Tablica jako argument funkcji ===== Argumentem funkcji może być również tablica, wówczas definicja funkcji wygląda w następujący sposób: void funkcja(int tablica[]) { int x; x = tablica[2]; } Zwróć uwagę, że tablica deklarowana w argumencie (''int tablica[]'') nie zawiera informacji o rozmiarze. Wewnątrz funkcji nie ma informacji o tym jak dużo elementów mieści tablica. W przypadku funkcji, które mają działać dla dowolnie dużych tablic, informacja o rozmiarze musi być przekazana wartością drugiego argumentu. Przykład definicji funkcji, która liczy sumę ''n'' elementów tablicy ''tab'': float suma(float tab[], int n) { float s = 0; int i = 0; while( i < n ) { s = s + tab[i]; i = i + 1; } return s; } Wywołanie funkcji, której argumentem jest tablica nie różni się niczym od wywołania funkcji, której argumentami są zmienne typów prostych. W argumencie funkcji podajemy nazwę tablicy. Przykład: int main() { float t[100], x; t[0] = 5; t[1] = 2; x = suma(t, 2); } Tablica, która jest argumentem funkcji, nie jest kopiowana do funkcji, tj. funkcja działa na oryginalnej tablicy i może zmodyfikować jej zawartość. ===== Przykład: funkcja wczytująca liczby do tablicy ===== #include #define MAX 100 void wczytaj(float t[], int n) { int i; printf("\nPodaaj kolejne liczby:\n"); for(i=0;i ==== Ćwiczenie: losowanie lotto ===== Zdefiniuj funkcję o nazwie ''wymieszaj()'', która przestawi w sposób losowy pozycję liczb znajdujących się w tablicy.\\ **Argumenty funkcji**: * tablica z liczbami całkowitymi, * liczba całkowita ''n'' określająca ilość liczb znajdujących się w tablicy **Wartość zwracana**: * brak wartości zwracanej. Po wykonaniu funkcji liczby w tablicy danej w argumencie będą znajdowały się w losowym położeniu. Algorytm mieszania liczb ciągu $n$ liczb: dla każdego elementu ciągu $x_i$ o indeksie $i=0, 1, 2, \ldots, n-1$ wylosuj wartość całkowitą $k$ z zakresu od 0 do $n-1$ i zamień wartości elementu $i$-tego $x_i$ z elementem $k$-tym $x_k$. Do losowania liczb całkowitych wykorzystaj funkcję ''[[https://pl.wikibooks.org/wiki/C/rand|rand()]]'' z biblioteki ''[[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdlib.h|stdlib.h]]''. int rand(void); Funkcja ta przy każdym uruchomieniu zwraca liczbę całkowitą pseudolosową z zakresu od 0 do wartości określonej przez ''RAND_MAX''. Generator liczb losowych można zainicjować za pomocą funkcji ''srand()'' void srand(int seed); Chcąc uzyskać za każdym razem inny ciąg liczb najwygodniej jest zainicjować generator wartością związaną z aktualnym czasem: funkcja ''[[https://pl.wikibooks.org/wiki/C/time|time()]]'' z biblioteki ''time.h'' zwraca liczbę sekund, które upłynęły od dnia 1 stycznia 1970 roku godziny 0:00:00 czasu uniwersalnego. Napisz program, który korzystając z funkcji ''wymieszaj()'' przeprowadzi losowanie lotto, tj. wypisze 6 losowych wartości z zakresu od 1 do 49.\\ 1. wypełnij bęben losujący kulami ponumerowanymi od 1 do 49 \\ 2. dokonaj losowania (wymieszanie zawartości bębna losującego) \\ 3. wypisz numery 6 kul znajdujących się na początku \\ ==== Zadanie: Średnia i odchylenie standardowe ==== Zdefiniuj dwie funkcje o nazwie ''srednia()'' oraz ''odchylenie()'' zgodnie z poniższa specyfikacją. Funkcja ''srednia()'' wyznacza średnią arytmetyczną ''n'' liczb rzeczywistych umieszczonych w tablicy.\\ **Argumenty funkcji**: * tablica z liczbami rzeczywistymi, * liczba całkowita ''n'' określająca ilość liczb znajdujących się w tablicy **Wartość zwracana**: * wartość rzeczywista, średnia arytmetyczna wartości z tablicy dana wzorem: \[ \bar{x}=\frac{1}{n}\sum_{i=1}^n x_i\] Funkcja ''odchylenie()'' wyznacza wartość odchylenia standardowego liczb zawartych w tablicy. \\ Odchylenie standardowe dla $n$ wartości $x_1, x_2, \ldots, x_n$ wyznacz ze wzoru: \[ s=\sqrt{\frac{1}{n-1}\sum_{i=1}^n\left(x_i - \bar{x}\right)^2} \] gdzie $\bar{x}$ oznacza wartość średnią. \\ **Argumenty funkcji**: * tablica z liczbami rzeczywistymi, * liczba całkowita ''n'' określająca ilość liczb znajdujących się w tablicy **Wartość zwracana**: * wartość odchylenia standardowego wartości z tablicy Napisz program, który korzystając z funkcji ''srednia'' i ''odchylenie'' wyznaczy i wyświetli wartość średnią oraz wartość odchylenia standardowego ''n'' podanych przez użytkownika liczb rzeczywistych. Zakładamy, że liczb nie będzie więcej niż 1000. Wartość ''n'' oraz ciąg ''n'' liczb podaje użytkownik na początku działania programu. **Przykład:** Ile elementow ? n = 5 Wprowadz liczby t[0] = 5.3 t[1] = 2.3 t[2] = -5.4 t[3] = 3.14 t[4] = 32 Srednia = 7.468000 Odchylenie = 12.787060