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

Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék

Hasonló előadás


Az előadások a következő témára: "Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék"— Előadás másolata:

1 Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék

2  Programozásmódszertan2 Tartalomjegyzék 1 A verem algebrai specifikációja algebrai specifikációjaalgebrai specifikációja 1.1 Verem-műveletek Verem-műveletek 1.2 Verem-axiómák Verem-axiómákVerem-axiómák 2 A verem típuskonstrukció specifikációja típuskonstrukció specifikációjatípuskonstrukció specifikációja 2.1 A verem exportmodulja exportmodulja 2.2 A verem megvalósítási moduljai megvalósítási moduljaimegvalósítási moduljai 3 Alkalmazási példák példák 3.1 Eljárás-orientált nyelvek Eljárás-orientált nyelvekEljárás-orientált nyelvek 3.2 Rekurzió Rekurzió 4 Duplaverem Duplaverem

3  Programozásmódszertan3 11 A verem algebrai specifikációja 1.1 Verem-műveletek 1 Típus Verem(Elem): Asszociált műveletek: Üres: Verem Üres?(Verem): Logikai Tele?(Verem): Logikai Tető(Verem): Elem  {NemDef} Verembe(Verem,Elem): Verem  {NemDef} Veremből(Verem): (Verem  Elem)  {NemDef} VeremMélység(Verem): Egész

4  Programozásmódszertan Verem-axiómák 1.2 Axiómák: 1 o Az Üres verem üres. v=Üres  Üres?(v)  VeremMélység(v)=0 2 o Az a verem, amelyben legalább egy elem van, az nem üres; a verembe tétel során a veremmélysége eggyel nő.  Tele?(v)   Üres?(Verembe(v,e))  VeremMélység(Verembe(v,e))=VeremMélység(v)+1 3a o Az üres veremnek nincs legfelső eleme. Tető(Üres)=NemDef 3b o Az Üres veremből nem lehet kivenni elemet. Veremből(Üres)=NemDef 3c o A tele verembe nem lehet további elemet betenni. Tele?(v)  Verembe(v,e)=NemDef

5  Programozásmódszertan5 1.2 Verem-axiómák (folytatás) 4 o A verem legfelső eleme az utoljára betett elem.  Tele?(v)  Tető(Verembe(v,e))=e 5 o A veremből a legfelső elemet lehet kivenni (a többi nem változik).  Tele?(v)  Veremből(Verembe(v,e))=(v,e) Állítás: a Veremből művelet eggyel csökkenti a verem mélységét.  Tele?(v)  VeremMélység(Veremből(v).Verem))= VeremMélység(v)-1 Biz.: 2 o & 5 o -ből következik.

6  Programozásmódszertan6 22 A verem típuskonstrukció specifikációja 2.1 A verem exportmodulja 2 ExportModul Verem(Típus TElem): Eljárás Üres(Változó v:Verem) [Ef:  v Uf:  v  v=( )] Eljárás Üres(Változó v:Verem) [Ef:  v Uf:  v  v=( )] Függvény Üres?(Konstans v:Verem): Logikai [Ef:  v Uf: v=(v 1,…,v N )  Üres?(v)=N=0] Függvény Üres?(Konstans v:Verem): Logikai [Ef:  v Uf: v=(v 1,…,v N )  Üres?(v)=N=0] Függvény Tele?(Konstans v:Verem): Logikai [Ef:  v Uf: ???] Függvény Tele?(Konstans v:Verem): Logikai [Ef:  v Uf: ???] Függvény Tető(Változó v:Verem): TElem [Ef:  v Uf: v=(v 1,…,v N )  Tető(v)=v N ] Függvény Tető(Változó v:Verem): TElem [Ef:  v Uf: v=(v 1,…,v N )  Tető(v)=v N ]

