lekcija 4 funkcije

46
Funkcije Pojamfunkcije Deklaracija(prototipfunkcije) Definicijafunkcije Pozivfunkcije Glavnai nekespecifične funkcije DomeniI memorijskeklase LEKCIJA IV

Upload: dejan-pejovic

Post on 21-Oct-2015

27 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Lekcija 4 funkcije

Funkcije

• Pojam funkcije

• Deklaracija (prototip funkcije)

• Definicija funkcije

• Poziv funkcije

• Glavna i neke specifične funkcije

• Domeni I memorijske klase

LEKCIJA IV

Page 2: Lekcija 4 funkcije

Funkcije..

• Segment programa koji ima tačno

definisan zadatak.

• Funkcija ima jedinstveno ime.

• Opciono koristi argumente.

• Vraća rezultat.

Page 3: Lekcija 4 funkcije

Funkcije...

• Jedan način razmjene podataka izmedju

funkcija

–Argumenti funkcije i povratna vrijednost

od funkcije.

–Argumenata može biti više (0, 1, 2, 3....)

–Povratnih vrijednosti može biti samo

dvije (0 ili 1)

Page 4: Lekcija 4 funkcije

Funkcije…

• Prednosti programa sa funkcijama

– Jednostavnije rešavanje programskog zadatka.

– Jednostavnije pisanje i održavanje programa.

– Piše se jednom, a poziva potreban broj puta.

– Moguće je kreirati biblioteke funkcija.

– Veći nivo abstrakcije i razumijevanja samog

programa.

– Mogućnost jednostavnijeg ispravljanja, dopuna i

izmjena.

Page 5: Lekcija 4 funkcije

Funkcije...

• Deklaracija (prototip) funkcije– tip ime( lista_argumenata) ;

– tip ime( tip1, tip2,…) ;

– tip ime( tip1 ime1, tip2 ime2,…) ;

tip – tip povratne vrijednosti od funkcije, bilo koji tip.

ime – bilo koji C identifikator.

lista_argumenata –lista tipova (eventualno i formalnih imena podataka koje koristi funkcija)

Page 6: Lekcija 4 funkcije

Funkcije...

• Tip povratne vrijednosti

–Može biti osnovni ili izvedeni C tip.

–Funkcija može vratiti na mjesto poziva

najviše jednu povratnu vrijednost

(može biti i adresa na početak niza).

–Ako nema povratne vrijednosti

umjesto tipa se piše void.

Page 7: Lekcija 4 funkcije

Funkcije...

• Tipovi povratnih vrijednosti

char f1(…);f1 vraća vrijednost tipa charint f2(…);f2 vraća vrijednost tipa intfloat f3(…);f3 vraća vrijednost tipa floatdouble f4(…);f4 vraća vrijednost tipa doublevoid f5(…);f5 ne vraća vrijednost na mjesto svog poziva, već rezultate šalje samo izlaznim uredjajima (funkcija sa “bočnim efektima”).

Page 8: Lekcija 4 funkcije

Funkcije...

• Definicija funkcije

tip ime( lista_argumenata) // Deklaracija bez znaka ; na kraju

{;

// Tijelo funkcije, samo naredbe;

}

U tijelu funkcije mogu biti različite naredbe

Page 9: Lekcija 4 funkcije

Funkcije…

• Lista formalnih argumenata u definiciji

funkcije

– Odgovara listi argumenata u deklaraciji funkcije.

– Pojedini argumenti u listi odvajaju se “,”

– Imena formalnih argumenata u ovoj listi-obavezna.

– Ako funkcija nema argumenata, umjesto njihoveliste se piše void.

Page 10: Lekcija 4 funkcije

Funkcije...

• Naredbe funkcija

– Naredbe deklaracije – na početku funkcije.

– Izvršne naredbe – poslije naredbi

deklaracije.

– Naredbe povratka – obavezno bar jedna

ako funkcija vraća vrijednost.

Page 11: Lekcija 4 funkcije

Funkcije...

• Naredba povratka return

