> Funkcije su cjelovite skupine naredbi koje izvršavanjem ispunjavaju određene zahtjeve. > Omogućavaju razlaganje problema na jednostavnije manje cjeline, čime doprinose boljoj preglednost izvornog koda i jednostavnijem pronalaženju i otklanjanju pogrešaka = STRUKTURNO PROGRAMIRANJE > Top-down je općenit postupak kojim se dani problem raščlanjuje na manje zadatke tj. module. Pojedini moduli tada se rješavaju ili, ako je potrebno, ponovo dijele na nove module. > Funkcija se definira na slijedeći način: tip_funkcije ime_funkcije(najava liste_argumenata) { najava lokalnih varijabli; naredbe; return izlazna_vrijednost; } gdje: - tip_funkcije određuje tip vrijednosti koju pozvana funkcija vraća u nadređenu funkciju, a može biti bilo koji od osnovnih tipova podataka (int, char, float, double, void), - ime_funkcije je identifikator preko kojeg se funkcija poziva, dok je - lista_argumenata lista formalnih parametara sa pripadajućim tipovima preko kojih se niz podataka iz nadređene funkcije prenose u pozvanu funkciju. > Funkcija u nadređeni program vraća jednu ili niti jednu vrijednost ovisno o tipu funkcije. > Za prijenos vrijednosti u nadređeni program koristi se naredba return;. > Funkcija se poziva na slijedeći način: ime_funkcije(stvarna lista_argumenata); > Funkcije se mogu pozivati u izrazima, petljama, ili kao argumenti u pozivima drugih funkcija. > Svaka korištena funkcija se mora najaviti prije poziva. > Podaci iz nadređenih funkcija prenose se na dva načina: 1. pomoću vrijednosti (call by value) - promjena vrijednosti argumenata unutar pozvane funkcije ne utječe na promjenu vrijednosti prenesenih varijabli u nadređenoj funkciji. 2. pomoću adrese (call by reference) - promjena vrijednosti argumenta pozvane funkcije utječe na promjenu vrijednosti prenesenih varijabli nadređene funkcije (u pozvanu funkciju prenose se adrese varijabli nadređene funkcije). > STOG je dinamički dio memorije koji se upotrebljava za pohranjivanje podataka koji se privremeno koriste u određenim djelovnima programa. > Stog se puni i prazni prema principu "zadnji unutra - prvi van" (eng. LIFO " last in - first out") > Rekurzivna funkcija je funkcija koja poziva samu sebe. > Svaka rekurzija mora imati uvjet zaustavljanja koji će joj omogućiti izlaz. > Za pohranjivanje rezultata i povratak iz rekurzije upotrebljava se STOG. > Svaki poziv rekurzije mora se približavati uvjetu zaustavljanja.
Tip_funkcije ime_funkcije (najava liste argumenata) { Najava lokalnih varijabli; Naredbe; Return ; Return izlazna_vrijednost; }
Int pomnozi (int x, int y) { Int rez; Rez=x*y; Return rez; } Zadatak 1. Pokaži Učitaj dva cijela broja pa korištenjem funkcije zamijeni vrijednosti varijablama. #include <stdio.h> int a,b; /*najava globalnih varijabli*/ /*funkcija zamjene*/ void zamjena () { int t; /*lokalna varijabla*/ t=a; /*zamjena koristenjem globalnih varijabli*/ a=b; b=t;l } void main() { printf("Unesite dva cijela broja "); scanf("%d,%d",&a,&b); printf("\nUpisali ste a=%d i b=%d",a,b); zamjena(); /*poziv funkcije sa globalnim varijablama*/ printf("\nNakon funkcije a=%d, b=%d",a,b); }
Zadatak 2. Pokaži Učitaj koordinate dviju točaka u koordinatnom sustavu pa izračunaj njihovu udaljenost. #include <stdio.h> #include <math.h> /*najava funkcije za racunanje udaljenosti*/ float udaljenost(float,float,float,float) ; /*prototip funkcije*/ /*pocetak glavnog programa*/ void main() { float x1,x2,y1,y2,d1; printf("Upisite koordinate tocke T1 "); scanf("%f,%f",&x1,&y1); printf("\nUpisite koordinate tocke T2 "); scanf("%f,%f",&x2,&y2); /*racunanje udaljenosti medju tockama T1 i T2 pozivom funkcije*/ d1=udaljenost(x1,y1,x2,y2); printf("\nUdaljenost medju zadanim tockama je %.2f\n",d1); } /*kraj glavnog dijela programa*/ /*tijelo funkcije za racunanje udaljenosti*/ float udaljenost(float a,float b,float c,float d) { float dulj; dulj=sqrt(pow(c-a,2)+pow(d-b,2)); return dulj; }
#include <stdio.h> #include <math.h> /*funkcija za racunanje udaljenosti*/ float udaljenost(float a,float b,float c,float d) { float dulj; dulj=sqrt(pow(c-a,2)+pow(d-b,2)); return dulj; } /*pocetak glavnog programa*/ void main() { float x1,x2,y1,y2,d1; printf("Upisite koordinate tocke T1 "); scanf("%f,%f",&x1,&y1); printf("\nUpisite koordinate tocke T2 "); scanf("%f,%f",&x2,&y2); /*racunanje udaljenosti medju tockama T1 i T2 pozivom funkcije*/ d1=udaljenost(x1,y1,x2,y2); printf("\nUdaljenost medju zadanim tockama je %.2f\n",d1); }
Zadatak 3. Pokaži Napravite program koji će, koristeći funkciju za udaljenost dvije točke, izračunati i ispisati opseg i površinu trokuta zadanog koordinatama svojih točaka u pravokutnom koordinatnom sustavu. #include <stdio.h> #include <math.h> float o; float udaljenost(float a,float b,float c,float d) { float dulj; dulj=sqrt(pow(c-a,2)+pow(d-b,2)); return dulj; } float opseg (float d1, float d2, float d3) { o=d1+d2+d3; return o; } float povrsina (float d1, float d2, float d3) { float s,p; s=o/2; p=sqrt(s*(s-d1)*(s-d2)*(s-d3)); return p; } void main() { float x1,x2,x3,y1,y2,y3,d1,d2,d3,p; printf("Upisite koordinate tocke A "); scanf("%f,%f",&x1,&y1); printf("\nUpisite koordinate tocke B "); scanf("%f,%f",&x2,&y2); printf("\nUpisite koordinate tocke C "); scanf("%f,%f",&x3,&y3); /*racunanje duljina stranica pozivom funkcije*/ d1=udaljenost(x1,y1,x2,y2); d2=udaljenost(x2,y2,x3,y3); d3=udaljenost(x1,y1,x3,y3); o=opseg(d1,d2,d3); p=povrsina(d1,d2,d3); printf("\nDuljine stranica trokuta su %.2f, %.2f, %.2f",d1,d2,d3); printf("\nOpseg je %.2f\nPovrsina je %.2f",o,p); }
Zadatak 4. Pokaži Rotiramo li pravokutni trokut oko njegovih kateta i hipotenuze, dobit ćemo 4 stošca (po jedan rotacijom oko kateta i dva spojena rotacijom oko hipotenuze). Treba pronaći stožac sa najmanjim volumenom! #include<stdio.h> #include<math.h> #define pi 3.14 /*funkcija koja provjerava je li ucitani trokut pravokutan*/ int provjera(float x, float y, float z) { int p=0;
if (pow(x,2)+pow(y,2)==pow(z,2)) p=1; return p; } /*funkcija koja racuna obujam stozca*/ float obujam(float r, float v) { float o; o=(pow(r,2)*pi*v)/3; return o; } float pitagora(float z, float y) { float x; x=sqrt(pow(z,2)-pow(y,2)); return x; } /*manji od dva broja*/ float manji (float x, float y) { float z; if (x
Zadatak 5. Pokaži Napravite program koji omogućuje unošenje duljina stranica pravokutnika pa pomoću funkcija za računanje površine i opsega računa i ispisuje površinu i opseg. #include <stdio.h> #include <math.h> /*funkcija za racunanje povrsine*/ float povrsina(float x,float y) { float pov; /*lokalna varijabla*/
pov=x*y; return pov; } /*funkcija za opseg - skraceno pisana*/ float opseg(float x,float y) { return 2*x+2*y; } /*glavni dio programa*/ void main() { float a,b,p; printf("Unesite duljine stranica pravokutnika ==>"); scanf("%f,%f",&a,&b); if (a<=0 || b<=0) printf("\nDuljina stranice mora biti veca od 0"); else { p=povrsina(a,b); /*poziv pridruzivanjem varijabli*/ printf("Povrsina je %.2f\n",p); printf("Opseg je %.2f",opseg(a,b));/*Poziv unutar printf funkcije*/ } }
Zadatak 6. Pokaži Napravite program koji će omogućiti unošenje duljine stranice kocke. Program treba, koristeći funkcije, ovisno o želji korisnika izračunati i ispisati oplošje, volumen ili duljinu prostorne dijagonale zadane kocke #include <stdio.h> #include <math.h> float oplosje(float x) { return 6*pow(x,2); } float volumen(float x) { return pow(x,3); } float dijagonala(float x) { return x*sqrt(3);
} void main() { float a; int i; printf("Unesite duljinu stranice kocke ==>"); scanf("%f",&a); if (a<=0) printf("Stranica mora biti >=0"); else { printf("\nIzaberite:\n1.Oplosje\n2.Volumen\n3.P.dijagonala"); printf("\nUpisite broj ==>"); scanf("%d",&i); switch(i) { case 1:printf("Oplosje je %.2f",oplosje(a)); break; case 2:printf("Volumen je %.2f",volumen(a)); break; case 3:printf("Duljina pr. dijagonale je %.2f",dijagonala(a)); break; default:printf("Broj mora biti 1-3"); } } }