Programozás I 5. Előadás: Függvények
Függvény Egy alprogram Egy C program általában több kisméretű, könnyen értelmezhető függvényből áll Egy függvény megtalálható minden C programban: ez a main függvény void main()...
Függvények double osztas(int a, int b) double eredmeny; eredmeny=(double)a/b; return eredmeny; függvény definíciója függvény törzse
Függvények double osztas(int a, int b) double eredmeny; eredmeny=(double)a/b; return eredmeny; Nincs ; Paraméterek - változóértékeket adnak át a függvénynek - ezeket a függvény lokális változóként kezeli Függvény neve - ezzel lehet majd meghívni Visszatérési érték (a függvény eredménye) - lehet akármilyen típusú változó (int, char, double...) - ha nincs visszatérési érték: void
Függvények double osztas(int a, int b) double eredmeny; eredmeny=(double)a/b; return eredmeny; A return utasítás adja vissza a függvény eredményét A return utasítás rögtön kilép a függvényből
Függvényhívás double osztas(int a, int b) double eredmeny; eredmeny=(double)a/b; return eredmeny; double d; d=osztas(12,4); d=osztas(x,y);
Függvények deklarálása és prototípusa A függvényt mindig a meghívás előtt kell deklarálni int f1() return 1 int f2(int k) int j=f1(); return j+k; void main() int k=f2(3)+f1();
Függvények deklarálása és prototípusa Így nem fog menni: int f1(); int f2(int);...viszont van, amikor ez praktikusabb... Ilyenkor lehet a függvény prototípusát deklarálni: A prototípus ; -vel végződik és nem muszáj a paraméterek nevét deklarálni (csak típus) void main() int k=f2(3)+f1(); int f2(int k) int j=f1(); return j+k; int f1() return 1
A return használata A return adja vissza a függvény eredményét int teglalap_terulet(int h, int sz) return h*sz; A függvény mindig befejeződik a return után int primszam(int k) if(k<0) return 0; int i,v; v=0; for(i=0;i<k;i++) if(k%i==0) v=1; return v;
A return használata void típusú függvényeknél a return opcionális...de lehet használni a függvény befejezésére void primszam(int k) if(k<0) printf("rossz paraméter"); return; int i,v; v=0; for(i=0;i<k;i++) if(k%i==0) v=1; if(v==0) printf("primszam"); else printf("nem primszam");
Paraméterek és visszaadási értékek Egy függvénynek akárhány paramétere lehet Minden függvény csak egy változót adhat vissza később tanulunk egy módszert, hogy lehet több értéket visszaadni
Tömb paraméterek Tömböt is lehet paraméternek adni: void kiir(int a[20]); void kir(int a[]); Ha kétdimenziós tömb a paraméter, az első kivételével minden méretet meg kell adni void kiirmatrix(int a[][20]); void kir(int a[][]);
Lokális és globális változók Egy változó csak az adott blokkban érvényes A függvény csak a saját változóit látja paraméterek a függvényben deklarált változók int f1(int a) int t; t=a*10; t=a*k; return t; void main() int k=10; f1(20); A függvény látja a t és a változót A függvény nem látja a k változót
Lokális és globális változók Ha van olyan változó, amit az egész program kell használjon, azt lehet globálisan deklarálni a program elején double pi; double terulet(int r) return pi*r*r; double kerulet(int r) return 2*pi*r; void main() double k; pi=3.14159; k=kerulet(20);
Lokális és globális változók A globális változók esetében vigyázni kell, hogy hol változtatjuk meg int i,n; int primszam(int szam) n=0; for(i=0;i<szam;i++) if(szam%i==0) n=1; return n; void main() n=10; for(i=0;i<n;i++) primszam(i);
A main() függvény Általában void típusú és nincsenek paraméterei void main() Adhat viszont vissza értéket A program futása sikeres volt-e vagy sem Egyes kompilátorok ezt kötelezően kérik int main()... if(hiba) return 1;... return 0;
A main függvény Visszaadási érték: stdlib.h ban van meghatározva: EXIT_SUCCESS 0 EXIT_FAILURE 1 int main()... if(hiba) return EXIT_FAILURE;... return EXIT_SUCCESS;
A main függvény A programoknak is lehetnek paramétereik pl: winword.exe dokumentum.doc megfelel: void main(char s[]) A main függvénynek speciális standard paraméterei vannak stringtömb void main(int argc, char* argv[]) paraméterek száma Paraméterek: argv[0] program neve argv[...] program paraméterei
A main függvény Példa: int main(int argc, char *argv[]) int i; printf("az argumentumok száma: %d\n\n",argc); for(i=0;i<argc;i++) printf("%d. argumentum: %s\n",i,argv[i]); return 0; program.exe elso masodik Argumentumok szama: 3 0. argumentum: program.exe 1. argumentum: elso 2. argumentum: masodik
A main függvény Másik példa int main(int argc, char *argv[]) int i; if(argc!=3) printf("hibás paraméterszám"); return EXIT_FAILURE;...
Rekurzió Amikor egy függvény saját magát hívja meg
Rekurzió Egy függvény meg tudja hívni saját magát is FONTOS!!! Rekurzióban mindig kell legyen egy megállási feltétel! void rekurzivfuggveny(parameter) if (megallasi feltetel igaz) return; else rekurzivfuggveny(masik parameter);
Példa Hogy nő a fa? növessz_ágat(irány) ha(kicsi_az_ág) megáll; növessz_ágat(balra); növessz_ágat(jobbra); void main() növessz_ágat(fel);
Példa Faktoriális 5! = 5 * 4 * 3 * 2 * 1 5! = 5 * ( 4 * 3 * 2 * 1 ) 5! = 5 * 4! faktorialis n = 1 ha n = 1 n faktorialis(n 1) kulonben int faktorialis(int n) if (n==1) return 1; else return n*faktorialis(n-1);
Függvénykönyvtárak Hasonló funkciójú függvényeket csoportosítanak (lásd math.h) Hasznosak Gyakorta használt függvények tárolására A főprogram átláthatóvá tételéhez Állnak Egy fejléc-állományból (header file:.h) Forrás-állományból (cpp file) A fejléc tartalmazza a függvények prototípusát A forrás tartalmazza az implementációt
Példa //matek.h #ifndef matek_h #define matek_h int osszead(int,int) int kivon(int,int) int szoroz(int,int) double oszt(int,int) #endif //matek.cpp int osszead(int a,int b) return a+b; int kivon(int a,int b) return a-b; int szoroz(int a,int b) return a*b; double oszt(int a,int b) return (float)a/b; //program.cpp #include "matek.h" void main() int x; x=osszead(15,23); printf("%d",x); Az #ifdef #endif direktíva azért szükséges, hogy a függvényeket ne határozzuk meg többször (többszörös #include esetén) A.h és.cpp fileokat is hozzá kell adni a projekthez