You are on page 1of 101

Osnove raunarstva 2015/2016

Funkcije
Doc. dr Vedran Ljubovi

ta su to funkcije?

U programskom jeziku C, funkcija je blok koda kojem


dajemo ime i moemo ga pozivati pod tim imenom.
Svaki program se sastoji od jedne ili vie funkcija.
Obavezna je funkcija main.
Funkcija ima 0, 1 ili vie parametara odreenih tipova.
Funkcija moe i ne mora imati povratnu vrijednost
odreenog tipa.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:


double sqrt(double)
...

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:


double sqrt(double)
...
Primjer funkcije koja nema parametara:

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:


double sqrt(double)
...
Primjer funkcije koja nema parametara:
int rand()
int getchar()

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:


double sqrt(double)
...
Primjer funkcije koja nema parametara:
int rand()
int getchar()
Primjer funkcije koja nema povratnu vrijednost:

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Ve smo koristili neke funkcije...

Primjeri matematikih funkcija:


double sqrt(double)
...
Primjer funkcije koja nema parametara:
int rand()
int getchar()
Primjer funkcije koja nema povratnu vrijednost:
void exit(int povratna_vrijednost)
void srand(time_t t)
printf ustvari je tipa int, ali mi tu vrijednost nismo koristili

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Procedure

Funkcija tipa void nema povratnu vrijednost ("ne vraa


nita"). Takve funkcije se nazivaju procedure ili
podprogrami (subrutine, eng. procedures, subroutines).
Procedure se ne pozivaju zbog vrijednosti koju vraaju
nego zbog posla koji obavljaju.

Npr. ako se zadatak sastoji od vie nepovezanih podzadataka,


moemo za svaki napraviti po jednu proceduru.

Procedure mogu komunicirati preko globalnih promjenljivih


to nije preporuljivo (bolje je koristiti funkcije).

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

Deklaracija funkcije

Deklaracija funkcije se sastoji od:

prototipa funkcije i

implementacije funkcije

Prototip funkcije se mora nalaziti prije mjesta gdje se


funkcija nalazi.
Implementacija se moe nalaziti odmah uz prototip ili
kasnije.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

10

Prototip funkcije

Prototip funkcije:
tip ime(tip param1, tip param2, ...)

Najprije se navodi tip vrijednosti koju funkcija vraa ili void


ako nema povratnu vrijednost.
Ime funkcije moe biti bilo ta, pravila za imena funkcije su
ista kao i za imena promjenljivih.
Za svaki parametar se navodi tip parametra i ime
parametra. Parametri su razdvojeni zarezom. Ako nema
parametara, ostavlja se otvorena i zatvorena zagrada ().

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

11

Implementacija funkcije

Implementacija funkcije se moe nalaziti odmah uz


prototip ili kasnije.

Najlake: kompletnu funkciju stavite iznad main-a.

Ako se iz funkcije A poziva funkcija B, prvo trebate


navesti funkciju B a zatim funkciju A.

U standardnom C i C++ programskom jeziku nije


dozvoljeno imati funkciju u funkciji.

1.12.2015

Neki kompajleri to podravaju (nestandardna


ekstenzija).

Vedran Ljubovi * OR15 * P12: Funkcije

12

Poziv funkcije

Da bismo pozvali funkciju, bilo gdje u kodu navodimo ime


funkcije i u malim zagradama eljenu vrijednost parametra.

Ako funkcija vraa vrijednost, ta vrijednost e biti


uvrtena na mjesto poziva.

Ako ne vraa, ne smije se pokuati koristiti povratna


vrijednost, u suprotnom se deava greka.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

13

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

14

Primjer
#include <stdio.h>

Prototip funkcije.
Funkcija ima jedan parametar
tipa int, vraa vrijednost tipa int.

int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

15

Primjer
#include <stdio.h>

Prototip funkcije.
Funkcija ima jedan parametar
tipa int, vraa vrijednost tipa int.

int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

Implementacija funkcije

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

16

Primjer
#include <stdio.h>

Prototip funkcije.
Funkcija ima jedan parametar
tipa int, vraa vrijednost tipa int.

int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

Implementacija funkcije

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y Poziv
je: %d\n",
funkcije y);
f.
return 0;
Proslijeena vrijednost x.
}

