Spis treści

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:

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:

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:

Dane wyjściowe prigramu:

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:

Wartość zwracana:

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:

Wartość zwracana:

\[ \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:

Wartość zwracana:

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