====== Funkcje ======
* [[zajecia3#Zmianne lokalne vs. globalne|Zmianne lokalne vs. globalne]]
* [[zajecia3#Zmiene statyczne vs. automatyczne|Zmiene statyczne vs. automatyczne]]
* [[zajecia3#Iteracja vs. rekurencja|Iteracja vs. rekurencja]]
* [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]]
* [[zajecia3#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
/* deklaracja funkcji */
int silnia(int n);
int main()
{
int liczba,s;
printf("Podaj liczbe: ");
scanf("%d",&liczba);
s = silnia(liczba);
printf("Silnia z %d wynosi %d\n",liczba,s);
return 0;
}
/* definicja funkcji */
int silnia(int n)
{
int i=2, s=1;
while( i < n+1 )
{
s = s * i;
i = i + 1;
}
return s;
}
** Ćwiczenia **
* Napisz funkcję o nazwie ''**jest_pierwsza**'', która dla danej liczby całkowitej zwraca wartość 1 gdy podana liczba jest liczbą pierwszą a wartość 0 - gdy jest nie jest
* Korzystając z funkcji ''jest_pierwsza'' napisz program który wyświetli wszystkie liczby pierwsze mniejsze lub równe pewnej podanej przez użytkownika liczbie całkowitej
* Napisz funkcję o nazwie ''**trojkat**'', która dla danej liczby całkowitej wyświetla trójkąt prostokątny złożony z podanej liczby linii, np.:
*****
****
***
**
*
* dodaj kolejny argument do funkcji ''**trojkat()**'', który określa jaki znak będzie użyty zamiast ''*''
* Sprawdź dla jakich danych wejściowych program obliczający silnię przestaje dawać wiarygodne wyniki? Spróbuj zwiększyć zakres dokładnie obliczanych wartości.
* Napisz funkcję o nazwie ''**potega**'', która dla danych argumentów ''x'' (wartość rzeczywista) i **y** (wartość całkowita) wyznacza wartość potęgi ''xy''
* Napisz funkcję ''rpotega()'', która dla danych argumentów ''float p'' i ''int w'' wyznacza **rekurencyjnie** wartość potęgi ''pw''
* Napisz funkcję o nazwie **licznik**, która zwraca liczbę określającą ile razy dotychczas ta funkcja została uruchomiona
===== Funkcje matematyczne - biblioteka math.h =====
[[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#math.h|Spis funkcji math.h]]\\
** Ćwiczenia **
* zobacz opis funkcji ''scanf()'', ''printf()'', ''getchar()'' i ''putchar()'' (biblioteka ''stdio.h'')
* korzystając z odpowiednich funkcji z biblioteki standardowej napisz funkcję ''**void pierwiastki(float a,float b,float c)**'', która wyświetla miejsca zerowe równania y = ax2 + bx +c lub komunikat o ich braku
** Uwaga **
Kompilując program korzystający z funkcji matematycznych zadeklarowanych w pliku ''**math.h**'' należy dodać opcję ''**-lm**'', czyli
dla programu zawartego w pliku ''pirwiatek.c'' kompilacja w Linuksie wygląda tak
cc pierwiastek.c -lm -o pierwiastek
===== 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 i przetestuj funkcję, która znajduje największy wspólny dzielnik dwóch liczb naturalnych. Można skorzystać z algorytmu Euklidesa podanego poniżej\\
Dla danych dwóch liczb X i Y
1. jeśli X jest równe Y to jest to największy dzielnik
2. jeśli X > Y to niech X <- X - Y i wróć do punktu 1
3. jeśli X < Y to niech Y <- Y - X i wróć do punktu 1
===== 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);
}