return ( vrednost ); <-> return vrednost ;return x;

return ( (x>=y)? x : y );

if(x>=y)return x;

elsereturn y;

Može biti više naredbi return ali moguće je izvršenje samo jedne od njih (za jednu povratnu vrijednost).

Page 12: Lekcija 4 funkcije

Funkcije...

• Poziv funkcije

ime( lista stvarnih argumenata);

• Poziv funkcije je operator u C jeziku.

• Pojedini argumenti odvajaju se zarezom “,”.

• Ako funkcija nema argumenata, piše se samo par zagrada ( ).

Page 13: Lekcija 4 funkcije

Funkcije…

int proizvod(int x, int y); // Deklaracija funkcijemain(){ int a=10, b=5;

printf( “%d”, proizvod(a,b) ); // Poziv funkcije}

int proizvod(int x, int y) // Pocetak definicije funkcije{

int z; // Naredba funkcijez=x*y; // Izvrsna naredbareturn z; // Naredba povratka

}

• Primjer funkcije za množenje dva cijela broja

Page 14: Lekcija 4 funkcije

Funkcije…

• Može i jednostavnije

int proizvod(int x, int y);main(){ int a=10, b=5;

printf( “%d”, proizvod(a,b) );}int proizvod(int x, int y){

return (x*y);}

Page 15: Lekcija 4 funkcije

Funkcije…

• Kompajler će da prihvati i sledeću situaciju,

bez deklaracije funkcije, ali definicija mora

doći ispred funkcije u kojoj se poziva.

# include <stdio.h>// izostavljena deklaracijaint proizvod(int x, int y){

return (x*y);}main(){ int a=10, b=5;

printf("%d", proizvod(a,b) );getchar();

}

Page 16: Lekcija 4 funkcije

Funkcije...

• Opciono izvršavanje jedne od predvidjenih

naredbi return

float kolicnik(int x, int y);main(){ int a=10, b=3;

printf( “%f”, kolicnik(a,b) );}float kolicnik(int x, int y){ if (y==0)

return 0;else

return ( (float)x / y );}

Page 17: Lekcija 4 funkcije

Funkcije...

• Mehanizam poziva

– Pamćenje na steku svih potrebnih informacija (na prvom mjestu adrese naredbe sa pozivom) za povratak iz funkcije.

– Ako je predvidjeno da se funkciji predaju argumenti onda se moraju inicijalizovati njeni formalni argumenti sa stvarnim vrijednostima.

– Skok na početak pozvane funkcije (na početak njene 1. naredbe).

– Izvršavaju se naredbe pozvane funkcije.

Page 18: Lekcija 4 funkcije

Funkcije...

• Mehanizam povratka iz funkcije

– Čitanje na steku svih upamćenih informacija (na prvom mjestu adrese) i nastavak izvršavanja naredbe u kojoj je bio poziv.

– Ako je predvidjeno da prethodno pozvana funkcija vraća vrijednost, prihvatanje ove vrijednosti na mjestu poziva.

– Izvršavanje prve naredbe poslije poziva funkcije.

Page 19: Lekcija 4 funkcije

Funkcije...

• Poziv funkcije po vrijednosti

– Funkcija se poziva po vrijednosti ako joj se predaju argumenti osnovnog tipa (a ne adrese).

– U tom slučaju, funkcija može koristiti vrijednosti stvarnih argumenata (kopije sadržaja lokacija u memoriji) ali nema mogućnost njihove izmjene (jer su joj nepoznate adrese lokacija).

– Funkcija se može pozvati po referenci, ako je deklarisana i definisana sa argumentima pokazivačima na odgovarajuće tipove.

Page 20: Lekcija 4 funkcije

Funkcije...

• Rekurzivna funkcija

• Funkcija koja poziva samu sebe

- konačan broj puta

- svaki put sa različitim vrijednostima

• Uvijek postoji:

- iterativni postupak koji može zamijeniti rekurzivni

• Prednost:

- jednostavniji algoritam od iterativnog

Nedostatak:

