Programozási alapismeretek 6. előadás
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.2/ Rekordok/struktúrák – adatabsztrakció Rekordok/struktúrák Összetett típusok – kitekintés Összetett típusok Függvények – algoritmikus absztrakció Függvények Tartalom
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.3/ Rekordok/Struktúrák Feladat: Adjuk meg, hogy egy P síkbeli pont melyik síknegyedbe esik! Megoldás felé: A síkbeli pontokat x- és y-koordinátájukkal adjuk meg. Ehhez egy új összetett adattípus- ra van szükség: P:Rekord(x,y:Valós) A rekordok a tömbökhöz hasonlóan össze- tett adattípusok, itt azonban az elemeknek nem indexük (sorszámuk) van, hanem nevük (P.x, P.y).
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.4/ Rekordok/Struktúrák Specifikáció: xy Bemenet: P:TPont, TPont=Rekord(x,y:Valós) Kimenet: SN:Egész Előfeltétel: – Utófeltétel: P.x 0 és P.y 0 SN=1 és P.x<0 és P.y 0 SN=2 és P.x<0 és P.y<0 SN=3 és P.x 0 és P.y<0 SN=4 C++ típus definíció : struct TPont{double x,y;} típusazonosító mezőtípus mezőazonosító(k) Típusdefiníció
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.5/ Rekordok/Struktúrák Specifikáció: Px,y Bemenet: P:TPont, TPont=Rekord(x,y:Valós) Kimenet: SN:Egész Előfeltétel: – P.xP.y Utófeltétel: P.x 0 és P.y 0 SN=1 és P.x<0 és P.y 0 SN=2 és P.x<0 és P.y<0 SN=3 és P.x 0 és P.y<0 SN=4 C++ típus deklaráció : TPont P; típusazonosító adatazonosító adatazonosító. mezőazonosító
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.6/ P.x 0 P.y 0 P.yP.y0P.yP.y0 SN:=1SN:=4SN:=2SN:=3 P.x 0 P.y0P.y0P.y0P.y0 SN:=1SN:=4SN:=2SN:=3 Rekordok/Struktúrák Algoritmus: I N I N I N adatazonosító. mezőazonosító
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.7/ Rekordok/Struktúrák P.x 0 P.y 0 P.yP.y0P.yP.y0 SN:=1SN:=4SN:=2SN:=3 C++ hivatkozás: x y y if (P. x>=0){ if (P. y>=0) SN=1; else SN=4; }else{ if (P. y>=0) SN=2; else SN=3; } Algoritmus: adatazonosító. mezőazonosító I N I N I N
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.8/ Rekordok/Struktúrák A teljes C++ kód: Típusdefiníció Típusdeklarációk
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.9/ Rekordok/Struktúrák A teljes C++ kód: Beolvasások
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.10/ Rekordok/Struktúrák A teljes C++ kód: A lényeg Kód Kód jegyzet- ként Kód Kód jegyzet- ként Kód
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.11/ Összetett típusok
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.12/ Feladat: Adjuk meg, hogy az origóból nézve az 1. sík- negyedbe eső P ponthoz képest a Q balra, jobbra, vagy pedig egy irányban látszik-e! Irány(P,Q) = Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.13/ Értelmezés: A pontok irányát megadhatjuk az oda vezető egyenes és az x-tengely szögével. < tan( )<tan( ) tan( )=P.y/P.x Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.14/ < tan( )<tan( ) P.y/P.x<Q.y/Q.x P.y*Q.x<Q.y*P.x P.y*Q.x–Q.y*P.x<0 Állítás: Irány(P,Q)=sgn(P.y*Q.x–Q.y*P.x ) (és ez igaz nem csak az 1. síknegyedben!). Ellenőrizze a teljesülését: sgn(P.y*Q.x–Q.y*P.x ) = Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.15/ Specifikáció : Bemenet: P,Q:TPont, TPont=Rekord(x,y:Valós) Kimenet: Ir:Egész Előfeltétel: – Utófeltétel: Ir=Irány(P,Q) Definíció: Irány:TPont TPont Egész Irány(p,q):=sgn(p.y*q.x–q.y*p.x ) Algoritmus: Ir:=Irány(P,Q) Aktuális paraméterek Formális paraméterek Aktuális paraméterek Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.16/ Függvénydefiníció: a forgásirány meghatározására. Irány(p,q:TPont):Egész S:=p.y*q.x – q.y*p.x S<0S=0S>0 F:= – 1F:=0F:=1 Irány:=F Formális paraméterek Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.17/ C++ kódolás: int Irany(TPont p, TPont q) { int F,S; //segédváltozók S=p.y*q.x-q.y*p.x; //típuskonverzió if (S 0) F=1; return F; } int Ir=Irany(P,Q); Függvények (irány)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.18/ C++ kódolás – egésze: Függvények (irány) Függvényfejsor- definíciók ( prototípusok ) Főprogram Típusdefiníció Formális paraméter- konvenció: _azonosító
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.19/ C++ kódolás – egésze: Függvények (irány) A lényegi finomítás (=függvény)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.20/ C++ kódolás – egésze: Függvények (irány) A bemenet finomításai (=függvény)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.21/ C++ kódolás – egésze: Függvények (irány) Kód Kód jegyzet- ként Kód Kód jegyzet- ként Kód A kimenet és kilépés finomításai (=függvény)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.22/ Megjegyzés: a bemenet sokszor értékvisszaadás nélküli függ- vénnyel (eljárással) történik; az előbbi pl. így: Függvények (irány) void BePont(string _pontNev, TPont &_pont) { _pont.x=BeKoordinata("Add meg "+_pontNev+ " x-koordinatajat!"); _pont.y=BeKoordinata("Add meg "+_pontNev+ " y-koordinatajat!"); return; } TPont BePont(string _pontNev) { TPont pont;//segéd pont pont.x=BeKoordinata("Add meg "+_pontNev+ " x-koordinatajat!"); pont.y=BeKoordinata("Add meg "+_pontNev+ " y-koordinatajat!"); return pont; } Bementi paraméter Kimenti paraméter
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.23/ C++ tudnivalók – összefoglalás: Függvényfej-definíció: Függvény-definíció: fvTíp fvAzon(parTíp formParAzon,…); vagy void fvAzon(parTíp formParAzon,…); A formális paraméterek elmaradhatnak, de a zárójelek nem! A fejsor, pontosvessző nélkül { … //fvtörzs return fvÉrték } void esetén fvÉrték nélküli return ! Függvények
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.24/ C++ tudnivalók – összefoglalás: Formális skalár paraméter: o bemeneti nincs speciális kulcs-szó (jel) o kimeneti & a speciális prefix kulcs-szó (jel) Aktuális skalár paraméter: ha a megfelelő formális paraméter o bemeneti akár konstans, akár változó o kimeneti csak változó lehet. Függvények Pontosabban: nem tömb
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.25/ Függvények C++ tudnivalók – összefoglalás: Skalár paraméterátadás: o Értékszerinti − a formális paraméterből keletkezett lokális változóba másolódik a híváskor az aktuális paraméter értéke, így ennek a törzsön belüli megváltozása nincs hatással az aktuális paraméterre. Pl.: o Hivatkozás szerinti − a formális paramé- terbe az aktuális paraméter címe (rá való hivat- kozás) kerül, a lokális néven is elérhetővé válik. Pl.: int max(int x, int y) void max(int x, int y, int &max_xy) Input-paraméterek. Input-paraméterek. In-/Output-paraméter.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.26/ C++ tudnivalók – összefoglalás: Formális tömb paraméter: o bemeneti const prefix kulcs-szó o kimeneti nincs speciális kulcs-szó Aktuális tömb paraméter: ha a megfelelő formális paraméter o bemeneti akár konstans, akár változó o kimeneti csak változó lehet. Függvények
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.27/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Tömb paraméterátadás: o Alapelv: a tömbök mindig hivatkozás szerint adódnak át! o Bemeneti − példa a fejsorra: o Kimeneti (is) − példa a fejsorra: void ki_int_tomb(const int x[], int n, int maxN) vagy void ki_int_tomb(const int x[maxN], int n, int maxN) void be_int_tomb(const int x[], int &n, int maxN) vagy void be_int_tomb(const int x[maxN],int &n, int maxN) Input-paraméterek. In-/ Output-paraméterek. Ellenőrzési céllal
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.28/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Tömb paraméterátadás: o Alapelv: a tömbök mindig hivatkozás szerint adódnak át! o Bemeneti − példa a fejsorra: o Kimeneti (is) − példa a fejsorra: Megjegyzés: az 1. változat mátrixokra nem működik! void ki_int_tomb(const int x[], int n, int maxN) vagy void ki_int_tomb(const int x[maxN], int n, int maxN) Input-paraméterek. void be_int_tomb(int x[], int &n, int maxN) vagy void be_int_tomb(int x[maxN],int &n, int maxN) In-/ Output-paraméterek. Ellenőrzési céllal
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.29/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete 1 …függvényfej-definíciók… int main()// a főprogram { // bemenet: …bemeneti_adatok deklarációi… // kimenet: …kimeneti_adatok deklarációi… // a programtevékenység legfelsőbb szintje: beolvasó_függvény ( bemeneti_adatok ); lényegi_függvény ( bemeneti_adatok,kimeneti_adatok ); kiíró_függvény ( kimeneti_adatok ); return 0; } …függvény-definíciók… Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. A legfőbb transzformáció a specifikáció Utófeltétel része alapján. Aktuális paraméterek.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6. 30/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete 2 // bemenet: …bemeneti_adatok deklarációi… // kimenet: …kimeneti_adatok deklarációi… …függvényfej-definíciók… int main()// a főprogram { // a programtevékenység legfelsőbb szintje: beolvasó_függvény ( bemeneti_adatok ); lényegi_függvény ( bemeneti_adatok,kimeneti_adatok ); kiíró_függvény ( kimeneti_adatok ); return 0; } …függvény-definíciók… Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. A paraméterezés elhagyható. A program GLOBÁLIS adatai.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6. 31/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete 2 // bemenet: …bemeneti_adatok deklarációi… // kimenet: …kimeneti_adatok deklarációi… …függvényfej-definíciók… int main()// a főprogram { // a programtevékenység legfelsőbb szintje: beolvasó_függvény (); lényegi_függvény (); kiiró_függvény (); return 0; } …függvény-defíníciók… Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. A program GLOBÁLIS adatai.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6. 32/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás (egy teljesebb példa) : Feladat: Nyelvvizsgán a nyelvtani tesztek pontszámait (0..maxP, maxP>0) ülési sorrendben jegyezték föl. Keressünk olyan vizsgázót, aki ugyanannyi pontot kapott, mint valamelyik szomszédja! Megoldás: Keresés tétel – egy pontszám-sorozatból kell kikeresni olyan elemet, amely megegyezik a szomszédjával (pontosítsunk: a következővel). Hf: specifikálás + algoritmizálás Figyeljük meg a kód alprogramokra bontását!
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.33/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: Függvényfej-definíciók.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.34/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: Adatbeolvasások, és a főprogram.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.35/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: Paraméterbeolvasó eljárás definíciója. maxN
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.36/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: A lényegi eljárás definíciója. (Keresés tétel!) maxN
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.37/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: A keresés eredményét kiíró eljárás definíciója.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.38/ Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: További eljárások definíciói. Kód jegyzet- ként Kiválasztás + sorozatszámítás tétel „fúziója”.
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.39/ Feladat: Egy s (A B) sza- kaszhoz képest egy t (B C) szakasz mi- lyen irányban fordul? Megoldásötlet: Toljuk el az s-t és a t-t úgy, hogy az A pont az origóba kerüljön! Ezzel visszave- zetjük az „irányos” feladatra! Fordul(A,B,C)=Irány(B–A,C–A)Irány Függvények (fordul)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.40/ Specifikáció: Bemenet: A,B,C:TPont, TPont=…… Kimenet: Ford:Egész Előfeltétel: – Utófeltétel: Ford=Fordul(A,B,C) Definíció: Fordul(a,b,c):=… a feladat leírása szerint –1, +1 vagy 0… Megjegyzés: Ezzel ekvivalens feladat: Az (A,B)-n átmenő egyenestől a C pont balra van, vagy jobbra van, vagy az (A,B)-re illeszkedő egyenesen van? Függvények (fordul)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.41/ A megoldásban hívjuk az Irány függvényt! Fordul(a,b,c:TPont):Egész p.x:=b.x – a.x p.y:=b.y – a.y q.x:=c.x – a.x q.y:=c.y – a.y Fordul:=Irány(p,q) Ford:=Fordul(A,B,C) int Fordul(TPont a, TPont b, TPont c){ TPont p,q; p.x=b.x – a.x; p.y=b.y – a.y; q.x=c.x – a.x; q.y=c.y – a.y; return Irany(p,q);} Függvények (fordul)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.42/ Feladat: Döntsük el, hogy egy C pont rajta van-e egy (A,B) szakaszon! Specifikáció: Bemenet: A,B,C:TPont Kimenet: RajtaE:Logikai Előfeltétel: – Utófeltétel: RajtaE=Rajta(A,B,C) Definíció: Rajta(a,b,c,):=… Függvények (rajta?)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.43/ Definíció: Rajta(a,b,c):= Fordul(a,b,c)=0 és Közte(a.x,c.x,b.x) és Közte(a.y,c.y,b.y) Azaz még egy függvényt kell definiálnunk, ami el- dönti, hogy a második paramétere a másik kettő között van-e! Közte(r,s,t):= r ≤ s ≤ t vagy t ≤ s ≤ r Függvények (rajta?)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.44/ Közte(r,s,t:TPont):Logikai Közte:=r s és s t vagy t s és s r Rajta(a,b,c:TPont):Logikai Rajta:= Fordul(a,b,c)=0 és Közte(a.x,c.x,b.x) és Közte(a.y,c.y,b.y) Függvények (rajta?)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.45/ Függvények (metszi?) Feladat: Döntsük el, hogy az (A,B) szakasz metszi-e a (C,D) szakaszt! Lehetséges esetek:
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.46/ Specifikáció: Bemenet: A,B,C,D:TPont Kimenet: MetsziE:Logikai Előfeltétel: – Utófeltétel: MetsziE= ( Fordul(A,B,C)*Fordul(A,B,D)<0 és Fordul(C,D,A)*Fordul(C,D,B)<0 vagy Rajta(A,B,C) vagy Rajta(A,B,D) vagy Rajta(C,D,A) vagy Rajta(C,D,B) )FordulRajta Függvények (metszi?) Metszi(A,B,C,D)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.47/ Metszi(a,b,c,d:TPont):Logikai fabc:=Fordul(a,b,c) fabd:=Fordul(a,b,d) fcda:=Fordul(c,d,a) fcdb:=Fordul(c,d,b) Metszi:=fabc*fabd<0 és fcda*fcdb<0 vagy Rajta(a,b,c) vagy Rajta(a,b,d) vagy Rajta(c,d,a) vagy Rajta(c,d,b) Algoritmus: Függvények (metszi?)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.48/ Feladat: Döntsük el, hogy a D pont az (A,B,C) há- romszög belsejében van-e! Megoldásötlet: Belül van, ha a háromszöget A B C A sorrendben körbejárva a D pont vagy min- dig balra, vagy mindig jobbra van. Függvények (háromszögben?)
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.49/ Specifikáció: Bemenet: A,B,C,D:TPont Kimenet: BentE:Logikai Előfeltétel: – Utófeltétel: BentE=(Fordul(A,B,D)= =Fordul(B,C,D)=Fordul(C,A,D))Fordul Algoritmus: Belül(a,b,c,d:TPont):Logikai Belül:=Fordul(a,b,d)=Fordul(b,c,d) és Fordul(b,c,d)=Fordul(c,a,d)Fordul Függvények (háromszögben?) Kissé „szabadon” értelmezve a „lánc- azonosságot”!
ELTE Szlávi-Zsakó: Programozási alapismeretek 6.50/ Függvények Háromszögben Fordul Irány Metszi Fordul Irány Rajta Fordul Irány Közte A (lényegi) függvények egymásra épü- lése – a programok makró-struktúrája:
Programozási alapismeretek 6. előadás vége