Funkcje c.d.
Biblioteka standardowa
Język C udostępnia zbiór wielu podstawowych funkcji zawartych w tzw. bibliotece standardowej.
Oto kilka przydatnych plików nagłówkowych dostępnych w każdej wersji języka C:
- math.h - funkcje matematyczne, np.:
- funkcje trygonometryczne
sin(),cos(),
* pierwiastek kwadratowysqrt(), potęgapow()
* logarytm naturalnylog(), logarytm dziesiętnylog10(), funkcja wykładniczaexp()
- ctype.h - klasyfikacja znaków, np.:
isupper()sprawdza, czy znak jest mała literą,toupper()zamienia mała literę na dużą
- stdlib.h - zbiór podstawowych funkcji, np.:
rand()generator liczb losowychexit()zamknięcie programusystem()uruchomienie polecenia systemowego
- string.h - funkcje do manipulacji napisami, np.:
strcmp()porównanie kolejności alfabetycznej dwóch napisówstrcpy()skopiowanie napisu
- time.h - obsługa czasu, np.:
clock()czas wykonywania programutime()czas, który upłynął od dnia 1 stycznia 1970 roku
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:
- 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); }
Zadanie: funkcje matematyczne
Zapoznaj się z funkcjami matematycznymi dostępnymi w bibliotece 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 funkcjagauss()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 plikumath.hmoż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:
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. 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:
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); }
Przykład: funkcja wczytująca liczby do tablicy
- 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; }
Źródło: 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 typufloato rozmiarzen - 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 typufloatoraz liczba całkowitan. Wartością zwracaną funkcji jest liczba całkowita z zakresu od0don-1wskazująca pozycję elementu o największej wartości spośródnpierwszych 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 ekranienliczb 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