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) Nincs ; { double eredmeny; Paraméterek - változóértékeket adnak át a függvénynek eredmeny=(double)a/b; - ezeket a függvény lokális változóként kezeli return eredmeny; 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: ...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)
int f1(); int f2(int); 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
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
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
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 EXIT_FAILURE
0 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!
𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙𝑖𝑠 𝑛 =
1 ℎ𝑎 𝑛 = 1 𝑛 ∗ 𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙𝑖𝑠(𝑛 − 1) 𝑘𝑢𝑙𝑜𝑛𝑏𝑒𝑛
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
Állnak
Gyakorta használt függvények tárolására A főprogram átláthatóvá tételéhez 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
//matek.cpp
#ifndef matek_h #define matek_h
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; }
int osszead(int,int) int kivon(int,int) int szoroz(int,int) double oszt(int,int)
//program.cpp #include "matek.h" void main() { int x; x=osszead(15,23); printf("%d",x); }
#endif
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