1 / 51

Programozási alapismeretek 6. előadás

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é:

mieko
Download Presentation

Programozási alapismeretek 6. előadás

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programozási alapismeretek 6. előadás

  2. Rekordok/struktúrák – adatabsztrakció Összetett típusok –kitekintés Függvények – algoritmikus absztrakció Tartalom Szlávi-Zsakó: Programozási alapismeretek 6.

  3. 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.

  4. 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.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 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.

  5. 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.x0 és P.y0  SN=1 ésP.x<0 és P.y0  SN=2 ésP.x<0 és P.y<0  SN=3 ésP.x0 é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.

  6. Rekordok/Struktúrák I N I N adatazonosító.mezőazonosító Algoritmus: I N Szlávi-Zsakó: Programozási alapismeretek 6.

  7. 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.

  8. Rekordok/Struktúrák A teljes C++ kód: Típusdefiníció Típusdeklarációk Szlávi-Zsakó: Programozási alapismeretek 6.

  9. Rekordok/Struktúrák A teljes C++ kód: Beolvasások Szlávi-Zsakó: Programozási alapismeretek 6.

  10. Rekordok/Struktúrák A teljes C++ kód: A lényeg Kódjegyzet-ként Szlávi-Zsakó: Programozási alapismeretek 6.

  11. Összetett típusok Szlávi-Zsakó: Programozási alapismeretek 6.

  12. 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.

  13. 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.

  14. 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.

  15. 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:TPontTPontEgész Irány(p,q):=sgn(p.y*q.x–q.y*p.x) Algoritmus:

  16. 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.

  17. 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:

  18. 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:

  19. 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:

  20. 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:

  21. 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:

  22. 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:

  23. 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ó:

  24. 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.

  25. 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.

  26. 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.

  27. 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.

  28. 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.

  29. 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.

  30. 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

  31. 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

  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! 2014.09.24. Szlávi-Zsakó: Programozási alapismeretek 6. 32/51

  33. 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.

  34. 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.

  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. 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!) 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. 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. Kiválasztás + sorozatszámítás tétel „fúziója”. Kód jegyzet-ként Szlávi-Zsakó: Programozási alapismeretek 6.

  39. Függvények(fordul) Szlávi-Zsakó: Programozási alapismeretek 6. 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)

  40. 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.

  41. 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!

  42. 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.

  43. 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.

  44. Függvények(rajta?) Szlávi-Zsakó: Programozási alapismeretek 6.

  45. 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:

  46. 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.

  47. Függvények(metszi?) Algoritmus: Szlávi-Zsakó: Programozási alapismeretek 6.

  48. 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 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.

  49. 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:

  50. 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.

More Related