Programozsi alapismeretek 6 elads Tartalom Rekordokstruktrk adatabsztrakci sszetett
Programozási alapismeretek 6. előadás
Tartalom Ø Rekordok/struktúrák – adatabsztrakció Ø Összetett ELTE típusok – kitekintés Ø Függvények – algoritmikus absztrakció 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 2/51
Rekordok/Struktúrák Feladat: Adjuk meg, hogy egy P síkbeli pont melyik síknegyedbe esik! Megoldás felé: ELTE 9/11/2021 ØA síkbeli pontokat x- és ykoordiná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. 3/51
Rekordok/Struktúrák Típusdefiníció Specifikáció: Ø Bemenet: ELTE 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ípusdefiníció: struct TPont{double x, y; } típusazonosító mezőtípus mezőazonosító(k) 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 4/51
Rekordok/Struktúrák Specifikáció: Ø Bemenet: ELTE 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ípusdeklaráció: adatazonosító. mezőazonosító TPont P; típusazonosító adatazonosító 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 5/51
Rekordok/Struktúrák Algoritmus: P. x 0 I I ELTE 9/11/2021 P. y 0 N I P. y 0 N N SN: =1 SN: =4 SN: =2 SN: =3 adatazonosító. mezőazonosító Szlávi-Zsakó: Programozási alapismeretek 6. 6/51
Rekordok/Struktúrák Algoritmus: P. x 0 I P. y 0 I ELTE N I P. y 0 N N SN: =1 SN: =4 SN: =2 SN: =3 adatazonosító. mezőazonosító C++ hivatkozás: if (P. x>=0){ if (P. y>=0) else }else{ if (P. y>=0) else } SN=1; SN=4; SN=2; SN=3; . adatazonosító mezőazonosító 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 7/51
Rekordok/Struktúrák A teljes C++ kód: Típusdefiníció ELTE Típusdeklarációk 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 8/51
Rekordok/Struktúrák A teljes C++ kód: ELTE Beolvasások 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 9/51
Rekordok/Struktúrák A teljes C++ kód: ELTE A lényeg 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. Kód jegyzetként 10/51
Összetett típusok ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 11/51
Függvények (irány) Feladat: ELTE 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) = 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 12/51
Függvények (irány) Értelmezés: A pontok irányát megadhatjuk az oda vezető egyenes és az x-tengely szögével. ELTE < tan( )<tan( )=P. y/P. x 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 13/51
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 ELTE Á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) = 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 14/51
Függvények (irány) Specifikáció: Ø Bemenet: ELTE Aktuális paraméterek Formális paraméterek Aktuális paraméterek 9/11/2021 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 Egész Irány(p, q): =sgn(p. y*q. x– q. y*p. x) Algoritmus: Ir: =Irány(P, Q) Szlávi-Zsakó: Programozási alapismeretek 6. 15/51
Függvények (irány) Ø Függvénydefiníció: Formális paraméterek a forgásirány meghatározására. Irány(p, q: TPont): Egész ELTE S: =p. y*q. x–q. y*p. x S<0 F: =– 1 S=0 F: =0 S>0 F: =1 Irány: =F 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 16/51
Függvények (irány) Ø C++ kódolás: int Ir=Irany(P, Q); ELTE 9/11/2021 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; else if (S==0) F=0; else if (S>0) F=1; return F; } Szlávi-Zsakó: Programozási alapismeretek 6. 17/51
Függvények (irány) Ø C++ kódolás – egésze: Típusdefiníció Függvényfejsordefiníciók Formális paraméterkonvenció: _azonosító (prototípusok) ELTE Főprogram 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 18/51
Függvények (irány) A lényegi finomítás Ø C++ kódolás – egésze: (=függvény) ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 19/51
Függvények (irány) A bemenet finomításai (=függvény) Ø C++ kódolás – egésze: ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 20/51
Függvények (irány) Ø C++ kódolás – egésze: A kimenet és kilépés finomításai (=függvény) ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. Kód jegyzetként 21/51
Függvények (irány) Ø Megjegyzés: a bemenet sokszor értékvisszaadás nélküli függ-vénnyel (eljárással) történik; az előbbi TPont Be. Pont(string _pont. Nev) pl. így: { TPont pont; //segéd pont. x=Be. Koordinata("Add meg "+_pont. Nev+ " x-koordinatajat!"); pont. y=Be. Koordinata("Add meg "+_pont. Nev+ " y-koordinatajat!"); return pont; ELTE Kimenti paraméter Bementi paraméter 9/11/2021 } void Be. Pont(string _pont. Nev, TPont &_pont) { _pont. x=Be. Koordinata("Add meg "+_pont. Nev+ " x-koordinatajat!"); _pont. y=Be. Koordinata("Add meg "+_pont. Nev+ " y-koordinatajat!"); return; } Szlávi-Zsakó: Programozási alapismeretek 6. 22/51
Függvények C++ tudnivalók – összefoglalás: ELTE Ø Függvényfej-definíció: fv. Típ fv. Azon(par. Típ form. Par. Azon, …); vagy void fv. Azon(par. Típ form. Par. Azon, …); A formális paraméterek elmaradhatnak, de a zárójelek nem! Ø Függvény-definíció: A fejsor, pontosvessző nélkül { … //fvtörzs return fvÉrték } void esetén fvÉrték nélküli return! 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 23/51
Függvények Pontosabban: nem tömb C++ tudnivalók – összefoglalás: Ø Formális o o ELTE skalár paraméter: bemeneti nincs speciális kulcs-szó (jel) kimeneti & a speciális prefix kulcs-szó (jel) Ø Aktuális skalár paraméter: ha a megfelelő formális paraméter o o bemeneti akár konstans, akár változó kimeneti csak változó lehet. 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 24/51
Függvények C++ tudnivalók – összefoglalás: Ø ELTE Input-paraméterek. 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 inthatással max(int az x, aktuális int y) paraméterre. Pl. : o Input-paraméterek. 9/11/2021 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 elérhetővé válik. Pl. : void max(int x, is int y, int &max_xy) Szlávi-Zsakó: Programozási alapismeretek 6. 25/51 In-/Output-paraméter. 25/51
Függvények C++ tudnivalók – összefoglalás: Ø Formális o o ELTE tömb paraméter: bemeneti const prefix kulcs-szó kimeneti nincs speciális kulcs-szó Ø Aktuális tömb paraméter: ha a megfelelő formális paraméter o o bemeneti akár konstans, akár változó kimeneti csak változó lehet. 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 26/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø ELTE Input-paraméterek. 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: Ellenőrzési céllal void ki_int_tomb(const int x[], int n, int max. N) vagy void ki_int_tomb(const int x[max. N], int n, int max. N) Ellenőrzési In-/ o Kimeneti (is) − példa a fejsorra: céllal Output-paraméterek. void be_int_tomb(const int x[], int &n, int max. N) vagy void be_int_tomb(const int x[max. N], int &n, int max. N) 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 27/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø ELTE Input-paraméterek. 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: Ellenőrzési céllal void ki_int_tomb(const int x[], int n, int max. N) vagy void ki_int_tomb(const int x[max. N], int n, int max. N) Ellenőrzési In-/ o Kimeneti (is) − példa a fejsorra: céllal Output-paraméterek. void be_int_tomb(int x[], int &n, int max. N) vagy void be_int_tomb(int x[max. N], int &n, int max. N) Megjegyzés: az 1. változat mátrixokra nem működik! 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 28/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. ELTE A legfőbb transzformáció a specifikáció Utófeltétel része alapján. 9/11/2021 A program makró-szerkezete 1 …függvényfej-definíciók… int main()//a főprogram { //bemenet: …bemeneti_adatok deklarációi… //kimenet: Aktuális …kimeneti_adatok deklarációi… paraméterek. //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… Szlávi-Zsakó: Programozási alapismeretek 6. 29/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. ELTE 9/11/2021 Ø A program makró-szerkezete 2 A program GLOBÁLIS //bemenet: adatai. …bemeneti_adatok deklarációi… //kimenet: …kimeneti_adatok deklarációi… …függvényfej-definíciók… int main()//a főprogram A paraméterezés { elhagyható. //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… Szlávi-Zsakó: Programozási alapismeretek 6. 30/51
Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Programparaméterek, a specifikáció Bemenet és Kimenet része alapján. ELTE 9/11/2021 Ø A program makró-szerkezete 2 A program GLOBÁLIS //bemenet: adatai. …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… 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): Ø Nyelvvizsgán a nyelvtani tesztek pontszámait (0. . max. P, max. P>0) ülési sorrendben jegyezték föl. Keressünk olyan vizsgázót, aki ugyanannyi pontot kapott, mint valamelyik szomszédja! ELTE Ø 9/11/2021 Feladat: Megoldás: Keresés tétel – egy pontszámsorozatból kell kikeresni olyan elemet, amely megegyezik a szomszédjával (pontosítsunk: a következővel). Hf: specifikálás + algoritmizálás Szlávi-Zsakó: Programozási alapismeretek 6. 32/51
Finomítások a C++ kódban Függvényfej-definíciók. C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 33/51
Finomítások a C++ kódban Adatbeolvasások, és a főprogram. C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 34/51
Paraméterbeolvasó eljárás definíciója. Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: ELTE max. N 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 35/51
A lényegi eljárás definíciója. (Keresés tétel!) Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: ELTE max. N 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 36/51
A keresés eredményét kiíró eljárás definíciója. Finomítások a C++ kódban C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 37/51
Finomítások a C++ kódban További eljárások definíciói. C++ tudnivalók – összefoglalás: Ø Egy teljesebb kódpélda: Kiválasztás + sorozatszámítás tétel „fúziója”. ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. Kód jegyzetként 38/51
Függvények (fordul) Feladat: ELTE Egy s (A B) szakaszhoz 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) 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 39/51
Függvények (fordul) Specifikáció: Ø Bemenet: ELTE 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: 9/11/2021 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. 40/51
Függvények (fordul) Ford: =Fordul(A, B, C) ØA megoldásban hívjuk az Irány függvényt! int Fordul(TPont a, TPont b, Fordul(a, b, c: TPont): Egész ELTE p. x: =b. x – a. x p. y: =b. y – a. y q. x: =c. x – a. x 9/11/2021 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 q. y=c. y – a. y; Fordul: =Irány(p, q) return Irany(p, q); } Szlávi-Zsakó: Programozási alapismeretek 6. 41/51
Függvények (rajta? ) Feladat: Döntsük el, hogy egy C pont rajta vane egy (A, B) szakaszon! ELTE 9/11/2021 Specifikáció: Ø Bemenet: A, B, C: TPont Ø Kimenet: Rajta. E: Logikai Ø Előfeltétel: – Ø Utófeltétel: Rajta. E=Rajta(A, B, C) Ø Definíció: Rajta(a, b, c, ): =… Szlávi-Zsakó: Programozási alapismeretek 6. 42/51
Függvények (rajta? ) Definíció: ELTE 9/11/2021 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. 43/51
Függvények (rajta? ) Rajta(a, b, c: TPont): Logikai ELTE Rajta: = Fordul(a, b, c)=0 és Közte(a. x, c. x, b. x) és Közte(a. y, c. y, b. y) Közte(r, s, t: TPont): Logikai Közte: =r s és s t vagy t s és s r 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 44/51
Függvények (metszi? ) Feladat: Döntsük el, hogy az (A, B) szakasz metszi-e a (C, D) szakaszt! Lehetséges esetek: ELTE 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 45/51
Függvények (metszi? ) Specifikáció: Ø Bemenet: ELTE A, B, C, D: TPont Ø Kimenet: Metszi. E: Logikai Ø Előfeltétel: – Metszi(A, B, C, D Ø Utófeltétel: Metszi. E= ) ( Fordul(A, B, C)*Fordul(A, B, D)<0 és 9/11/2021 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) ) Szlávi-Zsakó: Programozási alapismeretek 6. 46/51
Függvények (metszi? ) Algoritmus: Metszi(a, b, c, d: TPont): Logikai fabc: =Fordul(a, b, c) ELTE 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) 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 47/51
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! ELTE 9/11/2021 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. Szlávi-Zsakó: Programozási alapismeretek 6. 48/51
Függvények (háromszögben? ) Specifikáció: Ø Bemenet: ELTE A, B, C, D: TPont Ø Kimenet: Bent. E: Logikai Ø Előfeltétel: – Kissé „szabadon” értelmezve a „lánc Ø Utófeltétel: Bent. E=(Fordul(A, B, D)= -azonosságot”! =Fordul(B, C, D)=Fordul(C, A, D)) 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) 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 49/51
Függvények A (lényegi) függvények egymásra épülése – a programok makró-struktúrája: ELTE Metszi Háromszögben Fordul Irány Rajta Fordul Közte Irány 9/11/2021 Szlávi-Zsakó: Programozási alapismeretek 6. 50/51
Programozási alapismeretek 6. előadás vége
- Slides: 51