Povratna vrijednost uzeta


u promjenljivu y

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

17

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

18

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
Unesite broj x: 5
Sada pozivamo funkciju...
int main() {
Poziv funkcije f, a je 5
int x, y;
Nakon poziva y je: 11
printf("Unesite broj x: ");

1.12.2015

scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;

Vedran Ljubovi * OR15 * P12: Funkcije

19

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

20

Primjer
#include <stdio.h>
int f(int a) {
Izvravanje programa kree
printf("Poziv funkcije f, a je %d\n", a);
od main funkcije
return a*2+1;
}

x=?, y=?

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

21

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

22

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

23

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."

Kao parametar funkciji se


daje vrijednost x

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

24

Poziv po vrijednosti

Obratite panju da se funkciji daje vrijednost promjenljive


x, ne sama ta promjenljiva.
U pozivu funkcije je mogao stajati i neki matematiki izraz:
y = f(2*x+5);
y = f(15);
y = f(g(x));
(najprije se poziva funkcija g pa se njen rezultat alje
funkciji f).

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

25

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

26

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

27

Primjer
Parametar funkcije a
dobija vrijednost 5
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

28

Parametri funkcije

Parametar funkcije je nova promjenljiva koja je lokalna za


funkciju.
U trenutku kada se pozove funkcija, ta promjenljiva se
inicijalizuje vrijednou koja je navedena u pozivu.
Parametar se moe i mijenjati u funkciji, to nema efekta
na main.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

29

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

30

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
a++;
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

31

Primjer
Mogli smo promijeniti a
u funkciji...
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
a++;
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"

int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

32

Primjer
Mogli smo promijeniti a
u funkciji...
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
a++;
return a*2+1;
}

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"