- može biti veliki broj poziva iste funkcije, a svaki put se pokreće mehanizam poziva.

Page 21: Lekcija 4 funkcije

Funkcije...

• Iterativni postupak u funkciji faktorijel

long ifakt(int n){ int i, fakt=1; /*na pocetku fakt=1*/

for(i=2; i<=n; i++)fakt *=i; /*mnozenje u svakoj iteraciji sa i*/

return fakt;}

ifakt(n) = 1 *2 * 3 * ………. * (n-2) * (n-1) * nU jednom pozivu funkcije (n-1) iteracija

n-1 puta izvršava operaciju fackt=fact*i

Page 22: Lekcija 4 funkcije

Funkcije…

• Rekurzivni algoritam funkcije faktorijel

long rfakt(int n){ if(n==1)return 1; /*kraj izvrsavanja funkcije*/elsereturn( n*rfakt(n-1) ); /*funkcija poziva samu sebe*/}

rfakt(n) = n * rfakt(n-1)(n-1) * rfakt(n-2)

(n-2) * rfakt(n-3)……....

2*rfakt(1)1

Funkcija poziva samu sebe (n-1) puta

Page 23: Lekcija 4 funkcije

Funkcije…

• Glavna funkcija

main(){ int x,y;...return 0;}

Po pokretanju programa operativni sistem poziva njegovu glavnu funkciju.

Poslednja funkcija glavne funkcije vraća status operativnom sistemu.

Page 24: Lekcija 4 funkcije

Funkcije…

• Identičnost

main(){ ...return 0;}

main(){ ...return ЕXIT_SUCCESS;}

Page 25: Lekcija 4 funkcije

Funkcije…

• Funkcija za preveremeni kraj izvršenja

programa

Funkcija exit() iz stdlib.hvoid exit( int status ); // Deklaracija u biblioteciexit( status ); // PozivPozivom funkcije exit() prosledjuje se status

operativnom sistemu: 0/1

Primjeri poziva :

-U slučaju da nema greški

exit(0); exit(EXIT_SUCCESS);- U slučaju greške

exit(1); exit(EXIT_FAILURE);

Page 26: Lekcija 4 funkcije

Funkcije…• Funkcija za poziv drugog programa u okviru

postojećeg operativnog sistema, a iz bilo koje

funkcije C kodaFunkcija system() iz stdlib.hint system(const char *ime);system("ime_programa");(Vraća 0 ako dobije u argumentu ime programa, u suprotnom -1)

system() prekida tok izvršavanja jednog programa,

poziva se i izvršava drugi program i nakon toga

nastavlja izvršavanje prekinutog programa.

Primjeri poziva DOS komandi:system("cls");system("dir");system("ime_drugog_programa");

Page 27: Lekcija 4 funkcije

Funkcije vs Makroi

Makroi sa argumentima

• Makro je definicija simbola u kojoj se javljaju jedan ili više

argumenata.

• Na primer:

#define KVADRAT(x) ((x)*(x))

definiše makro koji izračunava drugi stepen argumenta.

Argument x se u programu zamenjuje stvarnim argumentom

proizvoljnog tipa. Na primer:

KVADRAT(r+1)

postaje: ((r+1)*(r+1))

Vidimo da je parametrizirani makro vrlo sličan funkciji no u njemu nema

funkcijskog poziva i prenošenja argumenata, pa je stoga efikasniji.

Sličnost makroa i funkcije može zavarati!!!!

Page 28: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase

DomenDomen identifikatoraidentifikatora??

DomenDomen identifikatoraidentifikatoraDomenDomen (oblast definisanosti) identifikatora (promjenljive) je podru(oblast definisanosti) identifikatora (promjenljive) je područčje je

programa u kojem je taj identifikator dostupan (vidljiv)programa u kojem je taj identifikator dostupan (vidljiv)

Osnovno pravilo:Osnovno pravilo:Identifikator je dostupan u bloku u

kojem je definisan, kao i u svim

ugnježđenim blokovima, osim ako u njima nije maskiran drugim

