Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozási alapismeretek 6. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 6.2/512014. 07. 12.2014. 07. 12.2014. 07. 12.  Rekordok/struktúrák.

Hasonló előadás


Az előadások a következő témára: "Programozási alapismeretek 6. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 6.2/512014. 07. 12.2014. 07. 12.2014. 07. 12.  Rekordok/struktúrák."— Előadás másolata:

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

2 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

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

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

5 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ó

6 ELTE Szlávi-Zsakó: Programozási alapismeretek 6.6/ P.x  0 P.y  0 P.yP.y0P.yP.y0 SN:=1SN:=4SN:=2SN:=3 P.x  0 P.y0P.y0P.y0P.y0 SN:=1SN:=4SN:=2SN:=3 Rekordok/Struktúrák Algoritmus: I N I N I N adatazonosító. mezőazonosító

7 ELTE Szlávi-Zsakó: Programozási alapismeretek 6.7/ Rekordok/Struktúrák P.x  0 P.y  0 P.yP.y0P.yP.y0 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

8 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

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

10 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

11 ELTE Szlávi-Zsakó: Programozási alapismeretek 6.11/ Összetett típusok

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

13 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(  )

14 ELTE Szlávi-Zsakó: Programozási alapismeretek 6.14/  <   tan(  )

15 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)

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

17 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)

18 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ó

19 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)

20 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)

21 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)

22 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

23 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

24 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

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

26 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

27 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

28 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

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

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

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

32 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!

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

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

35 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

36 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

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

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

39 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)

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

41 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)

42 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?)

43 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?)

44 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?)

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

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

47 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?)

48 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?)

49 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”!

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

51 Programozási alapismeretek 6. előadás vége


Letölteni ppt "Programozási alapismeretek 6. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 6.2/512014. 07. 12.2014. 07. 12.2014. 07. 12.  Rekordok/struktúrák."

Hasonló előadás


Google Hirdetések