====== 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:
#include
#include
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 [[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:
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 =====
#include
#define MAX 100
void wczytaj(float t[], int n)
{
int i;
printf("\nPodaaj kolejne liczby:\n");
for(i=0;i
Ź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