Funkcje c.d.
Biblioteka standardowa
Język C udostępnia zbiór 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); }
Ćwiczenie: 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}{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 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
- 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; }
Ć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ę rand()
z biblioteki 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 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