7  Programozásmódszertan7 2.1 A verem exportmodulja (folytatás) Eljárás Verembe(Változó v:Verem, Konstans e:TElem) [Ef:  v Uf: v=(v 1,…,v N )  Verembe(v,e)=(v 1,…,v N,e)] Eljárás Verembe(Változó v:Verem, Konstans e:TElem) [Ef:  v Uf: v=(v 1,…,v N )  Verembe(v,e)=(v 1,…,v N,e)] Eljárás Veremből(Változó v:Verem, e:TElem ) [Ef:  v  v=(v 1,…,v N )  N>0 Uf: Veremből(v)=(v’,e)  v’=(v 1,…,v N-1 )  e=v N ] Eljárás Veremből(Változó v:Verem, e:TElem ) [Ef:  v  v=(v 1,…,v N )  N>0 Uf: Veremből(v)=(v’,e)  v’=(v 1,…,v N-1 )  e=v N ] Függvény VeremMélység(Konstans v:Verem): Egész [Ef:  v Uf: v=(v 1,…,v N )  VeremMélység(v)=N] Függvény VeremMélység(Konstans v:Verem): Egész [Ef:  v Uf: v=(v 1,…,v N )  VeremMélység(v)=N]

8  Programozásmódszertan8 2.1 A verem exportmodulja (folytatás) Infix Operátor Azonos?(Konstans v1,v2:Verem):Logikai Másnéven v1=v2 Infix Operátor Azonos?(Konstans v1,v2:Verem):Logikai Másnéven v1=v2Azonos?(Azonos?( Infix Operátor LegyenEgyenlő(Változó v1:Verem, Konstans v2:Verem) Másnéven v1:=v2 Infix Operátor LegyenEgyenlő(Változó v1:Verem, Konstans v2:Verem) Másnéven v1:=v2LegyenEgyenlő Operátor Kiírás(Konstans v:Verem) Másnéven Ki: v Operátor Kiírás(Konstans v:Verem) Másnéven Ki: vKiírás Operátor Beolvasás(Változó v:Verem) Másnéven Be: v Operátor Beolvasás(Változó v:Verem) Másnéven Be: v Függvény Hibás?(Változó v:Verem): Logikai Függvény Hibás?(Változó v:Verem): LogikaiVáltozó Modul vége. Meg kell gondolni az operátorok ef/uf-ét az axiómák alapján!

9  Programozásmódszertan9 22 A verem típuskonstrukció specifikációja 2.2. A verem megvalósítási moduljai Láncolt ábrázolás moduljai 2moduljai Modul Verem(Típus TElem): Reprezentáció Típus Verem Elem=Rekord(érték: TElem alatta: VeremElem'Mutató) Változó t eteje: VeremElem'Mutató mélység: Egész hiba: Logikai

10  Programozásmódszertan Láncolt ábrázolás (folytatás) Implementáció Eljárás Üres(Változó v:Verem): [Ef: – l. az inicializáló részt Uf: teteje=Sehova  mélység=0  hiba=Hamis] teteje:=Sehova; mélység:=0; hiba:=Hamis Eljárás vége. Függvény Üres?(Konstans v:Verem): Logikai [Ef: – Uf: Üres?=teteje=Sehova] Üres?:=teteje=Sehova Függvény vége.

11  Programozásmódszertan Láncolt ábrázolás (folytatás) Függvény Tele?(Konstans v:Verem): Logikai [Ef: – Uf: ??? ] Változó sv: VeremElem'Mutató Lefoglal(sv) Ha sv=Sehova akkor Tele?:=Igaz különben Tele?:=Hamis; Felszabadít(sv) Elágazás vége sv: VeremElem'Mutató Lefoglal(sv) Ha sv=Sehova akkor Tele?:=Igaz különben Tele?:=Hamis; Felszabadít(sv) Elágazás vége Lefoglal Függvény vége.

12  Programozásmódszertan Láncolt ábrázolás (folytatás) Függvény Tető(Változó v:Verem): TElem [Ef: teteje  Sehova Uf: Tető(v)=VeremElem(teteje).érték] Ha teteje  Sehova akkor Tető:=VeremElem(teteje).érték különben hiba:=Igaz Elágazás vége VeremElem(teteje) Függvény vége.

13  Programozásmódszertan Láncolt ábrázolás (folytatás) Eljárás Verembe(Változó v:Verem, Konstans e:TElem): [Ef:  új:VeremElem Uf: új=(e,teteje)  teteje’=új  mélység’=mélység+1] Változó új: VeremElem'Mutató új: VeremElem'Mutató Lefoglal(új) Ha új  Sehova akkor VeremElem(új):=VeremElem(e,teteje) teteje:=új; mélység:+1 különben hiba:=Igaz Elágazás vége Lefoglal(új) Ha új  Sehova akkor VeremElem(új):=VeremElem(e,teteje) teteje:=új; mélység:+1 különben hiba:=Igaz Elágazás végeVeremElem(új) Eljárás vége.

14  Programozásmódszertan Láncolt ábrázolás (folytatás) Eljárás Veremből(Változó v:Verem, e:TElem): [Ef: teteje  Sehova Uf: e=VeremElem(teteje).érték  teteje’=VeremElem(teteje).alatta  mélység’=mélység-1] Változó újteteje: VeremElem'Mutató Ha teteje  Sehova akkor e:=VeremElem(teteje).érték újteteje:=VeremElem(teteje).alatta Felszabadít(teteje); teteje:=újteteje; mélység:-1 különben hiba:=Igaz Elágazás vége Eljárás vége.

15  Programozásmódszertan Láncolt ábrázolás (folytatás) Függvény VeremMélység(Konstans v:Verem): Egész [Ef: – Uf: VeremMélység(v)=mélység] VeremMélység:=mélység Függvény vége. Függvény Hibás?(Változó v:Verem): Logikai [Ef: – Uf: Hibás(v)=hiba  hiba’=Hamis] Hibás?:=hiba; hiba:=Hamis Függvény vége.

16  Programozásmódszertan Láncolt ábrázolás (folytatás) Infix Operátor Azonos?(Konstans v1,v2:Verem):Logikai Másnéven v1=v2 ??? Operátor vége. Infix Operátor Azonos?(Konstans v1,v2:Verem):Logikai Másnéven v1=v2 ??? Operátor vége.??? Infix Operátor LegyenEgyenlő(Változó v1:Verem, Konstans v2:Verem) Másnéven v1:=v2 ??? Operátor vége. ??? Operátor Kiírás(Konstans v:Verem) Másnéven Ki: v ??? Operátor vége. Operátor Kiírás(Konstans v:Verem) Másnéven Ki: v ??? Operátor vége.??? Operátor Beolvasás(Változó v:Verem) Másnéven Be: v ??? Operátor vége. Operátor Beolvasás(Változó v:Verem) Másnéven Be: v ??? Operátor vége.??? Meg kell gondolni az műveletek ef/uf-ét az exportmodul alapján!

17  Programozásmódszertan Láncolt ábrázolás (folytatás) Inicializálás Inicializálás Inicializálás teteje:=Sehova; mélység:=0; hiba:=Hamis Modul vége.

18  Programozásmódszertan18 22 A verem típuskonstrukció specifikációja 2.2. A verem meglósítási moduljai Folytonos ábrázolás 2 Modul Verem(Típus TElem): Reprezentáció Konstans MaxMélység: Egész(???) Típus VeremElemek=Tömb(1..MaxMélység: TElem) Változó v e: VeremElemek teteje: 0..MaxMélység [teteje  mélység] hiba: Logikai

19  Programozásmódszertan Folytonos ábrázolás (folytatás) Eljárás Üres(Változó v:Verem): teteje:=0; hiba:=Hamis Eljárás vége. teteje:=0 Függvény Üres?(Konstans v:Verem): Logikai Üres?:=teteje=0 Függvény vége. Függvény Tele?(Konstans v:Verem): Logikai Tele?:=teteje=MaxMélység Függvény vége. Függvény Tető(Változó v:Verem): TElem Ha teteje  0 akkor Tető:=ve(teteje) különben hiba:=Igaz Függvény vége. Meg kell gondolni a műveletek ef/uf-ét az exportmodul alapján!

20  Programozásmódszertan Folytonos ábrázolás (folytatás) Eljárás Verembe(Változó v:Verem, Konstans e:TElem): Ha teteje0 akkor e:=ve(teteje); teteje:-1 különben hiba:=Igaz Elágazás vége Eljárás vége.

21  Programozásmódszertan Folytonos ábrázolás (folytatás) Függvény VeremMélység(Konstans v:Verem): Egész VeremMélység:=teteje Függvény vége. Függvény Hibás?(Változó v:Verem): Logikai Hibás?:=hiba; hiba:=Hamis Függvény vége. Infix Operátor Azonos?(Konstans v1, v2:Verem):Logikai Másnéven v1=v2... Operátor vége. Infix Operátor Azonos?(Konstans v1, v2:Verem):Logikai Másnéven v1=v2... Operátor vége. Infix Operátor LegyenEgyenlő(Változó v1:Verem, Konstans v2:Verem) Másnéven v1:=v2... Operátor vége.

22  Programozásmódszertan Folytonos ábrázolás (folytatás) Operátor Kiírás(Konstans v:Verem) Másnéven Ki: v … Operátor vége. Operátor Kiírás(Konstans v:Verem) Másnéven Ki: v … Operátor vége. Operátor Beolvasás(Változó v:Verem) Másnéven Be: v … Operátor vége. Másnéven Be: v … Operátor vége.Inicializálás teteje:=0; hiba:=Hamis Modul vége.

23  Programozásmódszertan23 33 Alkalmazási példák Eljárás-orientált nyelvekEljárás-orientált nyelvek 3.2 RekurzióRekurzió

24  Programozásmódszertan Eljárás-orientált nyelvek 3.1 Hatáskör megvalósítása Program...; Var i,j: Integer; k: Real; Var i,j: Integer; k: Real; Procedure P1(...); Procedure P1(...); Var i: Real; k: Boolean; Var i: Real; k: Boolean; Procedure P11(...); Procedure P11(...); Var j: Boolean; Var j: Boolean; Begin {P11}(k=P1.k : Boolean) Begin {P11}(k=P1.k : Boolean)... P11 törzse... j=P11.j : Boolean... P11 törzse... j=P11.j : Boolean End; {P11}(i=P1.i : Real) End; {P11}(i=P1.i : Real) Begin {P1} k=P1.k : Boolean Begin {P1} k=P1.k : Boolean... P1 törzse...(j=Prog.j: Integer)... P1 törzse...(j=Prog.j: Integer) End; {P1} i=P1.i : Real End; {P1} i=P1.i : Real Begin {Program} k=Prog.k: Real... Program-törzs... j=Prog.j: Integer... Program-törzs... j=Prog.j: Integer End. i=Prog.i: Integer Színekkel jelöltük, hogy melyik szinthez tartozik. A zárójelben levők valójában nincsenek a veremben.

25  Programozásmódszertan Eljárás-orientált nyelvek (folytatás) 3.1 Eljárás/függvény-hívás megszervezése a paraméter- (és lokális adat-) ésa paraméter- (és lokális adat-) és a visszatérési veremmel.a visszatérési veremmel.

26  Programozásmódszertan Rekurzió 3.2 Eljárás e(Változó x: TX, Konstans y: TY): Ha p(x,y) akkor x:=f(x,y) különben e(x,g(x,y)) Eljárás vége. Veremállapot a hívások után ( fejtetőre állítva ): e(a,b):  p(a,b)  e(a,g(a,b))  p(a,g(a,b))  e(a,g(a,g(a,b))) p(a,g(a,g(a,b)))  a:=f(a,g(a,g(a,b))) y= b x= a-cím y= g(a,b) x= a-cím y= g(a,g(a,b)) x= a-cím y= g(a,g(a,g(a,b))) x= a-cím a:=?a:=? f( x, y ) kiszámolása

27  Programozásmódszertan Rekurzió 3.2 Eljárás e(Változó x: TX, Konstans y: TY): Ha p(x,y) akkor x:=f(x,y) különben e(x,g(x,y)) Eljárás vége. Veremállapot a hívások után ( fejtetőre állítva ): e(a,b):  p(a,b)  e(a,g(a,b))  p(a,g(a,b))  e(a,g(a,g(a,b))) p(a,g(a,g(a,b)))  a:=f(a,g(a,g(a,b))) y= b x= a-cím y= g(a,b) x= a-cím y= g(a,g(a,b)) x= a-cím y= g(a,g(a,g(a,b))) x= a-cím a:=f(a,g(a,g(a,b))) f( x, y )kiszámolása

28  Programozásmódszertan28 44 Duplaverem 4 Csak folytonos ábrázolás esetén alkalmazandó ez a típus. ExportModul DuplaVerem(Típus TElem, Konstans ÖsszMéret:Egész): Eljárás Üres(Változó v:DuplaVerem) Eljárás Üres(Változó v:DuplaVerem) Függvény BalÜres?(Konstans v:DuplaVerem): Logikai Függvény BalÜres?(Konstans v:DuplaVerem): Logikai Függvény JobbÜres?(Konstans v:DuplaVerem): Logikai Függvény JobbÜres?(Konstans v:DuplaVerem): Logikai Függvény Tele?(Konstans v:DuplaVerem): Logikai Függvény Tele?(Konstans v:DuplaVerem): Logikai Függvény BalTető(Változó v:DuplaVerem): TElem Függvény BalTető(Változó v:DuplaVerem): TElem Függvény JobbTető(Változó v:DuplaVerem): TElem Függvény JobbTető(Változó v:DuplaVerem): TElem Eljárás BalVerembe(Változó v:DuplaVerem, Konstans e:TElem) Eljárás BalVerembe(Változó v:DuplaVerem, Konstans e:TElem) Eljárás JobbVerembe(Változó v:DuplaVerem, Konstans e:TElem) Eljárás JobbVerembe(Változó v:DuplaVerem, Konstans e:TElem)

29  Programozásmódszertan29 44 Duplaverem (folytatás) 4 Függvény BalVeremMélység(Konstans v:DuplaVerem): Egész Függvény BalVeremMélység(Konstans v:DuplaVerem): Egész Függvény JobbVeremMélység(Konstans v:DuplaVerem): Egész Függvény JobbVeremMélység(Konstans v:DuplaVerem): Egész Eljárás BalVeremből(Változó v:DuplaVerem,e:ElemÉrték) Eljárás BalVeremből(Változó v:DuplaVerem,e:ElemÉrték) Eljárás JobbVeremből(Változó v:DuplaVerem, e:ElemÉrték) Eljárás JobbVeremből(Változó v:DuplaVerem, e:ElemÉrték) Infix Operátor Azonos?(Konstans v1,v2:DuplaVerem): Logikai Másnéven v1=v2 Infix Operátor Azonos?(Konstans v1,v2:DuplaVerem): Logikai Másnéven v1=v2 Infix Operátor LegyenEgyenlő(Változó v1:DuplaVerem, Konstans v2:DuplaVerem) Másnéven v1:=v2 Infix Operátor LegyenEgyenlő(Változó v1:DuplaVerem, Konstans v2:DuplaVerem) Másnéven v1:=v2 Függvény Hibás?(Változó v:DuplaVerem): Logikai Függvény Hibás?(Változó v:DuplaVerem): Logikai Modul vége.

30  Programozásmódszertan30 Megjegyzés -- Változó A „Változó”-ság oka: valamilyen hiba lehetősége fönnáll (üres vagy tele a verem), s ennek visszajelzésére a „hi- ba” mező változhat.

31  Programozásmódszertan31 Megjegyzés -- Tele? Ez a furcsaság azt fejezi ki, hogy a memória akkor is elfogyhat, amikor az adott verem első elemét igyekeznénk beletenni. Ez a furcsaság azt fejezi ki, hogy a memória akkor is elfogyhat, amikor az adott verem első elemét igyekeznénk beletenni.

32  Programozásmódszertan32 Megjegyzés -- Azonosság? „v1=v2” értelmezési lehetőségek: –„tökéletesen” azonos állapot, azaz v1.teteje=v2.teteje… vagy kicsit általánosabban fogalmazva: v1-cím=v2-cím… (értékmegosztás esetén  azonos elemek) –„lényegi” azonosság, azaz azonos számú és értékű elemek.

33  Programozásmódszertan33 Megjegyzés -- Értékadás „v1:=v2” értelmezési lehetőségek: –„tökéletesen” azonos állapot létrehozása, azaz v1.teteje:=v2.eleje… vagy kicsit általánosabban fogalmazva: v1-cím:=v2-cím… (értékmegosztás esetén  azonos elemek) –értékmásolás, azaz v1 minden elemének v2-másolatelem létrehozása.

34  Programozásmódszertan34 Megjegyzés -- „Valami” paraméter A Valami lehet tömb, lehet szekvenciális file egy blokkja, lehet egyéb külső perifériáról behozott adatcsomag,...

35  Programozásmódszertan35 Megjegyzés -- Be/Ki műveletek A Be/Ki műveleteket azért valósítjuk meg asszociált műveletként, mert --bár nem nél- külözhetetlen, de-- meglehetősen körülmé- nyesen lehetne a „felső szintű” operációkkal megvalósítani. (Ui. a Veremből művelet egyben „destruktív” operáció is, tehát a vég- rehajtás közepette a struktúra „föl is számo- lódna”.)


Letölteni ppt "Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék"

Hasonló előadás


Google Hirdetések