29
Programiranje 2 (550) Funkcije 1 Programiranje 2 Doseg varijabli, funkcije Programiranje 2 2 Sadržaj: Doseg i tipovi varijabli: lokalne i globalne varijable automatske i statičke varijable konstante i eksterne varijable Funkcije: deklaracija, definicija i poziv funkcije Niz kao argument funkcije Rekurzivne funkcije

Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

  • Upload
    others

  • View
    59

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 1

Programiranje 2

Doseg varijabli, funkcije

Programiranje 2 2

Sadržaj:� Doseg i tipovi varijabli:

� lokalne i globalne varijable� automatske i statičke varijable� konstante i eksterne varijable

� Funkcije:� deklaracija, definicija i poziv funkcije

� Niz kao argument funkcije

� Rekurzivne funkcije

Page 2: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 2

Programiranje 2 3

Što radi program?main() {

int i;for(i=0;i<5;i++) {

int n;n=i;

}printf("i=%d, n=%d", i, n);

} “Undeclared indentifier”

� Lokalne varijable – “vidljive” su samo unutar programskog bloka ({}) u kojem su deklarirane.� lokalne varijable funkcije main

Programiranje 2 4

Što radi program?main(){

int i, n=0;printf("For petlja:");for(i=0;i<5;i++){

int n = i;printf("\n\ti=%d n=%d", i, n);

}printf("\nVan for:\n\ti=%d n=%d\n\n", i, n);

}

� Unutar istog programa može biti više varijabli istog imena pod uvjetom da su one deklarirane u različitim programskim blokovima i pri tome prioritet ima lokalna varijabla.

Page 3: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 3

Programiranje 2 5

Funkcija� Imenovani, nezavisni dio koda koji obavlja određeni zadatak

� Ime f-je se koristi kod poziva te funkcije bilo iz maina ili neke druge f-je. � F-ja po potrebi može ili ne mora vratiti vrijednost programu iz kojeg

je pozvana.� Procedura - u većini programskih jezika f-ja koja ne vrača vrijednost.

� Sastoji se od tri dijela:� DEKLARACIJA ili PROTOTIP funkcije – opisuje funkciju, tj

definira:� ime f-je;� tip podataka kojim rezultira izvršenje f-je;� broj i tip argumenata koji se prenose u f-ju;

� POZIV funkcije – određuje mjesto u kodu gdje se poziva f-ja;� DEFINICIJA (zaglavlje i tijelo) funkcije – uz ime, argumente i

povratnu vrijednost sadržava i blok naredbi.

Programiranje 2 6

Funkcija// Sintaksa 1:#include < >

DEKLARACIJA_FUNKCIJE;

main(){

…POZIV_FUNKCIJE;…

}

DEFINICIJA_FUNKCIJE

//Sintaksa 2:#include < >

DEFINICIJA_FUNKCIJE

main(){

…POZIV_FUNKCIJE;…

}

� Zašto koristiti sintaksu 1, a ne 2?Odgovor je na slide-u 18.

Page 4: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 4

Programiranje 2 7

Deklaracija f-je� Samo služi kompajleru kao pokazatelj koliko argumenata ima funkcija i

kojeg su tipa, te koji tip podatka f-ja vrača, pa nazivi varijabli nisu bitni.

tip_rezultata ime_f ([tip_arg1 [arg1]], [tip_arg2 [arg2]], … );

� ime_f – ime funkcije i za njegovo formiranje vrijede ista pravila kao i za imena varijabli.

� tip_arg1, … - tipovi varijabli koje se prenose u f-ju.� arg1 – nazivi varijabli i oni se ne moraju napisati.

� tip_rezultata – oznaka tipa podataka kojim rezultira izvršenje f-je� void� int� char� …

Programiranje 2 8

Definicija funkcije� Sastoji se od dva dijela:

� zaglavlja ili glave funkcije – identična je deklaraciji f-je i sadrži ime f-je, tip i nazive argumenata i tip podataka kojim rezultira izvršenje f-je (ne završava sa “;”)

� tijela funkcije – deklaracija varijabli i skup naredbi.

tip_rezultata ime_f ( [tip_arg1 arg1], [tip_arg2 arg2], … ){

definicija_varijabli;

kod_funkcije;

return vrijednost;}

� return - označava mjesto na kojem se prekida izvršenje f-je i pri tome se “vrijednost” iz f-je šalje u glavni program.� Koristi se kad f-ja nije void tipa.� Višestruko korištenje return-a u f-ji je

dozvoljeno ali treba biti oprezan.

Page 5: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 5

Programiranje 2 9

