Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Funkcje c.d. ====== ===== Biblioteka standardowa ===== Język C udostępnia zbiór wielu 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: <file C pierwiastek.c> #include<math.h> #include<stdio.h> int main() { float x, y; scanf("%f", &x); y = sqrt(x); printf("Pierwiastek z %f wynosi %f\n", x, y); } </file> ==== Zadanie: 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}{\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**: 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: <code C> void funkcja(int tablica[]) { int x; x = tablica[2]; } </code> 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. Funkcje, 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'': <code C> float suma(float tab[], int n) { float s = 0; int i = 0; while( i < n ) { s = s + tab[i]; i = i + 1; } return s; } </code> 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: <code C> int main() { float t[100], x; t[0] = 5; t[1] = 2; x = suma(t, 2); } </code> ===== Przykład: funkcja wczytująca liczby do tablicy ===== <file C tab_suma.c> #include <stdio.h> #define MAX 100 void wczytaj(float t[], int n) { int i; printf("\nPodaaj kolejne liczby:\n"); for(i=0;i<n;i++) { printf("tab[%d]=",i); scanf("%f",&t[i]); } } float suma(float tab[], int n) { float s = 0; int i; for(i=0; i < n; i++) s = s + tab[i]; return s; } int main() { int n; float tablica[MAX], x; printf("Podaj rozmiar tablicy: "); scanf("%d", &n); wczytaj(tablica, n); x = suma(tablica, n); printf("Suma liczb wynosi %f\n", x); return 0; } </file> Źródło: {{zajecia:pp1_2020_1:tab_suma.c}} ==== Zadanie: Statystyki ==== Do powyższego przykładu prezentującego użycie tablicy jako argumentu funkcji dodaj: * 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. 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ą daną wzorem \[ \bar{x}=\frac{1}{n}\sum_{i=1}^n x_i\] Napisz program, który wczyta ''n'' liczb rzeczywistych podanych przez użytkownika a następnie wyświetli wartość średnią oraz wartość odchylenia standardowego podanych liczb. Zakładamy, że liczb nie będzie więcej niż 1000. **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 ==== Zadanie: Sortowanie przez wybieranie ==== Do powyższego przykładu programu, który zawiera funkcję ''wczytaj()'' dodaj następujące funkcje: * funkcja ''maxind()'' wyszukuje element tablicy o największej wartości. Argumentem funkcji jest tablica zawierająca liczby typu ''float'' oraz liczba całkowita ''n''. Wartością zwracaną funkcji jest liczba całkowita z zakresu od ''0'' do ''n-1'' wskazująca pozycję elementu o największej wartości spośród ''n'' pierwszych elementów tablicy. * funkcja ''sortuj()'' sortuje liczby w tablicy za pomocą algorytmu przez wybieranie. Algorytm ten w każdym kroku wyszukuje największy element wśród nieuporządkowanych elementów i umieszcza go na początku ciągu uporządkowanych liczb. \\ **Algortym sortowania**: dla danych $n$ liczb $x_1, x_2, \ldots, x_n$ wykonuj: - $k=n$ - znajdź pozycję $i$ elementu $x_i$ o największej wartości spośród $k$ pierwszych elementów (wykorzystaj w tym celu funkcję ''maxind()'') - zamień element $x_i$ z elementem $x_k$ - wykonaj $k = k - 1$ - jeżeli $k > 1$ wróć do kroku 2 - koniec: wynikiem jest posortowany ciąg liczb * funkcja ''wyswietl()'' wypisuje na ekranie ''n'' liczb rzeczywistych z podanej tablicy Napisz program, który posortuje ''n'' liczb rzeczywistych podanych przez użytkownika korzystając z powyższych funkcji. **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 Posortowane elementy tablicy: t[0] = -5.400000 t[1] = 2.300000 t[2] = 3.140000 t[3] = 5.300000 t[4] = 32.000000