identifikatorom sa istim imenom!PrimjerPrimjer::

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

main()main()

{{

int x=1;int x=1;

printf(printf(””Prije bloka: %dPrije bloka: %d\\nn””,x,x););

{{

intint x=0;x=0;

printf(printf(””UU blokubloku: %: %dd\\nn””,x,x););

}}

printf(printf(””PoslijePoslije bloka: %dbloka: %d\\nn””,x,x););

}}

Prije bloka: 1

U bloku: 0

Poslije bloka: 1

U ugnježđenom blokuje definisana

promjenljiva sa

istim imenom, čime

je maskirana

promjenljiva x iz

funkcije main()

Page 29: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

Memorijske klaseMemorijske klase??

Memorijske klase promjenljivihMemorijske klase promjenljivih

U programskom jeziku C razlikujemo 4 memorijske klase promjenljiU programskom jeziku C razlikujemo 4 memorijske klase promjenljivih:vih:

•• globalneglobalne

definidefiniššu se izvan svih funkcijau se izvan svih funkcija

•• statistatiččkeke

definidefiniššu se koriu se koriššććenjem kljuenjem ključčne rijene riječči i staticstatic

static tip ime=vrijednoststatic tip ime=vrijednost

•• automatskeautomatske

definidefiniššu se koriu se koriššććenjem kljuenjem ključčne rijene riječči i autoauto

auto tip ime=vrijednostauto tip ime=vrijednost

podrazumijeva se da je promjenljiva automatska, ako se podrazumijeva se da je promjenljiva automatska, ako se

drugadrugaččije ne navedeije ne navede

•• registarskeregistarske

definidefiniššu se koriu se koriššććenjem kljuenjem ključčne rijene riječči i registerregister

register tip ime=vrijednostregister tip ime=vrijednost

Page 30: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

AutomatskeAutomatske

promjenljive?promjenljive?

AutomatskeAutomatske promjenljivepromjenljiveAutomatskeAutomatske promjenljivepromjenljive definidefiniššu seu se na pona poččetku tijela funkcije (glavnog programa etku tijela funkcije (glavnog programa

ili potprograma). ili potprograma). ČČesto se koristi i termin esto se koristi i termin lokalna promjenljivalokalna promjenljiva..

PoPoččetna vrijednost im se ne podrazumijeva!!! (To znaetna vrijednost im se ne podrazumijeva!!! (To značči da nije nula!!!)i da nije nula!!!)

Mogu da se koriste samo u funkciji u kojoj su definisane. To znaMogu da se koriste samo u funkciji u kojoj su definisane. To značči da isto ime i da isto ime

momožžemo da koristimo nezavisno u viemo da koristimo nezavisno u višše razlie različčitih funkcija. itih funkcija. ČČak te promjenljive ak te promjenljive

mogu da budu i razlimogu da budu i različčitih tipova.itih tipova.

Automatski nastaju prilikom ulaska u funkciju, a automatski nestAutomatski nastaju prilikom ulaska u funkciju, a automatski nestaju nakon aju nakon

izlaska iz funkcije.izlaska iz funkcije.

Podrazumijeva se da je promjenljiva automatska ako se drugaPodrazumijeva se da je promjenljiva automatska ako se drugaččije ne navedeije ne navede

Ne mora se eksplicitno navoditi da se radi o automatskoj promjenNe mora se eksplicitno navoditi da se radi o automatskoj promjenljivoj, ali moljivoj, ali možže e

pomopomoćću kljuu ključčne rijene rijećći autoi auto

auto tip ime=vrijednost;auto tip ime=vrijednost;

Page 31: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

Automatske Automatske

promjenljive?promjenljive?

PrimjerPrimjer:: Maniulacija automatskim promjenljivima.Maniulacija automatskim promjenljivima.

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

void f1 ()void f1 ()

{{ int i=1;int i=1;

printf(printf(””f1: %df1: %d\\nn””, i);, i);

}}

void f2 ()void f2 ()

