Mi az a függvény?
Egyáltalán nem értem a függvényt olyan megfogalmazásban, hogy "hozzárendelés" meg úgy hogy egy halmaz elemei. Az angol 'function' szóból értem, hogy valamennyi jelenség matematikai/logikai leírása. Vagy "egy Mario játék véget ér, ha a játékos elvesztette az életeit."
Tehát volt, hogy megoldottam egy Határérték-számítás feladatot, de nem tudtam mit csinálok vagy egy programozás feladatot, ami nagyon egyszerű vagy egy játékban előfordulhat. De a függvény fogalmát nem értem (vagy úgy ahogy mások elmagyarázzák).
Az a baj, hogy a függvény-szemléletet 6-7. osztályban kell kialakítani, vagy már korábban.
A függvény valóban egy hozzárendelés, mégpedig egyértelmű (egyértékű) hozzárendelés.
Számhoz számot rendelünk a legtöbbször.
De pl. ha az emberek halmazának elemeihez embereket rendelünk, úgy, hogy mindenkihez az anyját rendeljük hozzá, ez is egy függvény.
De minden városhoz a legmagasabb épületét rendelve, ez is egy függvény.
Amit példának írtál, azok logikai műveletek inkább.
Függvény minden olyan művelet, amelynek kimenete függ a bemenetétől.
Függvény az összeadás, a kivonás is.
Programfejlesztés esetén a függvény a procedúrától abban különbözik, hogy mindig van visszatérési értéke.
"Függvény minden olyan művelet, amelynek kimenete függ a bemenetétől."
Ez nagyon pongyola megfogalmazás és még csak nem is helyes.
Tökéletesen lehet olyan függvényt definiálni, aminek a kimenete nem függ a bemenetétől, de ettől még függvény lesz.
Pedig annál nem nagyon van jobb definíció, hogy a függvény egy olyan hozzárendelés, ami minden bemenetéhez legfeljebb egy pontot rendel hozzá.
Bontsd ketté, először értsd meg a hozzárendelés, reláció fogalmát. Ennek a függvény csak egy speciális esete.
Nincs ebben semmi bonyolult, csak kicsit át kell gondolni.
"Függvény minden olyan művelet, amelynek kimenete függ a bemenetétől.": f(x) = π
"Függvény az összeadás, a kivonás is."
Valóban, bár ezek már többváltozós függvények. Lényegében 2 dimenzióban lévő ponthoz rendel 1 dimenzióban lévő pontot.
Ha vizualizálni akarjuk 3D -ben:
Na kezdjük a legelején. Van a nagy programozási elméletben egy olyan dolog, hogy alprogram (szeretik még szubrutinnak is nevezni, főleg a sci-fi filmekben). Ilyeneket azért írunk, hogy rövidebbé és átláthatóbbá tegyük a programunkat. Nem kell messzire menni példáért, nézzük a napirendedet:
felkelsz
megmosakszol
felöltözöl
előveszel egy szelet kenyeret
megkened vajjal
teszel rá szalámit
megeszed
csinálod a napi teendőidet
előveszel egy szelet kenyeret
megkened májkrémmel
teszel rá hagymát
megeszed
lefekszel
alszol
Ez már így ránézésre is furcsa érzéseket vált ki az emberből. Feltűnhet, hogy van egy ismétlődő részlet, amelyben bár apróbb eltérések lehetnek, de egy adott feladatot látnak el - kaját csinálsz. De:
- ha egy harmadik helyen is fel kell használnod, megint copy-paste-elheted
- mivel emberek vagyunk, az előbbi lépést minden további nélkül elcsesszük
- ha rájövünk, hogy ebben vannak hibák (ugye nem nézzük meg, hogy jók-e még azok a cuccok, amiből a szendvicset csináljuk), vagy egyszerűen csak valamit másképp akarunk csinálni, rögtön száz helyen írhatjuk át
- mellesleg hosszabb is tőle a kód (mondjuk ez nem hátrány akkor, ha csak annyi a lényeg, hogy meglegyen a napi sorszám-kvóta)
Az esetleges apróbb eltérések lesznek a függvény és eljárás paraméterei. Szóval ha értelmes ember módjára akarjuk ezt elkövetni, az így néz ki:
szendvicskészítés (kenőanyag, feltét):
.. előveszel egy szelet kenyeret
.. megkened kenőanyaggal
.. teszel rá feltétet
.. megeszed
felkelsz
megmosakszol
felöltözöl
szendvicskészítés(vaj, szalámi)
csinálod a napi teendőidet
szendvicskészítés(májkrém, hagyma)
lefekszel
alszol
A lényeg itt az volna, hogy amikor megírjuk a függvényünket és eljárásunkat, nem tudjuk, hogy milyen értékei lesznek a paramétereknek. Így nemes egyszerűséggel adunk neki valamilyen nevet, és az majd szépen be fog helyettesítődni. Hogy hol adsz a paramétereknek értéket? Ott, ahol meghívod. Ugye fontos a sorrend, elvégre a hagymát és a szalámit nem nagyon tudjuk kenni...
Nos, akkor hogy mi is az a függvény és az eljárás.
Az eljárással egy összetettebb cselekvést tudsz leírni. Ennek a cselekvésnek lehet valamilyen hatása - pl. kiír a programod valamit a képernyőre, megnyit egy fájlt, átállít valamilyen tulajdonságot stb. Ellenben a függvénnyel összetettebb műveleteket tudsz leírni. Minden egyes műveletnek pontosan egy eredménye van (nem több, nem kevesebb - jó, nyilván lehet trükközni, de a kőbe vésett szabály ez). Ezt hívjuk szakkifejezéssel visszatérési értéknek. És ha eredménye van, fontos kérdés lesz az, hogy milyen típusú eredménye lesz. Ezt leszámítva persze egy függvénynek is lehet valamilyen hatása, az eljáráshoz hasonlóan.
C-szerű nyelvek (C, C++, C#, Java például) a függvényeket és eljárásokat egy kalap alá veszik. A kezdők ezért szokták úgy rendesen besz_pni. Mivel egy eljárásnak csak hatása lehet (=nincs neki eredménye), így azt void kulcsszóval jelöljük:
void osszead_es_kiir(int a, int b) {
printf("%d", a+b);
}
Ellenben a függvénnyel, az ugye képez eredményt - onnan tudjuk, hogy függvénnyel állunk szemben, hogy az eredményének típusa jelölve van. Tegyük fel, összeadsz két int típusú adatot, annak az eredménye egy int típusú adat:
int osszead(int a, int b) {
return a+b; //na ez aztán nagyon összetett művelet volt...
}
Szóval feltűnhet, hogy van ez a return. Ennek két alakja van:
return;
return [kifejezés];
Előbbi csak eljárásokban szerepelhet, utóbbi csak függvényekben. A kettő közt az a különbség, hogy utóbbival jelezzük, ha a függvény futása során eredmény áll elő. A közös dolog bennük, hogy amikor return utasítás meghívódik, ott azon a ponton megszakad a függvény vagy eljárás futása.
void valami() {
return;
puts("Ezt már nem fogod látni");
}
int valami() {
return 5;
puts("Ezt se nagyon...");
}
És akkor beszéljünk ezeknek a meghívásáról. Egy függvény meghívása minden olyan helyen szerepelhet, ahol kifejezésnek vagy utasításnak kell állnia (ez utóbbi azért lehetséges, mert egy függvénynek lehet hatása, mint azt már korábban említettem). Ellenben egy eljárás csak olyan helyen szerepelhet, ahol utasításnak kell állnia (elvégre annak nincs eredménye, csak hatása).
Fontos kérdés lesz itt a paraméterátadási módok, de ebbe nem megyek most bele.
Akkor ez függvény vagy eljárás?
void osszead(int a, int b, int* c) {
*c = a+b;
}
Matematikában a függvény az, hogy egy X halmaz minden eleméhez hozzárendelem az Y halmaz 1-1 elemét úgy, hogy minden xeX -hez tartozzon pontosan 1 yeY aki az ő képe.
Például egy tetszőleges képlet, amiben szerepel az 'x' szimbólum, mint változó, és a képlet eredménye Y-beli, az egy függvény.
Könnyen meggondolható hogy a
> sin(x)*x+3
az X=R halmaz minden eleméhez hozzárendel pontosan egy yeR értéket, minden x-hez valakit, és senkihez sem többet, és hogy minden képlet így viselkedik.
Például az
> y^2=x
y-ra rendezve (y=+-sqrt(x)) nem függvény, vagy, legalábbis nem R-ből menő, mert egy darab x-hez több y is tartozhat.
Geometriailag az a feltétel hogy minden xeX-hez pontosan egy darab yeY tartozik úgy fogalmazható meg, hogy minden függőleges egyenes pontosan 1 helyen metszi el a függvény grafikonját.
Ahol X a vízszintes tengely és Y a függőleges tengely, és egy (x,y)eR^2 pont fekete, ha arra az (x,y) pontra teljesül hogy y=f(x). (Nem szükséges hogy X=Y=R, absztrakt halmazokra is ez a geometriai megfogalmazás)
Az előbbi nem-függvény geometriailag is megfogalmazható: az y^2=x -t kielégítő pontok a síkon egy jobbra néző parabola, látható hogy nem teljesül rá hogy minden függőleges egyenessel pontosan 1 metszete van.
Halmazelméletileg függvénynek nevezzük az olyan (x,y) párokból álló halmazt, amelyben nincsen két (x1,y1) és (x2,y2) pár, hogy
> x1=x2 de y1 != y2.
Tehát a függvény halmazelméleti megfogalmazása az, hogy függvénynek nevezzük azt a halmazt, amit ha ábrázolnánk a síkon akkor feketére színeznénk.
Tehát a halmazelméleti megfogalmazása a függvényeknek sokkal közelebb van a függvénygrafikon fogalmához, mint egy leképzéshez ami a tér pontjait "viszi ide-oda", vagy "egyik halmazból a másikba megy".
A halmazelméleti megfogalmazást szokták preferálni, mert nem magyar nyelven, hanem konkrétan a halmazelmélet nyelvével kifejezhető, csak az 'e' eleme reláció és a logikai operátorok segítségével.
> Tehát volt, hogy megoldottam egy Határérték-számítás feladatot, de nem tudtam mit csinálok
Ezt nem igazán hiszem el neked. :P
De nyilván a konkrét függvényeknek vannak konkrét tulajdonságaik, sőt, előfordulhat hogy néhány tulajdonságból már következik még több (korlátos + monoton -> konvergens).
Itt tulajdonságokkal dolgozol, és nem függvényekkel vagy függvények halmazelméleti definíciójával.
Programozásban is matematikailag ugyanezt, szemléletileg azonban nagyon más dolgokat szoktak függvényeknek tekinteni.
"Egyébként mi van akkor, ha c értéke NULL?"
segmentation fault
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!