Poziv funkcije

ime_f(var1, var2, …) //ukoliko je funkcija tipa void

ili

varX = ime_f(var1, var2, …) //ukoliko f-ja vrača rezultat

Programiranje 2 10

Primjer 1:� Funkcija koja ispisuje “Dobar dan” na ekran:

#include<stdio.h>

void pozdrav();

main(){

pozdrav(); }

void pozdrav() {

printf("Dobar dan");}

Deklaracija f-je

Poziv f-je

Glava f-je

Tijelo f-je

Definicija f-je

Page 6: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 6

Programiranje 2 11

Primjer 1:� Tok izvršavanja naredbi:

main(){

pozdrav() ; }

void pozdrav() {

printf(“Dobar dan”);

}

1.

2.3.

Programiranje 2 12

Primjer 2:� Funkcija koja računa kvadrat broja:

#include<stdio.h>

int kvadrat(int);

main(){

int x = 5;printf(“ x * x = %d ”, kvadrat(x));

}

int kvadrat(int a) {

int rez;rez = a*a;return rez;

}

� Što se dogaña s varijablama u memoriji kod poziva f-je?

int kvadrat(int a) {

ili return a*a;}

Page 7: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 7

Programiranje 2 13

Primjer 3:� Napisati program s dvije f-je suma i ispis. F-ja suma uzima 2

cjelobrojna argumenta i računa njihovu sumu, dok f-ja ispis ispisuje rezultat na ekran.

Programiranje 2 14

Što radi program?int f(int x, int y) {

int suma, produkt;suma = x +y;return suma;

produkt = x*y;return produkt ;

}

main(){

int a, b, c, d;scanf(“ %d %d”, &a, &b);

c = f(a, b);d = f(a, b);printf(“c = %d\td = %d”, c, d);

}

� Unosi se 3 i 4

Page 8: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 8

Programiranje 2 15

Što radi program?main() {

int x, y;scanf(“ %d”, &x);y = parni_neparni(x);printf(“ y = %d\n\n”, y);

}

int parni_neparni(int x) {if (x%2 == 0)

return 0;else

return -1;}� Najprije se unosi 3, pa drugi put 6

Programiranje 2 16

Razdvajanje programa na module

� Prednost korištenja modula:� Mogu se pisati, testirati i ispravljati neovisno

od ostatka programa;� Omogućavaju veću preglednost i logičku

smislenost programskog koda;� Moguće je napraviti module neovisne od

programa u kojem se koriste, pa se isti modul može koristiti u više programa;

� Omogućavaju timski rad na razvoju programa.

Page 9: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 9

Programiranje 2 17

Rješavanje vježbi

Programiranje 2 18

Zašto koristiti deklaraciju f-je?

Page 10: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 10

Programiranje 2 19

Što radi program?void f(int);

void main(){

int x = 0;f(x);printf(“ x = %d\n\n”, x);

}

void f(int x){

x = 10;}

Programiranje 2 20

Što radi program

void ispis();main(){

int a = 3, b=7;ispis();

}void ispis(){

printf ("a=%d, b=%d", a, b);}

“Undeclared indentifier”

Page 11: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 11

Programiranje 2 21

Globalne varijable� Globalne varijable – varijable deklarirane ispred main() i “vidljive” su u

cijelom programu.

#include<stdio.h>

void ispis();

int a = 3, b=7;

main(){

ispis();}

void ispis(){

printf ("a=%d, b=%d\n\n", a, b);}

Programiranje 2 22

Doseg i tipovi varijabli� Automatske varijable – obične lokalne varijable koje prestaju

postojati (brišu se iz memorije) kad se izvrši programski blok ili f-ja u kojoj su deklarirane.

� Statičke varijable – varijable koje zadržavaju svoju vrijednost i kada se izvrši programski blok ili f-ja u kojoj su deklarirane, ali im se može pristupiti samo u tom bloku ili f-ji.� Inicijaliziraju se samo jednom kad se f-ja pozove prvi put.

� Sintaksa:[auto] tip ime_varijable;static tip ime_varijable;

Page 12: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 12

Programiranje 2 23

Primjer:� Što radi program?

void ispis(){

int x=0;printf(“\n x = %d”, x);x++;

}main (){

int i;for(i=0;i<5;i++)

ispis();}

� A sada?

void ispis(){

static int x=0;printf(“\n x = %d”, x);x++;

}

Programiranje 2 24

Doseg i tipovi varijabli� Konstante – ukoliko se varijabla definira s prefiksom const tada je ona

konstanta i ne može se mijenjati. � Vrijednost joj je potrebno dodijeliti pri deklaraciji.