{{ int i=2;int i=2;

printf(printf(””f2: %df2: %d\\nn””, i);, i);

i=10;i=10;

}}

main()main()

{{

int i=0; int i=0;

printf(printf(””main: %dmain: %d\\nn””, i);, i);

f1();f1();

printf(printf(””main: %dmain: %d\\nn””, i);, i);

i=5;i=5;

f2();f2();

printf(printf(””main: %dmain: %d\\nn””, i);, i);

}}

main: 0

f1: 1

main: 0

f2: 2

main: 0

Page 32: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

StatiStatiččke promjenljive?ke promjenljive?

StatiStatiččke promjenljiveke promjenljive

DefiniDefiniššu se navođenjem kljuu se navođenjem ključčne rijene riječči i staticstatic

static tip ime=vrijednoststatic tip ime=vrijednost

Vrijednost im se određuje prije poVrijednost im se određuje prije poččetka izvretka izvrššavanja programaavanja programa

uzima se eksplicitna vrijednost kojom je inicijalizovana promjeruzima se eksplicitna vrijednost kojom je inicijalizovana promjernljivanljiva

podrazumijeva se popodrazumijeva se poččetna vrijednost nula ako se ne navedeetna vrijednost nula ako se ne navede

Imaju trajan karakterImaju trajan karakter

postoje od popostoje od poččetka do kraja izvretka do kraja izvrššavanja programaavanja programa

vrijednost ostaje savrijednost ostaje saččuvana do sljedeuvana do sljedeććeg poziva date funkcijeeg poziva date funkcije

Page 33: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

StatiStatiččke promjenljive?ke promjenljive?

PrimjerPrimjer:: Maniulacija statiManiulacija statiččkom promjenljivom.kom promjenljivom.

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

void f ()void f ()

{{

static int brs=1;static int brs=1;

auto int bra=1;auto int bra=1;

printf(printf(””static brs=%d auto bra=%dstatic brs=%d auto bra=%d\\nn””, brs, bra);, brs, bra);

brs++;brs++;

bra++;bra++;

}}

main()main()

{{

int i; int i;

for (i=1; i<=3; i++)for (i=1; i<=3; i++)

f();f();

}}

static brs=1 auto bra=1

static brs=2 auto bra=1

static brs=3 auto bra=1

Page 34: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

Globalne promjenljive?Globalne promjenljive?

Globalne promjenljiveGlobalne promjenljiveGlobalne promjenljive definiGlobalne promjenljive definiššu se izvan svih funkcija. u se izvan svih funkcija. Ako se u definiciji ne navede Ako se u definiciji ne navede

popoččetna vrijednost podrazumijeva se nula!!!etna vrijednost podrazumijeva se nula!!!

Globalna promjenljiva dostupna je u svim funkcijama koje su defiGlobalna promjenljiva dostupna je u svim funkcijama koje su definisane nakon nisane nakon

definicije date promjenljive.definicije date promjenljive.

Globalne promjenljive omoguGlobalne promjenljive omoguććavaju da viavaju da višše funkcija manipulie funkcija manipulišše istim skupom e istim skupom

podataka, pa omogupodataka, pa omoguććavaju efikasnu razmjenu podataka između funkcija avaju efikasnu razmjenu podataka između funkcija (jer sve (jer sve

funkcije pristupaju istim memrijskim lokacijama).funkcije pristupaju istim memrijskim lokacijama).

Treba ih izbjegavati jer se gubi univerzalnost funkcije i fleksiTreba ih izbjegavati jer se gubi univerzalnost funkcije i fleksibilnost primjene na bilnost primjene na

razlirazliččite setove podataka.ite setove podataka.

Ako se u nekoj funkciji definiAko se u nekoj funkciji definišše promjenljiva sa istim imenom kao i neka globalna, e promjenljiva sa istim imenom kao i neka globalna,

tada ta lokalna promjenljiva maskira globalnu i globalnoj ne motada ta lokalna promjenljiva maskira globalnu i globalnoj ne možže da se pristupi.e da se pristupi.