int main() {
int x, y;
...x bibroj
ostalox:5 ");
printf("Unesite
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

33

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"
a*2+1 = 11
return 11

34

Naredba return

return prekida rad funkcije, izvrenje programa se


nastavlja na mjestu gdje je funkcija pozvana.
Ako je tip funkcije void:

naredba return slui iskljuivo za prekid funkcije,

nije obavezna (ako je nema, funkcija se zavrava kada


doe do kraja posljednje zagrade }),

ako se navede, iza nje se ne smije staviti vrijednost


(mora stajati samo return;).

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

35

Naredba return

Ako tip funkcije nije void:

Naredba return je obavezna! funkcija mora vratiti neku


vrijednost, a kako emo znati koju ako nemamo return?

Iza return se obavezno navodi izraz koji predstavlja


povratna vrijednost.

U trenutku izvrenja return-a, izraunava se vrijednost


izraza i ta vrijednost se ubacuje na mjesto poziva
funkcije.

1.12.2015

npr. y=f(x) y postaje vrijednost vraena iz f(x)

Vedran Ljubovi * OR15 * P12: Funkcije

36

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"
a*2+1 = 11
return 11

37

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"
a*2+1 = 11
return 11
y=11

38

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
int main() {
int x, y;
printf("Unesite broj x: ");
scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

x=?, y=?
x=5
"Sada pozivamo..."
a=5
"Poziv... a je 5"
a*2+1 = 11
return 11
y=11
"Nakon... y je: 11"

39

Primjer
#include <stdio.h>
int f(int a) {
printf("Poziv funkcije f, a je %d\n", a);
return a*2+1;
}
Unesite broj x: 5
Sada pozivamo funkciju...
int main() {
Poziv funkcije f, a je 5
int x, y;
Nakon poziva y je: 11
printf("Unesite broj x: ");

1.12.2015

scanf("%d", &x);
printf("Sada pozivamo funkciju...\n");
y = f(x);
printf("Nakon poziva y je: %d\n", y);
return 0;

Vedran Ljubovi * OR15 * P12: Funkcije

40

Lokalne promjenljive

Kada je promjenljiva deklarisana unutar bloka, ona postoji


samo unutar tog bloka, njen opseg (eng. scope) je taj blok:
#include <stdio.h>
int main() {
{

int a=5;
printf("a je %d\n", a);

}
printf("a sada je %d\n", a);
return 0;

U nekom drugom bloku moe postojati druga promjenljiva


sa istim imenom. Te dvije promjenljive nemaju meusobne
veze.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

41

Lokalne promjenljive

Kada je promjenljiva deklarisana unutar bloka, ona postoji


samo unutar tog bloka, njen opseg (eng. scope) je taj blok:
#include <stdio.h>
int main() {
{

int a=5;
printf("a je %d\n", a);

Greka!
'a' undeclared

}
printf("a sada je %d\n", a);
return 0;

U nekom drugom bloku moe postojati druga promjenljiva


sa istim imenom. Te dvije promjenljive nemaju meusobne
veze.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

42

Lokalne promjenljive

Kada je promjenljiva deklarisana unutar bloka, ona postoji


samo unutar tog bloka:
#include <stdio.h>
int main() {
int a=3;
{
int a=5;
printf("a je %d\n", a);
}
printf("a sada je %d\n", a);
return 0;
}

U nekom drugom bloku moe postojati druga promjenljiva


sa istim imenom. Te dvije promjenljive nemaju meusobne
veze.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

43

Lokalne promjenljive

Kada je promjenljiva deklarisana unutar bloka, ona postoji


samo unutar tog bloka:
#include <stdio.h>
int main() {
int a=3;
{
int a=5;
printf("a je %d\n", a);
}
printf("a sada je %d\n", a);
return 0;
}

a je 5
a sada je 3

U nekom drugom bloku moe postojati druga promjenljiva


sa istim imenom. Te dvije promjenljive nemaju meusobne
veze.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

44

Lokalne promjenljive

Kada je promjenljiva deklarisana unutar bloka, ona postoji


samo unutar tog bloka:
#include <stdio.h> OveGreka!
dvije prom.
int main() {
'a' nisu
undeclared
iste!
int a=3;
{
int a=5;
printf("a je %d\n", a);
}
printf("a sada je %d\n", a);
return 0;
}

a je 5
a sada je 3

U nekom drugom bloku moe postojati druga promjenljiva


sa istim imenom. Te dvije promjenljive nemaju meusobne
veze.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

45

Primjer 2
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

46

Primjer 2
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

47

Primjer 2
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
a=4, b=6
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

48

Primjer 2
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
a=4, b=6
a=5, b=3
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

49

Primjer 2
#include <stdio.h>

Kod pridruivanja vrijednosti


parametrima, nisu bitna
imena, nego redoslijed!

void c(int b, int a) {


a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

50

Primjer 2
#include <stdio.h>

Kod pridruivanja vrijednosti


parametrima, nisu bitna
imena, nego redoslijed!

void c(int b, int a) {


a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

51

Primjer 2
#include <stdio.h>

Ovo su lokalne
promjenljive

void c(int b, int a) {


a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

52

Primjer 2a
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3, z;
printf("Prije poziva a=%d, b=%d\n", a, b);
z=c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

53

Primjer 2a
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
Greka! Funkcija je
int a=5, b=3, z;
tipa void
printf("Prije poziva a=%d, b=%d\n", a, b);
z=c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

54

Primjer 2b
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
return a+b;
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

55

Primjer 2b
#include <stdio.h>
void c(int b, int a) {Greka! Funkcija je
a++; b++;
tipa void
printf("U funkciji a=%d, b=%d\n", a, b);
return a+b;
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

56

Primjer 2c
#include <stdio.h>
void c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
return;
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

57

Primjer 2c
#include <stdio.h>
void c(int b, int a) {
a++; b++;
Ovo je a=%d,
ok (ali nepotrebno)
printf("U funkciji
b=%d\n", a, b);
return;
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

58

Primjer 2d
#include <stdio.h>
void c(int b, int a) {
a++; b++;
return;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

59

Primjer 2d
#include <stdio.h>
void c(int b, int a) {
a++; b++;
return;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
a=5, b=3
}
int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

60

Primjer 2d
#include <stdio.h>

printf se nikada
void c(int b, int a) {nee izvriti

a++; b++;
return;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
a=5, b=3

int main() {
int a=5, b=3;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

61

Vraanje vie vrijednosti

Iz funkcije nije mogue vratiti vie od jedne vrijednosti!

Ovo ogranienje se moe prevladati pomou


pokazivaa ili struktura, to emo raditi kasnije.
int c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
return a,b;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

62

Vraanje vie vrijednosti

Iz funkcije nije mogue vratiti vie od jedne vrijednosti!

Ovo ogranienje se moe prevladati pomou


pokazivaa ili struktura, to emo raditi kasnije.
int c(int b, int a) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
return a,b;
}

ta ova funkcija
ustvari vraa??

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

63

Globalne promjenljive

Globalne promjenljive su promjenljive koje su deklarisane


izvan svih funkcija.
One su zajednike za sve funkcije i zadravaju vrijednost u
svim funkcijama

...osim ako u funkciji postoji lokalna promjenljiva pod istim imenom, a


onda imamo sluaj kao iz primjera sa lokalnim promjenljivim.

Koritenje globalnih promjenljivih nije preporuljivo jer


ponaanje funkcije vie nije predviljivo iz prototipa, funkcija
ima "sporedne efekte".

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

64

Globalne promjenljive - primjer


#include <stdio.h>
int a;
void c(int b) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

65

Globalne promjenljive - primjer


#include <stdio.h>
int a;
void c(int b) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
a=6, b=4
a=6, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

66

Globalne promjenljive - primjer


Globalna
promjenljiva

#include <stdio.h>
int a;
void c(int b) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
a=6, b=4
a=6, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

67

Globalne promjenljive - primjer


Globalna
promjenljiva

#include <stdio.h>
int a;
void c(int b) {
Lokalna
a++; b++;
printf("U funkcijipromjenljiva
a=%d, b=%d\n", a, b); a=5, b=3
}
a=6, b=4
a=6, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

68

Globalne promjenljive - primjer


Globalna
promjenljiva

#include <stdio.h>
int a;
void c(int b) {
Lokalna
a++; b++;
printf("U funkcijipromjenljiva
a=%d, b=%d\n", a, b); a=5, b=3
}
a=6, b=4
a=6, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
Nije jasno (bez itanja koda)
}
da e se u funkciji promijeniti a

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

69

Globalne promjenljive - primjer


#include <stdio.h>
int a;
void c(int a, int b) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b);
}
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

70

Globalne promjenljive - primjer


#include <stdio.h>
int a;
void c(int a, int b) {
a++; b++;
printf("U funkciji a=%d, b=%d\n", a, b); a=5, b=3
}
a=6, b=4
a=5, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

71

Globalne promjenljive - primjer


#include <stdio.h>
int a;
void c(int a, int b) {
Lokalna promjenljiva
a++; b++;
koja sea=%d,
zove isto
kao globalna
printf("U funkciji
b=%d\n",
a, b); a=5, b=3
}
a=6, b=4
a=5, b=3
int main() {
int b=3;
a=5;
printf("Prije poziva a=%d, b=%d\n", a, b);
c(a,b);
printf("Nakon poziva a=%d, b=%d\n", a, b);
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

72

Zadatak: faktorijel

Nigdje u standardnoj biblioteci se ne nalazi funkcija za


raunanje faktorijela cijelog broja n
n! = 1*2*3*...*n
Lijepo bi bilo da u naem programu moemo napisati:
printf("%d na kvadrat je: %d\n", x, pow(x,2));
printf("%d faktorijel je: %d\n", x, faktorijel(x));

C kod za izraunavanje faktorijela:


fakt = 1;
for (i=2; i<=n; i++)
fakt *= i;

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

73

Zadatak: faktorijel

main funkcija glasi:


#include <stdio.h>
#include <math.h>
int main() {
int x, i;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
}

Ostaje da napravimo funkciju "faktorijel".

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

74

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

75

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?
jedan

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

76

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?
jedan
Kojeg su tipa parametri?

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

77

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?
jedan
Kojeg su tipa parametri?
cijeli brojevi (int)

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

78

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?
jedan
Kojeg su tipa parametri?
cijeli brojevi (int)
Da li funkcija vraa vrijednost i kojeg je tipa?

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

79

Zadatak: faktorijel

Da bismo napisali prototip funkcije, trebamo odgovoriti na


pitanja:
Koliko funkcija faktorijel ima parametara?
jedan
Kojeg su tipa parametri?
cijeli brojevi (int)
Da li funkcija vraa vrijednost i kojeg je tipa?
cijeli broj (int mada bolje long long)

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

80

Zadatak: faktorijel

Dakle, prototip funkcije glasi:


long long faktorijel(int x)

Implementacija funkcije:
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}

U funkciji nema unosa ni ispisa jer se to nalazi u mainu.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

81

Zadatak: faktorijel

Dakle, prototip funkcije glasi:


long long faktorijel(int x)

Implementacija funkcije:
long long faktorijel (int x) {
long long fakt=1;
Moramo deklarisati promjenljivu
int i;
u kojoj emo drati rezultat
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}

U funkciji nema unosa ni ispisa jer se to nalazi u mainu.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

82

Zadatak: faktorijel

Dakle, prototip funkcije glasi:


long long faktorijel(int x)

Implementacija funkcije:
long long faktorijel (int x) {
long long fakt=1;
Moramo deklarisati promjenljivu
int i;
u kojoj emo drati rezultat
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}

Vrijednost koja se vraa...

U funkciji nema unosa ni ispisa jer se to nalazi u mainu.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

83

Zadatak: faktorijel

Dakle, prototip funkcije glasi:

...mora biti istog tipa kao


sama
longfunkcija
long faktorijel(int

x)

Implementacija funkcije:
long long faktorijel (int x) {
long long fakt=1;
Moramo deklarisati promjenljivu
int i;
u kojoj emo drati rezultat
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}

Vrijednost koja se vraa...

U funkciji nema unosa ni ispisa jer se to nalazi u mainu.

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

84

Zadatak: faktorijel

Dakle, prototip funkcije glasi:

...mora biti istog tipa kao


sama
longfunkcija
long faktorijel(int

x)

Implementacija funkcije:
long long faktorijel (int x) {
long long fakt=1;
Moramo deklarisati promjenljivu
int i;
u kojoj emo drati rezultat
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}

Vrijednost koja se vraa...


Iako promjenljiva i postoji u
mainu, ona je lokalna za main.
Moramo
ponovo deklarisati
iu
U funkciji
nema
unosa
ni ispisa jer se to nalazi
funkciji

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

u mainu.

85

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}
int main() {
int x, i;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

86

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}
int main() {
int x, i;
printf("Unesite broj x: ");
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

87

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;
}
int main() {
int x, i;
printf("Unesite broj x: ");
Ovo i...
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

88

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
...nije isto to i
return fakt;
ovo i !
}
int main() {
int x, i;
printf("Unesite broj x: ");
Ovo i...
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

89

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>
long long faktorijel (int x) {
long long fakt=1;
int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
...nije isto to i
return fakt;
ovo i !
}
int main() {
Ovo x...
int x, i;
printf("Unesite broj x: ");
Ovo i...
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

90

Zadatak: faktorijel

itav program glasi:


#include <stdio.h>
#include <math.h>

...nije isto to i
long long faktorijel ovo
(int
x !x) {

long long fakt=1;


int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;

...nije isto to i
ovo i !

int main() {
Ovo x...
int x, i;
printf("Unesite broj x: ");
Ovo i...
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

91

Zadatak: faktorijel

itav program glasi:

Sve su to
promjenljive koje su
lokalne za svoje
funkcije

#include <stdio.h>
#include <math.h>

...nije isto to i
long long faktorijel ovo
(int
x !x) {

long long fakt=1;


int i;
for (i=2; i<=x; i++)
fakt = fakt*i;
return fakt;

...nije isto to i
ovo i !

int main() {
Ovo x...
int x, i;
printf("Unesite broj x: ");
Ovo i...
scanf("%d", &x);
for (i=1; i<=x; i++)
printf("%d!=%d\n", i, faktorijel(i));
return 0;
Rezultat funkcije je direktno
}

uvrten u poziv printf

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

92

Savjeti

Najbolje je svaku funkciju posmatrati kao crnu kutiju


zaseban program koji obavlja neki zadatak.
este greke:
1) Ako u zadatku ne pie "funkcija na ekran ispisuje..."
onda funkcija ne smije ispisivati nita! Ne smije se u
funkciji nalaziti printf!
2) Ako u zadatku ne pie "u funkciji se sa tastature unosi..."
onda se u funkciji ne smije nalaziti scanf, getchar i sl.

1.12.2015

Zadaci esto postaju trivijalni ako moete sve bitno (ulaze i izlaze) prebaciti
u funkciju... dok poenta zadatka je da nauite lokalne vs. globalne
promjenljive i poziv po vrijednosti.

Vedran Ljubovi * OR15 * P12: Funkcije

93

ivotni vijek promjenljivih

Ako u istom programu vie puta pozovemo funkciju,


lokalne promjenljive e se svaki put resetovati na njihovu
polaznu vrijednost.
#include <stdio.h>
int f(int x) {
int a=1;
a++;
printf("a=%d\n", a);
}
int main() {
int n, i;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++)
f();
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

a=2
a=2
a=2
...

94

Statike promjenljive

Ako elimo da promjenljiva zadri vrijednost, koristimo


statike promjenljive.
#include <stdio.h>
int f(int x) {
static int a=1;
a++;
printf("a=%d\n", a);
}
int main() {
int n, i;
printf("Unesite broj n: ");
scanf("%d", &n);
for (i=0; i<n; i++)
f();
return 0;
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

a=2
a=3
a=4
...

95

Rekurzija

Rekurzivna funkcija je funkcija koja poziva samu sebe.


esto se odreeni zadaci mogu elegantno rijeiti na
rekurzivni nain, ili je rjeenje blie matematskom
tumaenju.
Primjer: funkcija faktorijel n! = n*(n-1)!
long long faktorijel(int x) {
return x * faktorijel(x-1);
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

96

Rekurzija

Rekurzivna funkcija je funkcija koja poziva samu sebe.


esto se odreeni zadaci mogu elegantno rijeiti na
rekurzivni nain, ili je rjeenje blie matematskom
tumaenju.
Primjer: funkcija faktorijel n! = n*(n-1)!
Rauna se (x-1)!
Zatim se rezultat mnoi sa x i vraa
long long faktorijel(int x) {
return x * faktorijel(x-1);
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

97

Rekurzija

Rekurzivna funkcija je funkcija koja poziva samu sebe.


esto se odreeni zadaci mogu elegantno rijeiti na
rekurzivni nain, ili je rjeenje blie matematskom
tumaenju.
Primjer:
funkcija
faktorijel n! = n*(n-1)!
Greka!
Beskonana
Rauna se (x-1)!
rekurzija

Zatim se rezultat mnoi sa x i vraa

long long faktorijel(int x) {


return x * faktorijel(x-1);
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

98

Rekurzija

Beskonana rekurzija nastupa kada funkcija samu sebe


poziva do u beskonanost.
Efekat u pravilu je da se program krahira.
Rjeava se tako to se u funkciju dodaje uslov terminiranja
(prekida) rekurzije.
long long faktorijel(int x) {
if (x==1) return 1;
return x * faktorijel(x-1);
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

99

Rekurzija

Beskonana rekurzija nastupa kada funkcija samu sebe


poziva do u beskonanost.
Efekat u pravilu je da se program krahira.
Rjeava se tako to se u funkciju dodaje uslov terminiranja
(prekida) rekurzije.
ta ako je x<1 ?
long long faktorijel(int x) {
if (x==1) return 1;
return x * faktorijel(x-1);
}

1.12.2015

Vedran Ljubovi * OR15 * P12: Funkcije

100

Zato koristimo funkcije?


1) Funkcije olakavaju rjeavanje zadataka podjelom na
podzadatke (procedure).
2) Funkcije poboljavaju itljivost koda:

kod je krai (manje ponavljanja koda to je i inae loa praksa


zbog raznih razloga), imena funkcija opisuju ta funkcija radi, jasno
su definisani ulazi i izlazi.

3) Olakana je podjela posla u timu


4) Funkcije olakavaju ponovnu upotrebu koda

1.12.2015

jednom napisanu funkciju faktorijel moemo koristiti u svim


programima gdje se rauna n!
moemo praviti vlastite biblioteke funkcija.

Vedran Ljubovi * OR15 * P12: Funkcije

101

You might also like