const int n=10; // definira cjelobrojnu konstantu n = 10const float pi = 3.14; // definira realnu konstantu pi=3.14

Page 13: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 13

Programiranje 2 25

Što koristiti #define ili const?� #define:

� neposredna vrijednost ili makro - pretprocesorska direktiva i prije prevoñenja programa se vrši zamjena imena i vrijednosti.

� doseg – vidljiva je cijelom programu (funkcijama na čijem je vrhu deklariran)

� const - stvarna varijabla kojoj se ne može promijeniti vrijednost:� za nju je alociran prostor u memoriji � može joj se pristupit na indirektan način preko pokazivača� može se pratiti u "debuggeru"� dostupna je samo u onim modulima u kojima je deklarirana� može se eksportirati u druge module pograma

Programiranje 2 26

Doseg i tipovi varijabli i funkcija� EXTERN – s ovim prikazom definirano da se varijabli ili f-ja

deklarirane u nekoj drugoj datoteci.

pr1.c pr2.c

main() { int i=40;extern int i;printf(“i = %d”, i);

}

Page 14: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 14

"Inline" funkcije� Posebna vrsta funkcija (neke od starijih verzija C ih ne podržavaju).� Najčešće su to jako kratke funkcije za koje prevodilac nastoji

osigurati najbrže moguće izvršavanje.� Često na način da kopira kod funkcije u dio koji ga poziva.� S obzirom da se izvršavanje funkcije smješta u dio koji ga poziva

nazivaju se takve funkcije "inline".

� Funkcija postaje "inline" korištenjem ključne riječi "inline".inline int uCM( int Inch ) {

return (Inch*2.54);}

� "Inline" funkcije se koriste na isti način kao i sve ostale funkcije.

Programiranje 2 27

Programiranje 2 28

Zadaci za vježbe:26. Napisati program koji unese 3 broja i zatim po želji korisnika (ovisno o tome

koje se slovo unese) računa:

Svi rezultati se računaju preko f-ija (jedna za svaki primjer), s tim da je za primjer pod “d” potrebno provjeriti je li izraz ispod korijena > o, ako nije treba javiti grešku.

27. Napisati program koji sadrži dvije varijable: globalnu varijablu X i lokalnu varijablu Y (lokalna za f-ju main) i dodijeliti im neke vrijednosti. Iz glavnog programa treba pozvati f-ju koja ispisuje vrijednosti obije varijable.

28. Napraviti program koji u “običnoj” f-ji računa faktorijele. Rezultat je potrebno ispisati u glavnom programu i nije dozvoljeno korištenje globalnih varijabli.

zyxrez

zyxrez

zyxrez

zyxrez

d

c

b

a

−=

+=

=

++=

/

/

**

)

)

)

)

Page 15: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 15

Programiranje 2 29

Zadaci za vježbe:29. Napisati f-ju kojom se približno određuje vrijednost ex (e = 2.718282), i

rezultat usporediti s vrijednošću koja se dobije pomoću standardne funkcije exp() deklarirane u math.h.U rješavanju problema koristiti razvoj u red:

Npr. za x = 5, ispisati izračunate vrijednosti za 5, 10 i 50 elemenata reda.

...!6!5!4!3!2!1

165432

+++++++=xxxxxx

ex

double sqrt (double x)

Programiranje 2 30

Page 16: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 16

Programiranje 2 31

double pow(double x, double y)

Programiranje 2 32

Niz kao argument f-je� Sintaksa definicije f-je:

tip_rezultata ime_f ([…], tip ime_niza[], […]); // jednodim. niza// nije bitna dimenzija niza

tip_rezultata ime_f ([…], tip ime_niza[][br_el], […]);// dvodim. niz// bitan je broj stupaca

� Sintaksa poziva f-je:ime_f (ime_niza); // jednodim. i dvodim. nizovi

Page 17: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 17

Programiranje 2 33

Što radi program?

Programiranje 2 34

Primjer:� Napisati program koji za niz od n brojeva sve elemente niza unosi s

tastature.Unos je potrebno napraviti u f-ji.

Page 18: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 18

Programiranje 2 35

Niz kao argument f-je� U C-u se nizovi u f-ju prenose kao memorijske reference (by

reference), odnosno prenosi se adresa početnog elementa niza.� “Obične” varijable se prenose kao vrijednosti (by value).

� Nizovi koji su argumenti f-je, ne smiju se unutar f-je tretirati kao lokalne varijable jer se promjenom vrijednosti elemenata niza unutar f-je mijenjaju i vrijednosti elemenata niza u glavnom programu.