Ako se u nekoj funkciji koristi neka globalna promjenljiva to moAko se u nekoj funkciji koristi neka globalna promjenljiva to možže da se e da se

eksplicitno naglasi deklaracijom korieksplicitno naglasi deklaracijom koriššććenjem kljuenjem ključčne rijene riječči extern, iako ne postoji i extern, iako ne postoji

obaveza da se globalne promjenljive deklariobaveza da se globalne promjenljive deklariššu u funkcijiu u funkciji

extern tip promjenljiva;extern tip promjenljiva;

Page 35: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

Globalne promjenljive?Globalne promjenljive?

PrimjerPrimjer:: Maniulacija globalnom promjenljivom.Maniulacija globalnom promjenljivom.

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

void f1 ()void f1 ()

{{ int i=1;int i=1;

printf(printf(””f1: %df1: %d\\nn””, i);, i);

}}

int i;int i;

void f2 ()void f2 ()

{{ extern int i;extern int i;

printf(printf(””f2: %df2: %d\\nn””, i);, i);

i=10;i=10;

}}

main()main()

{{

printf(printf(””main: %dmain: %d\\nn””, i);, i);

f1();f1();

printf(printf(””main: %dmain: %d\\nn””, i);, i);

i=5;i=5;

f2();f2();

printf(printf(””main: %dmain: %d\\nn””, i);, i);

}}

main: 0

f1: 1

main: 0

f2: 5

main: 10

globalna

promjenljiva

i=0

Globalna promjenljiva i nije

vidljiva u funkciji f1() jer je

definisana nakon funkcije.

U funkciji f1() raspoloživa je lokalna promjenljiva i.

U funkciji f2() koristi se

globalna promjenljiva i.

Deklaracija extern int i mogla

je da se izostavi

Page 36: Lekcija 4 funkcije

DomeniDomeni i i memorijskememorijske klaseklase......

Registarske Registarske

promjenljive?promjenljive?

Registarske promjenljiveRegistarske promjenljiveRegistarske promjenljive su automatske promjenljive za koje je iRegistarske promjenljive su automatske promjenljive za koje je izrazražžena ena žželja da elja da

se drse držže u registrima procesora, a ne u memoriji, kako bi se dobilo na e u registrima procesora, a ne u memoriji, kako bi se dobilo na brzini.brzini.

PoPožželjno je korieljno je koriššććenje registarskih promjenljivih kod promjenljivih koje se enje registarskih promjenljivih kod promjenljivih koje se ččesto esto

koriste (npr. brojakoriste (npr. brojačč))

Ne garantuje se da Ne garantuje se da ćće promjenljiva stvarno i biti registarska. To zavisi i od e promjenljiva stvarno i biti registarska. To zavisi i od

konkretnog prevodioca, procesora , ukupnog broja registarskih prkonkretnog prevodioca, procesora , ukupnog broja registarskih promjenljivih do omjenljivih do

trenutka deklaracije date promjenljive...trenutka deklaracije date promjenljive...

Broj registarskih promjenljivih je ograniBroj registarskih promjenljivih je ograniččen i malen.en i malen.

Registarske promjenljive definiRegistarske promjenljive definiššu se uz pomou se uz pomoćć kljuključčne rijene riječči i registerregister

register tip ime=vrijednostregister tip ime=vrijednost

Primjer:Primjer:

register int i=10;register int i=10;

register j;register j;

Page 37: Lekcija 4 funkcije

Funkcije…

• Primjer 1

/∗Odredjivanje veceg od dva broja pomocu odgovarajuce funkcije∗/#include <stdio.h>int max(int x, int y); /∗deklaracija funkcije∗/main( ){

int a, b, c;printf("\nZadati dva cela broja: "); scanf("%d%d", &a, &b);c = max(a, b); /∗poziv funkcije∗/

if(c == 0) printf("\nZadati brojevi su isti!!!\n");else printf("\nVeci od dva zadata broja je broj %d\n\n", c);

return 0; }

int max(int x, int y){ if(x == y) return 0;else return ((x>y)?x:y);}

