View
48
Download
4
Category
Preview:
DESCRIPTION
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é: - PowerPoint PPT Presentation
Citation preview
Programozási alapismeretek
6. előadás
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
22/51/5123.04.21.23.04.21.
Rekordok/struktúrák – adatabsztrakció
Összetett típusok –kitekintés
Függvények – algoritmikus absztrakció
Tartalom
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
33/51/5123.04.21.23.04.21.
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).
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
44/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
Specifikáció: Bemenet: P:TPont,
TPont=Rekord(xx,yy: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
C++ típusdefiníció:struct TPont{double x,y;}
típusazonosító mezőtípus mezőazonosító(k)
Típusdefiníció
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
55/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
Specifikáció: Bemenet: PP:TPont,
TPont=Rekord(xx,,yy: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 PP..xx0 és PP..yy<0 SN=4
C++ típusdeklaráció:TPont P;
típusazonosító adatazonosító
adatazonosító.mezőazonosító
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
66/51/5123.04.21.23.04.21.
P.x0P.y0 PP..yy0
SN:=1
SN:=4
SN:=2
SN:=3
P.x0P.y0 P.y0
SN:=1
SN:=4
SN:=2
SN:=3
Rekordok/Struktúrák
Algoritmus:
I N
I N I N
adatazonosító.mezőazonosító
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
77/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
P.x0P.y0 PP..yy0
SN:=1
SN:=4
SN:=2
SN:=3
C++ hivatkozás:if (P.xx>=0){ if (P.yy>=0) SN=1; else SN=4;}else{ if (P.yy>=0) SN=2; else SN=3;}
Algoritmus:
adatazonosító.mezőazonosító
adatazonosító.mezőazonosító
I N
I N I N
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
88/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
A teljes C++ kód:
Típusdefiníció
Típusdeklarációk
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
99/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
A teljes C++ kód:
Beolvasások
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1010/51/5123.04.21.23.04.21.
Rekordok/Struktúrák
A teljes C++ kód:
A lényeg
Kód Kód jegyzet-jegyzet-
kéntként
Kód Kód jegyzet-jegyzet-
kéntként
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1111/51/5123.04.21.23.04.21.
Összetett típusok
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1212/51/5123.04.21.23.04.21.
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) =
anegy iránybha0, jobbraha1,balraha1,
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1313/51/5123.04.21.23.04.21.
É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
P
Q
P
P.y
P.x
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1414/51/5123.04.21.23.04.21.
< 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) =
anegy irányb P és Qha 0, jobbratöl -Pa Qha 1,balratöl -Pa Qha 1,
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1515/51/5123.04.21.23.04.21.
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észIrá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éterekAktuális paraméterek
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1616/51/5123.04.21.23.04.21.
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.xS<0 S=0 S>0
F:=–1
F:=0 F:=1
Irány:=F
Formális paraméterek
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1717/51/5123.04.21.23.04.21.
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; else if (S==0) F=0; else if (S>0) F=1; return F;}
int Ir=Irany(P,Q);
Függvények(irány)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1818/51/5123.04.21.23.04.21.
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ó
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
1919/51/5123.04.21.23.04.21.
C++ kódolás – egésze:
Függvények(irány)
A lényegi finomítás (=függvény)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2020/51/5123.04.21.23.04.21.
C++ kódolás – egésze:
Függvények(irány)
A bemenet finomításai (=függvény)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2121/51/5123.04.21.23.04.21.
C++ kódolás – egésze:
Függvények(irány)
Kód Kód jegyzet-jegyzet-
kéntként
Kód Kód jegyzet-jegyzet-
kéntként
A kimenet és kilépés
finomításai (=függvény)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2222/51/5123.04.21.23.04.21.
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
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2323/51/5123.04.21.23.04.21.
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örzsreturn fvÉrték
}void esetén fvÉrték nélküli return!
Függvények
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2424/51/5123.04.21.23.04.21.
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étero bemeneti akár konstans, akár
változóo kimeneti csak változó
lehet.
Függvények
Pontosabban: nem tömb
Pontosabban: nem tömb
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2525/51/5123.04.21.23.04.21.
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-Input-paraméterek.paraméterek.
Input-Input-paraméterek.paraméterek.
In-/Output-In-/Output-paraméter.paraméter.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2626/51/5123.04.21.23.04.21.
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étero bemeneti akár konstans, akár
változóo kimeneti csak változó
lehet.
Függvények
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2727/51/5123.04.21.23.04.21.
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-Input-paraméterek.paraméterek.
In-/In-/Output-Output-
paraméterek.paraméterek.
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2828/51/5123.04.21.23.04.21.
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-Input-paraméterek.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-/In-/Output-Output-
paraméterek.paraméterek.
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
Ellenőrzési Ellenőrzési céllalcéllal
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
2929/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
A program makró-szerkezete1…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);kiiró_függvény(kimeneti_adatok);return 0;
}…függvény-defíníciók…
ProgramparaméterProgramparaméterekek,,
a specifikáció a specifikáció Bemenet és Kimenet Bemenet és Kimenet
része alapján.része alapján.
A legfőbb A legfőbb transzformáció a transzformáció a
specifikáció specifikáció Utófeltétel része Utófeltétel része
alapján.alapján.
Aktuális Aktuális paramétereparamétere
kk..
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3030/51/5123.04.21.23.04.21.
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…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);kiiró_függvény(kimeneti_adatok);return 0;
}…függvény-defíníciók…
ProgramparaméterProgramparaméterekek,,
a specifikáció a specifikáció Bemenet és Kimenet Bemenet és Kimenet
része alapján.része alapján.
A A paraméterezparaméterez
ésés elhagyható.elhagyható.
A program A program GLOBÁLISGLOBÁLIS
adatai.adatai.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3131/51/5123.04.21.23.04.21.
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…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éterProgramparaméterekek,,
a specifikáció a specifikáció Bemenet és Kimenet Bemenet és Kimenet
része alapján.része alapján.
A program A program GLOBÁLISGLOBÁLIS
adatai.adatai.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3232/51/5123.04.21.23.04.21.
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!
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3333/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
Függvényfej-Függvényfej-definíciók.definíciók.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3434/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
AdatbeolvasásoAdatbeolvasások, és a k, és a
főprogram.főprogram.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3535/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
ParaméterbeolParaméterbeolvasó eljárás vasó eljárás definíciója.definíciója.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3636/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
A lényegi A lényegi eljárás eljárás
definíciója.definíciója.(Keresés tétel!)(Keresés tétel!)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3737/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
A keresés A keresés eredményét eredményét kiíró eljárás kiíró eljárás definíciója.definíciója.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3838/51/5123.04.21.23.04.21.
Finomítások a C++ kódban
C++ tudnivalók – összefoglalás:
Egy teljesebb kódpélda:
További További eljárások eljárások definíciói.definíciói.
Kód Kód jegyzet-jegyzet-
kéntként
Kód Kód jegyzet-jegyzet-
kéntként
Kiválasztás + Kiválasztás + sorozatszámítsorozatszámít
ás tétel ás tétel „fúziója”.„fúziója”.
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
3939/51/5123.04.21.23.04.21.
Feladat:Egy s (AB) sza-kaszhoz képest egy t (BC) szakasz mi-lyen irányban fordul?
BA
C
s
t
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)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4040/51/5123.04.21.23.04.21.
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)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4141/51/5123.04.21.23.04.21.
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)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4242/51/5123.04.21.23.04.21.
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,):=…
BA
C
Függvények(rajta?)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4343/51/5123.04.21.23.04.21.
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
BA
CFüggvények
(rajta?)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4444/51/5123.04.21.23.04.21.
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?)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4545/51/5123.04.21.23.04.21.
Függvények(metszi?)
Feladat:Döntsük el, hogy az (A,B) szakasz metszi-e a (C,D) szakaszt!Lehetséges esetek: B
A
C
DB
AC
D
BA
C
D
B
A
C
D
BA
C
D
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4646/51/5123.04.21.23.04.21.
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
vagy Rajta(A,B,C) vagy Rajta(A,B,D)
vagy Rajta(C,D,A) vagy Rajta(C,D,B) )
Függvények(metszi?)
BA
C
D
BA
C
D
BA
C
D
B
A
C
DBA
C
D
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4747/51/5123.04.21.23.04.21.
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)Metsz:=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?)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4848/51/5123.04.21.23.04.21.
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.
B
A
CD
Függvények(háromszögben?)
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
4949/51/5123.04.21.23.04.21.
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: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)
Függvények(háromszögben?)
Kissé Kissé „szabadon” „szabadon”
értelmezve a értelmezve a „lánc-„lánc-
azonosságot”!azonosságot”!
ELTEELTE
Szlávi-Zsakó: Programozási Szlávi-Zsakó: Programozási alapismeretek 6.alapismeretek 6.
5050/51/5123.04.21.23.04.21.
Függvények
Háromszögben
Fordul
Irány
Metszi
Fordul
Irány
Rajta
Fordul Közte
Irány
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
Recommended