Programiranje 2 36

Zadaci za vježbe:30. Napisati program koji traži je li neki broj element niza. U programu treba

napraviti f-ju trazi koja uzima tri argumenta (niz, broj elemenata niza i vrijednost koja se traži), a treba vratiti 1 ako broj postoji ili 0 ako broj ne postoji.

31. Napisati program koji računa produkt svih elemenata matrice dimenzija 3x3. Program ne smije sadržavati ni jednu globalnu varijablu, unos i proračun napraviti u odvojenim funkcijama.

32. Napisati program koji sadrži f-je my_strlen i my_strcpy, koje rade isto što i f-je strlen i strcpy. Ispravnost funkcija provjeriti usporedbom sa stvarnim f-jama strlen i strcpy.

Page 19: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 19

Programiranje 2 37

Rekurzivne f-je� Rekurzivna funkcija je f-ja koja poziva samu sebe.

� Unutar f-je se obavezno mora nalaziti provjera rekurzije i promjena varijable po kojoj se radi rekurzija da ne bi nastala beskonačna petlja.

� Primjeri rekurzivne f-je:

Rekurzivne f-je� Napisati rekurzivnu funkciju koja računa faktorijele.

� 5! = 5 * 4 * 3 * 2 * 1

= 5 * 4! → 4! = 4 * 3! → 3! = 3 * 2! → 2! = 2 * 1! → 1! = 1

Programiranje 2 38

Page 20: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 20

Programiranje 2 39

Što radi program?int f(int i){

int b = i;

if(i != 0)b += f(i-1);

return b;}main (){

printf("x = %d \n\n", f(5));}

Kada koristiti rekurzivne f-je?� Iteracijske petlje (for, while) su brži način rješavanja problema i

bolje ih je koristiti nego rekurzivne f-je kada je to god moguće.

� Rekurzivne funkcije:� Koriste dodatnu memoriju svaki put kada se pozovu (u nekim

slučajevima je to moguće izbjeći);� Nekada nude jednostavnije i razumljivije ("čitljivije") rješenje od

iteracije (operacije s binarnim stablima, složeni algoritmi za sortiranje i pretraživanje).

Programiranje 2 40

Page 21: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 21

Programiranje 2 41

Zadaci za vježbe:33. Napisati program koji pomoću rekurzivne f-je računa faktorijele.

34. Napisati program koji korištenjem rekurzivnih funkcija traži minimalni, odnosno maksimalni element niza brojeva.

35. Napraviti program koji uneseni dekadski broj pretvara u binarni, oktalni ili heksadecinalni. Dekadski broj, kao i brojevna baza (2, 8, 16) u koju se radi pretvorba se unose u programu, a pretvorbu je potrebno realizirati pomoću rekurzivne f-je.

Zadatak 35.

Programiranje 2 42

Page 22: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 22

Zadatak 35.

Programiranje 2 43

Dodatni zadaci s rekurzivnim f-jama� Napisati rekurzivnu f-ju koja računa xy. Pri tome se funkcija pow može

koristiti samo za kontrolu rezultata.

� Napisati rekurzivnu f-ju koja omogućava pogađanje slučajnog broja (generira se u glavnom programu i prenosi u f-ju). Funkcija treba vratiti podatak iz kojeg je puta broj pogođen.

� Napisati rekurzivnu funkciju koja provjerava je li neki broj primitivan (vrača 1 ako je, 0 ako nije).

� Napisati rekurzivnu f-ju koja broji koliko ima znakova u nekom stringu.

Programiranje 2 44

Page 23: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 23

Hanojski tornjevi� Problem: potrebno je N prstenova s tornja A prebaciti na toranj C uz

pomoć tornja B i slijedeće uvjete: � uvijek se prebacuje samo jedan prsten,� samo manji prsten može na veći.

Programiranje 2 45

Hanojski tornjevi -postupak

Programiranje 2 46

Page 24: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 24

Hanojski tornjevi -postupak

Programiranje 2 47

Hanojski tornjevi – ideja za kodiranje

Programiranje 2 48

� Jedan od načina rješavanja ovog problema je tzv. "smanjivanje problema".

� Opis:

� Kako bi se N diskova prebacilo s tornja A na toranj C, sigurno treba najveći disk prebaciti s A na C, što znači da C u tom trenutku treba biti prazan.

� Ako se pogleda početni raspored najveći disk se ne može prebaciti sve dok se ne dignu svi manji diskovi s njega i pri tome se oni prebacuju na toranj B (kako bi C ostao slobodan).