Page 38: Lekcija 4 funkcije

Funkcije…

• Primjer 2

/∗Odredjivanje najveceg od 4 broja pomocu odgovarajucih funkcija∗/#include <stdio.h>int max(int x, int y);int max4(int x, int y, int z, int w);main( ){ int a, b, c, d;printf("\nZadati cetiri cela broja: ");scanf("%d%d%d%d", &a, &b, &c, &d);printf("\nNajveci od cetiri zadata broja je %d\n\n", max4(a,b,c,d));return 0; }

int max(int x, int y){ return ((x>=y)?x:y); }int max4 (int x, int y, int z, int w){ return (max(max(x,y), max(z,w))); }

Page 39: Lekcija 4 funkcije

Funkcije…

• Primjer 3

/∗ Odredjivanje faktorijela pomocu iterativne funkcije ∗/#include <stdio.h>#define OPSEG 12 /∗da faktorijel broja bude u opsegu long∗/long ifakt(int x);main(){ int broj;

do{ printf("\nUnesite ceo broj u opsegu od 1 do %d: ", OPSEG);scanf("%d", &broj);}while(broj<1 || broj>OPSEG);

printf("\nFaktorijel broja %d je %ld\n\n", broj, ifakt(broj));return 0; }long ifakt(int x){ long rezultat = 1;

while(x>1){ rezultat ∗=x; x--; }

return rezultat; }

Page 40: Lekcija 4 funkcije

Funkcije…

• Primjer 4/∗Izracunavanje faktorijela zadatog broja pomocu rekurzivne funkcije∗/#include <stdio.h>#define OPSEG 12 /∗da faktorijel broja bude u opsegu long∗/long rfakt(int x);main(){ int broj;

do{ printf("\nUnesite ceo broj u opsegu od 1 do %d: ", OPSEG);scanf("%d", &broj);}while(broj<1 || broj>OPSEG);

printf("\nFaktorijel broja %d je %ld\n\n", broj, rfakt(broj));return 0; }long rfakt(int x){ return ((x>1)? (x∗rfakt(x-1)) : 1); }

Page 41: Lekcija 4 funkcije

Funkcije…

• Primjer 5//Crtanje na ekranu okvira zadatih dimenzija#include <stdio.h>#define HLIN '-' //znak horizontalna crta okvira#define VLIN '|' //znak vertikalna crta okvira#define UGAO '+' //znak za ugao okvira#define PRAZNO ' ' //prazan znak#define MAX1 50 //dozvoljena duzina okvira#define MAX2 20 //dozvoljena sirina okviravoid hokvir(int l);void vokvir(int l);void znakovi(int n, char c);

Page 42: Lekcija 4 funkcije

Funkcije...

main() // NASTAVAK{ int i, duzina, sirina;do{ printf("\nUnesite duzinu okvira (od 1 do %d): ",MAX1);scanf("%d", &duzina);}while(duzina<1 || duzina>MAX1);do{ printf("\nUnesite sirinu okvira (od 1 do %d): ",MAX2);scanf("%d", &sirina);}while(sirina<1 || sirina>MAX2);//Stampanje gornjeg dela okvirahokvir(duzina);//Stampanje srednjeg dela okvirafor(i=0; i<sirina; i++)vokvir(duzina);//Stampanje donjeg dela okvirahokvir(duzina);getchar();getchar();return 0; }

Page 43: Lekcija 4 funkcije

Funkcije…

void hokvir(int l) // NASTAVAK{ putchar(UGAO);znakovi(l, HLIN);putchar(UGAO);putchar('\n');}void vokvir(int l){ putchar(VLIN);znakovi(l, PRAZNO);putchar(VLIN);putchar('\n'); }void znakovi(int n, char c){ while(n>0){ n--; putchar(c); }}

Page 44: Lekcija 4 funkcije

Funkcije…

Page 45: Lekcija 4 funkcije

Funkcije…

Page 46: Lekcija 4 funkcije

Funkcije…

• Izracunavanje stepena broja