====== Funkcje ======
* [[05_funkcje#Zmianne lokalne vs. globalne|Zmianne lokalne vs. globalne]]
* [[05_funkcje#Zmiene statyczne vs. automatyczne|Zmiene statyczne vs. automatyczne]]
* [[05_funkcje#Iteracja vs. rekurencja|Iteracja vs. rekurencja]]
* [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]]
* [[05_funkcje#Funkcje matematyczne - biblioteka math.h|Funkcje matematyczne - biblioteka math.h]]
Na zajęciach obowiązuje **zakaz używania zmiennych globalnych** !
===== Definicja funkcji i jej użycie =====
#include
/* definicja funkcji */
int silnia(int n)
{
int i=2;
int s=1;
while( i < n+1 )
{
s = s * i;
i = i + 1;
}
return s;
}
float parabola(float x, float a, float b, float c)
{
return a * x * x + x * b + c;
}
int main()
{
int liczba, s;
float y;
printf("Podaj liczbe: ");
scanf("%d", &liczba);
s = silnia(liczba);
printf("Silnia z %d wynosi %d\n",liczba,s);
y = parabola( 2.0, -4, 2, 3.3);
return 0;
}
===== Zadanie: Najmniejszy wspólny dzielnik =====
Zaimplementuj funkcję ''nwd'', która dla dwóch liczb całkowitych wyznaczy najmniejszy wspólny dzielnik za pomocą algorytmu Euklidesa.
**Algorytm euklidesa**\\
Dane: liczby całkowite dodatnie ''a'' i ''b''
- jeżeli ''a'' jest równe ''b'' to wartość ''a'' jest najmniejsym wspólnym dzielnikiem i zakończ algorytm
- jeżeli ''a > b'' to zastąp ''a'' wartością ''a-b'' i wróć do punktu 1
- jeżeli ''a < b'' to zastąp ''b'' wartością ''b-a'' i wróć do punktu 1
Napisz program, który wczyta 2 liczby całkowite dodatnie i wyświetli ich najmniejszy wspólny dzielnik.
**Przykład**
Podaj dwie liczby calkowite:
20
15
nwd=5
Podaj dwie liczby calkowite:
144
233
nwd=1
Podaj dwie liczby calkowite:
4673826832
47382974392
nwd=8
===== Zadanie: Potega =====
Zaimplementuj funkcję o nazwie ''**potega**'', która dla danych argumentów ''x'' (wartość rzeczywista) i **y** (wartość całkowita) wyznacza wartość potęgi ''xy''.
Napisz program, który wczyta dwie liczby ''x'' i ''y'' a następnie korzystając z funkcji ''potega'' wypisze wartość ''xy''.
Spróbuj przystosować program tak aby działał poprawnie również dla wartości ''y<0''.
**Przykład**
Podaj dwie liczby:
2
2
2.000000 do potegi 10 wynosi 4.000000
Podaj dwie liczby:
2
10
2.000000 do potegi 10 wynosi 1024
Podaj dwie liczby:
2
-10
2.000000 do potegi -5 wynosi 0.031250
Podaj dwie liczby:
4.2
10
4.2 do potegi 10 wynosi 1708019.8
===== Zadanie: Liczby pierwsze =====
Zaimplementuj funkcję o nazwie ''**czy_jest_pierwsza**'', która dla podanej liczby całkowitej ''n'' zwraca wartość 1 jeżeli ''n'' jest liczbą pierwszą. W przeciwnym wypadku funkcja zwraca wartość 0. \\
Napisz program, który wczyta dodatnią liczbę całkowitą ''x''i wypisze wszystkie liczby pierwsze w zakresie od 1 do ''x''.
**Przykład**
n = 10
Liczby pierwsze z zakresu od 1 do 10
1 2 3 5 7
n = 100
Liczby pierwsze z zakresu od 1 do 100
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
===== Tablica jako argument funkcji =====
#include
#define MAX 100
void wczytaj(float t[], int n)
{
int i;
printf("\nPodaaj kolejne liczby:\n");
for(i=0;i
===== Zadanie: Statystyki =====
Do powyższego przykładu prezentującego użycie tablicy jako argumentu funkcji dodaj:
* funkcję ''wyswietl'', która wyświetli ''n'' pierwszych liczb rzeczywistych z podanej tablicy zmiennych typu ''float''
* funkcję ''suma'', która zwraca wartość sumy elementów podanej tablicy
* 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
* funkcję ''maxind'', która zwróci pozycję (wartość od 0 do ''n-1'') największej wartości z pośród ''n'' pierwszych elementów tablicy
* funkcję ''sortuj'' , która posortuje liczby w tablicy za pomocą algorytmu przez wybieranie (wykorzystaj tu funkcję ''maxind'')
Napisz program, który wczyta ''n'' liczb rzeczywistych a następnie wyświetli wartość średnią, wartość odchylenia standardowego oraz posortowaną liste liczb.
**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
Posortowane elementy tablicy:
t[0] = -5.400000
t[1] = 2.300000
t[2] = 3.140000
t[3] = 5.300000
t[4] = 32.000000
===== Pomocne przykłady =====
==== Zmianne lokalne vs. globalne ====
#include
int globalna;
void f(void)
{
int lokalna = 6;
globalna++;
printf("wewnatrz funkcji: globalna = %d\tlokalna = %d\n",globalna,lokalna);
}
int main()
{
int lokalna;
printf("globalna = %d\tlokalna = %d\n",globalna,lokalna);
f();
printf("globalna = %d\tlokalna = %d\n",globalna,lokalna);
return 0;
}
==== Zmiene statyczne vs. automatyczne ====
#include
void dodaj(int a)
{
static int x = 0; /* zmienna statyczna */
int y = 0; /* zmienna automatyczna */
x = x + a;
y = y + a;
printf("x = %d\ty = %d\n",x,y);
}
int main()
{
dodaj(1);
dodaj(3);
dodaj(4);
dodaj(1);
return 0;
}
==== Iteracja vs. rekurencja ====
**Wersja iteracyjna**
int silnia(int n)
{
int i, s=1;
for(i=1; i < n+1 ; i++) s*= i;
return s;
}
**Wersja rekurencyjna**
int rsilnia(int n)
{
if(n <= 1) return 1;
return n*rsilnia(n-1);
}
===== Zadania domowe =====
- Napisz funkcję ''**Fibonacci**'' (w postaci iteracyjnej lub rekurencyjnej), która wyświetla ''**n**'' pierwszych elementów [[http://pl.wikipedia.org/wiki/Ci%C4%85g_Fibonacciego|ciągu Fibonacciego]].\\ Elementy ciągu wynoszą: F0=0, F1=1 i Fn=Fn-1+Fn-2 dla ''n > 1''
- Napisz funkcję ''**Newton**'', która dla podanych dwóch liczb całkowitych oblicza wartość [[http://pl.wikipedia.org/wiki/Symbol_Newtona|symbolu Newtona]]
- Napisz funkcję ''**Gauss**'', która dla podanej wartości centrum (wartości średniej) i rozmycia (odchylenia standardowego) oblicza wartość [[http://pl.wikipedia.org/wiki/Rozk%C5%82ad_normalny#Funkcja_g.C4.99sto.C5.9Bci|funkcji Gaussa]]
- Napisz funkcję wyznaczającą sumę ''n'' pierwszych elementów ciągu arytmetycznego
- Napisz funkcję wyznaczającą sumę ''n'' pierwszych elementów ciągu geometrycznego
- Napisz funkcję, która odwróci kolejność elementów w tablicy
- Napisz funkcję, która dokona przesunięcia cyklicznego wszystkich elementów tablicy o podaną wartość elementów
- Napisz funkcję, która dla podanej liczby całkowitej ''n'' wypisze wszystkie liczby pierwsze od 1 do ''n'' korzystając z sita [[wppl>Sito_Eratostenesa|sita Eratotenesa]]