Upload
others
View
59
Download
0
Embed Size (px)
Citation preview
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 (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.
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.
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.
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
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;}
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
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.
Programiranje 2 (550)
Funkcije 9
Programiranje 2 17
Rješavanje vježbi
Programiranje 2 18
Zašto koristiti deklaraciju f-je?
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”
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;
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
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);
}
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
−=
+=
=
++=
/
/
**
)
)
)
)
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
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
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.
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.
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
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
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
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
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
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.
Programiranje 2 (550)
Funkcije 25
Hanojski tornjevi - kod
Programiranje 2 49
Hanojski tornjevi - kod
Programiranje 2 50
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, ….
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
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
Programiranje 2 (550)
Funkcije 29
Funkcije
KRAJ!!!