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ęga pow()

logarytm naturalny log(), logarytm dziesiętny log10(), funkcja wykładnicza exp()

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 losowych

exit() zamknięcie programu

system() uruchomienie polecenia systemowego

string.h - funkcje do manipulacji napisami, np.:

strcmp() porównanie kolejności alfabetycznej dwóch napisów

strcpy() skopiowanie napisu

time.h - obsługa czasu, np.:

clock() czas wykonywania programu

time() czas, który upłynął od dnia 1 stycznia 1970 roku

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<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 zwraca wartość funkcji sigmoidalnej (logistycznej) danej wzorem

funkcja o nazwie fx(), która dla danej wartości rzeczywistej zwraca wartość

funkcja o nazwie gauss(), która wyznacza wartość funkcji Gaussa podanej wzorem:
Zwróć uwagę, że funkcja gauss() będzie posiadała trzy argumenty (, , ), które są wartościami rzeczywistymi. Parametr określa centrum funkcji, zaś parametr określa „szerokość” funkcji. W pliku math.h może brakować definicji stałej , wówczas przyjmij przybliżenie

Napisz program, który tablicuje wartości jednej z powyższych funkcji w przedziale . Program wypisuje w kolejnych liniach wartości z przedziału od do ze stałym krokiem oraz odpowiadające wartości funkcji tak jak na poniższym przykładzie.

Dane wejściowe programu:

wartość rzeczywista określająca dolną granicę przedziału

wartość rzeczywista określająca górną granicę przedziału

liczba całkowita określająca liczbę kroków

opcjonalnie: wartość średnia i odchylenie jeżeli zastosowano funkcję Gauss

Dane wyjściowe prigramu:

lista zawierająca kolejnych wartości oraz odpowiadających wartości , gdzie określone jest na odcinku od do 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

#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 liczb: dla każdego elementu ciągu o indeksie wylosuj wartość całkowitą z zakresu od 0 do i zamień wartości elementu -tego z elementem -tym .

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:

Funkcja odchylenie() wyznacza wartość odchylenia standardowego liczb zawartych w tablicy.
Odchylenie standardowe dla wartości wyznacz ze wzoru: gdzie 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