Funkcje c.d.

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ę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:

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 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

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);
}
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 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:
    1. $k=n$
    2. znajdź pozycję $i$ elementu $x_i$ o największej wartości spośród $k$ pierwszych elementów (wykorzystaj w tym celu funkcję maxind())
    3. zamień element $x_i$ z elementem $x_k$
    4. wykonaj $k = k - 1$
    5. jeżeli $k > 1$ wróć do kroku 2
    6. 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