Funkcje

Zmianne lokalne vs. globalne

Zmiene statyczne vs. automatyczne

Iteracja vs. rekurencja

Biblioteka standardowa

Funkcje matematyczne - biblioteka math.h

zakaz używania zmiennych globalnych

Definicja funkcji i jej użycie

#include <stdio.h> /* 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ą xi 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 <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]); } } int main() { int n; float tablica[MAX]; printf("Podaj rozmiar tablicy: "); scanf("%d",&n); wczytaj(tablica,n); }

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<stdio.h> 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 <stdio.h> 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 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ść symbolu Newtona

Napisz funkcję Gauss, która dla podanej wartości centrum (wartości średniej) i rozmycia (odchylenia standardowego) oblicza wartość 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 sita Eratotenesa