====== Funkcje ======
===== Definicja funcji i jej użycie =====
#include
/* definicja funkcji */
float kwadrat(float x)
{
float wynik;
wynik = x * x;
return wynik;
}
int main()
{
float liczba;
scanf("%f",&liczba);
printf("%f\n",kwadrat(liczba));
return 0;
}
** Ć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 ''*''
===== 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;
}
** Ćwiczenia **
* Napisz funkcję, która liczy i wyświetla ile razy została uruchomiona
==== Iteracja vs. rekurencja ====
#include
int silnia(int n)
{
int i=2, s=1;
while( i < n+1 )
{
s = s * i;
i = i + 1;
}
return s;
}
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;
}
** Ćwiczenia **
* Dla jakiej wartości program 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 ''**float p**'' i ''**int w**'' wyznacza wartość potęgi ''pw''
#include
/* deklaracja funckji rsilnia() */
int rsilnia(int n);
int main()
{
int liczba,s;
printf("Podaj liczbe: ");
scanf("%d",&liczba);
s = rsilnia(liczba);
printf("Silnia z %d wynosi %d\n",liczba,s);
return 0;
}
/* definicja funkcji rsilnia() */
int rsilnia(int n)
{
if(n <= 1) return 1;
return n*rsilnia(n-1);
}
** Ćwiczenia **
* Napisz funkcję ''rpotega()'', która dla danych argumentów ''float p'' i ''int w'' wyznacza **rekurencyjnie** wartość potęgi ''pw''
===== Funkcje matematyczne - biblioteka math.h =====
[[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]]\\
[[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 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