� Kada je na tornju A ostao najveći disk i C je prazan, disk se prebacuje na C i kreće se u rješavanje problema.

� Na ovaj način se problem prebacivanja tornja od N diskova umanjuje na problem prebacivanja tornja od N-1 diska + prebacivanje najvećeg.

� Programski se problem najlakše rješava korištenjem rekurzije.

Page 25: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 25

Hanojski tornjevi - kod

Programiranje 2 49

Hanojski tornjevi - kod

Programiranje 2 50

Page 26: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 26

Fibonaccijev niz� Fibonnacijev niz prikazuje određeni numerički uzorak koji se može

koristiti za opis velikog niza prirodnih fenomena u matematici, znanosti, prirodi i umjetnosti.

� 1202 Jedan od najcijenjenih matematičara srednjeg vijeka Leonardo Pisano Bigollo (zvan Fibonacci) je objavio matematičku knjigu "LiberAbaci".

� Jedan od pitanja u knjizi je bilo: "Ako se par zečeva stavi u zatvoreni prostor, koliko će zečeva biti rođeno u 1 godini ako se pretpostavi d a svaki mjesec 1 par zečeva stvara drugi, a zečevi mogu imati mlade 2 mjeseca od rođenja?

Programiranje 2 51

Fibonaccijev niz

Programiranje 2 52

Broj parova u generaciji: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ….

Page 27: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 27

Fibonaccijev niz� Fibonaccijev niz čine sljedeći brojevi : 0 1 1 2 3 5 8 13 21 ...� Svaki sljedeći broj računa se kao zbroj prethodna dva broja u nizu:

� prva dva broja su 0 i 1� 0 + 1 = 1� 1 + 1 = 2� 1 + 2 = 3� 2 + 3 = 5� 3 + 5 = 8� …

� ϕ - "Golden ratio" – zlatni rez = 1.618034

Programiranje 2 53

A B B/A

2 3 1.5

3 5 1.666666666

5 8 1.6

8 13 1.625

… … …

144 233 1.618055556

� Što su veći elementi Fibonaccijevogniza to je rezultat bliži ϕ.

Fibonaccijev niz i zlatni rez u prirodi� Primjeri kod životinja:

� U pčelinjoj zajednici, košnici, uvijek je manji broj mužjaka pčela nego ženki pčela. Kada bi podijelili broj ženki sa brojem mužjaka pčela, uvijek bi dobili broj ϕ.

� Oznake koje podjsećaju na oči, kod leptira, raspoređene su po krilima poštujući omjer zlatnog reza.

� Primjeri kod biljaka:� Biljke čiji plodovi rastu u spiralama npr. češeri, ananas, ili suncokret,

koriste broj Fibonaccijev niz za postizanje optimalnog rasporeda sjemenki. Pri rastu sjemenke izgledaju kao da oblikuju spirale zbog toga jer raspored po Fibonaccijevom nizu ljudsko oko vidi kao spirale.

� Također razvoj novih grana kod biljke, sljedi Fibonaccijev niz, koi je izravno opet vezan sa brojem ϕ.

� Brokula, salata, karfiol npr. razvija svoje plodove sljedeći Fibonaccijev niz.� Ruže, kao i čitav niz cvijeća sljedi Fibonaccijev niz kod rasporeda latica.

Programiranje 2 54

Page 28: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 28

Fibonaccijev niz i zlatni rez u prirodi� Primjeri kod ljudi:

� Izmjerimo li čovječju dužinu od vrha glave do poda, zatim to podijelimo s dužinom od pupka do poda, dobijemo broj ϕ.

� Dužina članaka prstiju ljudske ruke odgovara omjeru zlatnog reza. Također i omjer dužine dlana i podlaktice, odgovara tom omjeru.

� Ljusko lice jedan je od najboljih primjena korištenja omjera zlatnog reza kod ljudi. Zjenice i rubovi usta čine savršeni kvadrat . Zlatnim rezom prema tom kvadratu definiran je nos, …

� Širina i dužina molekule DNA također čini omjer zlatnog reza. Također DNA koja čini dvostruku alfa helix uzvojnicu čini zlatni rez omjerom dužina većeg i manjeg zavoja.

Programiranje 2 55

Fibonaccijev niz i rekurzivna funkcija

Programiranje 2 56

Page 29: Programiranje 2 - Računarstvo 550. semestar/Programiranje 2... · Programiranje 2 (550) Funkcije 3 Programiranje 2 5 Funkcija Imenovani, nezavisni dio koda koji obavlja određeni

Programiranje 2 (550)

Funkcije 29

Funkcije

KRAJ!!!