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 kwadratowy
sqrt()
, potęgapow()
- logarytm naturalny
log()
, 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.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:
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 typufloat
o 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 typufloat
oraz liczba całkowitan
. Wartością zwracaną funkcji jest liczba całkowita z zakresu od0
don-1
wskazująca pozycję elementu o największej wartości spośródn
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 ekranien
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