510 likes | 599 Views
Programozási alapismeretek 6. előadás. Rekordok/struktúrák – adatabsztrakció Összetett típusok – kitekintés Függvények – algoritmikus absztrakció. Tartalom. Rekordok/Struktúrák. Feladat: Adjuk meg, hogy egy P síkbeli pont melyik síknegyedbe esik! Megoldás felé:
E N D
Rekordok/struktúrák – adatabsztrakció Összetett típusok –kitekintés Függvények – algoritmikus absztrakció Tartalom Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák Feladat: Adjuk meg, hogy egy P síkbeli pont melyik síknegyedbeesik! 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). Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák Specifikáció: Bemenet: P:TPont, TPont=Rekord(x,y:Valós) Kimenet: SN:Egész Előfeltétel: – Utófeltétel: P.x0 és P.y0 SN=1 és P.x<0 és P.y0 SN=2 és P.x<0 és P.y<0 SN=3 és P.x0 és P.y<0 SN=4 Típusdefiníció C++ típusdefiníció: structTPont{doublex,y;} típusazonosítómezőtípusmezőazonosító(k) Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák Specifikáció: Bemenet: P:TPont, TPont=Rekord(x,y:Valós) Kimenet: SN:Egész Előfeltétel: – Utófeltétel: P.x0 és P.y0 SN=1 ésP.x<0 és P.y0 SN=2 ésP.x<0 és P.y<0 SN=3 ésP.x0 és P.y<0 SN=4 C++ típusdeklaráció: TPontP; típusazonosítóadatazonosító adatazonosító.mezőazonosító Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák I N I N adatazonosító.mezőazonosító Algoritmus: I N Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák I N I N adatazonosító.mezőazonosító adatazonosító.mezőazonosító Algoritmus: I N C++ hivatkozás: if (P.x>=0){if (P.y>=0) SN=1;else SN=4;}else{if (P.y>=0) SN=2;else SN=3;} Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák A teljes C++ kód: Típusdefiníció Típusdeklarációk Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák A teljes C++ kód: Beolvasások Szlávi-Zsakó: Programozási alapismeretek 6.
Rekordok/Struktúrák A teljes C++ kód: A lényeg Kódjegyzet-ként Szlávi-Zsakó: Programozási alapismeretek 6.
Összetett típusok Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(irány) 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) = Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(irány) É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 Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(irány) < 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) = Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(irány) Aktuális paraméterek Formális paraméterek Aktuális paraméterek Szlávi-Zsakó: Programozási alapismeretek 6. 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:TPontTPontEgész Irány(p,q):=sgn(p.y*q.x–q.y*p.x) Algoritmus:
Függvények(irány) Formális paraméterek Szlávi-Zsakó: Programozási alapismeretek 6. Függvénydefiníció:a forgásirány meghatározására.
Függvények(irány) int Ir=Irany(P,Q); intIrany(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;elseif (S==0) F=0;elseif (S>0) F=1;return F;} Szlávi-Zsakó: Programozási alapismeretek 6. C++ kódolás:
Függvények(irány) Típusdefiníció Formális paraméter-konvenció: _azonosító Függvényfejsor-definíciók (prototípusok) Főprogram Szlávi-Zsakó: Programozási alapismeretek 6. C++ kódolás – egésze:
Függvények(irány) A lényegi finomítás (=függvény) Szlávi-Zsakó: Programozási alapismeretek 6. C++ kódolás – egésze:
Függvények(irány) A bemenet finomításai (=függvény) Szlávi-Zsakó: Programozási alapismeretek 6. C++ kódolás – egésze:
Függvények(irány) A kimenet és kilépés finomításai (=függvény) Kódjegyzet-ként Szlávi-Zsakó: Programozási alapismeretek 6. C++ kódolás – egésze:
Függvények(irány) 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; } Kimenti paraméter Bementi paraméter void BePont(string_pontNev, TPont &_pont) { _pont.x=BeKoordinata("Add meg "+_pontNev+ " x-koordinatajat!"); _pont.y=BeKoordinata("Add meg "+_pontNev+ " y-koordinatajat!"); return; } Szlávi-Zsakó: Programozási alapismeretek 6. 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 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énfvÉrték nélkülireturn! Szlávi-Zsakó: Programozási alapismeretek 6. C++ tudnivalók – összefoglalás: Függvényfej-definíció: Függvény-definíció:
Függvények Pontosabban: nem tömb Pontosabban: nem tömb Szlávi-Zsakó: Programozási alapismeretek 6. C++ tudnivalók – összefoglalás: • Formálisskalár paraméter: • bemeneti nincs speciális kulcs-szó (jel) • kimeneti & a speciális prefix kulcs-szó (jel) • Aktuálisskalár paraméter: ha a megfelelő formális paraméter • bemeneti akár konstans, akár változó • kimeneti csak változó lehet.
Függvények C++ tudnivalók – összefoglalás: Skalár paraméterátadás: É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.: 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.: Input-paraméterek. intmax(int x, int y) Input-paraméterek. voidmax(int x, int y, int &max_xy) In-/Output-paraméter. Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények C++ tudnivalók – összefoglalás: • Formálistömb paraméter: • bemeneti const prefix kulcs-szó • kimeneti nincs speciális kulcs-szó • Aktuálistömb paraméter: ha a megfelelő formális paraméter • bemeneti akár konstans, akár változó • kimeneti csak változó lehet. Szlávi-Zsakó: Programozási alapismeretek 6.
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Tömb paraméterátadás: Alapelv: a tömbök mindig hivatkozás szerint adódnak át! Bemeneti −példa a fejsorra: Kimeneti (is) −példa a fejsorra: Ellenőrzési céllal Ellenőrzési céllal Input-paraméterek. voidki_int_tomb(const int x[], int n, int maxN) vagy voidki_int_tomb(const int x[maxN], int n, int maxN) Ellenőrzési céllal Ellenőrzési céllal In-/Output-paraméterek. void be_int_tomb(constint x[], int&n, int maxN) vagy void be_int_tomb(constint x[maxN],int&n, int maxN) Szlávi-Zsakó: Programozási alapismeretek 6.
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Tömb paraméterátadás: Alapelv: a tömbök mindig hivatkozás szerint adódnak át! Bemeneti −példa a fejsorra: Kimeneti (is) −példa a fejsorra: Megjegyzés: az 1. változat mátrixokra nem működik! Ellenőrzési céllal Ellenőrzési céllal Input-paraméterek. voidki_int_tomb(const int x[], int n, int maxN) vagy void ki_int_tomb(const int x[maxN], int n, int maxN) Ellenőrzési céllal Ellenőrzési céllal In-/Output-paraméterek. void be_int_tomb(int x[], int&n, int maxN) vagy void be_int_tomb(int x[maxN],int&n, int maxN) Szlávi-Zsakó: Programozási alapismeretek 6.
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete1 …függvényfej-definíciók… intmain()//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); kiiró_függvény(kimeneti_adatok); return 0; } …függvény-defíníciók… Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. Aktuális paraméterek. A legfőbb transzformáció a specifikáció Utófeltétel része alapján. Szlávi-Zsakó: Programozási alapismeretek 6.
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete2 //bemenet: …bemeneti_adatok deklarációi… //kimenet: …kimeneti_adatok deklarációi… …függvényfej-definíciók… intmain()//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); kiiró_függvény(kimeneti_adatok); return 0; } …függvény-defíníciók… A program GLOBÁLIS adatai. Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. A paraméterezés elhagyható. 2014.09.24. Szlávi-Zsakó: Programozási alapismeretek 6. 30/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: A program makró-szerkezete2 //bemenet: …bemeneti_adatok deklarációi… //kimenet: …kimeneti_adatok deklarációi… …függvényfej-definíciók… intmain()//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… A program GLOBÁLIS adatai. Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. 2014.09.24. Szlávi-Zsakó: Programozási alapismeretek 6. 31/51
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! 2014.09.24. Szlávi-Zsakó: Programozási alapismeretek 6. 32/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: Függvényfej-definíciók. Szlávi-Zsakó: Programozási alapismeretek 6.
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Egy teljesebb kódpélda: Adatbeolvasások, és a főprogram. Szlávi-Zsakó: Programozási alapismeretek 6.
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. Szlávi-Zsakó: Programozási alapismeretek 6.
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!) Szlávi-Zsakó: Programozási alapismeretek 6.
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. Szlávi-Zsakó: Programozási alapismeretek 6.
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. Kiválasztás + sorozatszámítás tétel „fúziója”. Kód jegyzet-ként Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(fordul) Szlávi-Zsakó: Programozási alapismeretek 6. Feladat: Egy s (AB) sza-kaszhoz képest egy t (BC) 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)
Függvények(fordul) 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? Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(fordul) 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; returnIrany(p,q);} Szlávi-Zsakó: Programozási alapismeretek 6. A megoldásban hívjuk az Irány függvényt!
Függvények(rajta?) Feladat: Döntsük el, hogy egy C pont rajta van-e egy (A,B) szakaszon! Specifikáció: Bemenet: A,B,C:TPont Kimenet: Rajt:Logikai Előfeltétel: – Utófeltétel: Rajt=Rajta(A,B,C) Definíció: Rajta(a,b,c,):=… Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(rajta?) 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 Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(rajta?) Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(metszi?) Szlávi-Zsakó: Programozási alapismeretek 6. Feladat: Döntsük el, hogy az (A,B) szakasz metszi-e a (C,D) szakaszt! Lehetséges esetek:
Függvények(metszi?) Specifikáció: Bemenet: A,B,C,D:TPont Kimenet: Metsz:Logikai Előfeltétel: – Utófeltétel: Metsz= ( Fordul(A,B,C)*Fordul(A,B,D)<0 és Fordul(C,D,A)*Fordul(C,D,B)<0 vagyRajta(A,B,C) vagy Rajta(A,B,D) vagy Rajta(C,D,A) vagy Rajta(C,D,B) ) Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(metszi?) Algoritmus: Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(háromszögben?) 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 ABCA sorrendben körbejárva a D pont vagy min-dig balra, vagy mindig jobbra van. Szlávi-Zsakó: Programozási alapismeretek 6.
Függvények(háromszögben?) Kissé „szabadon” értelmezve a „lánc-azonosságot”! Szlávi-Zsakó: Programozási alapismeretek 6. Specifikáció: Bemenet: A,B,C,D:TPont Kimenet: Bel:Logikai Előfeltétel: – Utófeltétel: Bel=(Fordul(A,B,D)==Fordul(B,C,D)=Fordul(C,A,D)) Algoritmus:
Függvények A (lényegi) függvények egymásra épü-lése – a programok makró-struktúrája: Szlávi-Zsakó: Programozási alapismeretek 6.