Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
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
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
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
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.
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 ]
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]
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!
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
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.
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.
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.
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.
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.
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.
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!
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.
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
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!
Programozásmódszertan Folytonos ábrázolás (folytatás) Eljárás Verembe(Változó v:Verem, Konstans e:TElem): Ha teteje<MaxMélység akkor teteje:+1; ve(teteje):=e különben hiba:=Igaz Elágazás vége Eljárás vége. Eljárás Veremből(Változó v:Verem, e:TElem): Ha teteje>0 akkor e:=ve(teteje); teteje:-1 különben hiba:=Igaz Elágazás vége Eljárás vége.
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.
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.
Programozásmódszertan23 33 Alkalmazási példák Eljárás-orientált nyelvekEljárás-orientált nyelvek 3.2 RekurzióRekurzió
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.
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.
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
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
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)
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.
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.
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.
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.
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.
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,...
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”.)