amelyben új szereplő lép színre.
(Függöny föl!)
A látvány nem változik. A mondanivaló viszont terebélyesedik. Az előző felvonásban tárgyalt alapvető problémára keressük most is a választ, de nem elégedhetünk meg a válaszadás előbb követett udvariatlan módjával: ki kell írni válaszként azt, hogy ’igen’, ha X²+Y²=Z², különben pedig, hogy ’nem’.
A rendezői utasítássort módosítani kell! Próbáljunk kiindulni a már meglevő majdnem jó algoritmusból! Egészítsük ki úgy, hogy a többletfeladatot is figyelembe vesszük! Rá kell ébrednünk, ez nem történhet a korábbi szereplők segítségével, új szereplőt kell színpadra küldeni, akinek csupán az a dolga, hogy a többiek munkáját kiegészítve további információkat gyűjt a számításról, pontosabban szólva, az utoljára elvégzett művelet eredményéről. Így tőle tudakolható meg, hogy a szám, ami keletkezett pl. pozitív-e, negatív-e vagy nulla. (Ő – sajátos céljaihoz – külön kap egy saját noteszt, s ebbe jegyzetel folyamatosan, minden felszólítás nélkül). Az új szereplőnknek adjuk a következő, spanyolos hangzású nevet: El’ Dönti. Most már el tudjuk képzelni, miképpen oldhatjuk meg az X²+Y²-Z² előjelétől függően a különböző szöveg kiírását. Külön algoritmusrész tartozzon (az algoritmus 20. sora környékén) az egyik, illetve a másik szöveg kiírásához; valahogy így:
Fióksorszám | Fióktartalom |
---|---|
21: | ??? |
Ha az eredmény nulla, akkor
Fióksorszám | Fióktartalom |
---|---|
22: 23: 24: 25: 26: 27: 28: 29: 30: | Tégy az A noteszbe 'I' betűt Írd ki az adatot Tégy az A noteszbe 'G' betűt Írd ki az adatot Tégy az A noteszbe 'E' betűt Írd ki az adatot Tégy az A noteszbe 'N' betűt Írd ki az adatot Állj |
Ha az eredmény nem nulla, akkor
Fióksorszám | Fióktartalom |
---|---|
31: 32: 33: 34: 35: 36: 37: | Tégy az A noteszbe 'N' betűt Írd ki az adatot Tégy az A noteszbe 'E' betűt Írd ki az adatot Tégy az A noteszbe 'M' betűt Írd ki az adatot Állj |
Kérdés, kit utasítsunk és hogyan a két programrész közüli választásra? Mivel Lóti Futi az, aki a fiókokat húzogatja, nyilván neki kell címezni egy olyan utasítást, melyből tudni fogja, hogy nem a soron következő fióknál, hanem egy másiknál kell folytatnia. Legyen ez az ukáz a: Folytasd a ... fióknál! Illetve most nekünk egy feltételhez kötött párjára van szükségünk: Folytasd a ... fióknál, ha nem nulla! El’ Dönti jegyzetei alapján most is tudható, hogy a legutóbbi részeredmény pozitív-e, negatív-e vagy 0-e? Így válik értelmessé, elképzelhetővé az alábbi utasítás:
Fióksorszám | Fióktartalom |
---|---|
21: | Folytasd a 31. fióknál, ha nem nulla! |
Az Írd ki ... ukáz hatására most egy betű jelenik meg, amíg az előző felvonásban az a szám volt, amit az A notesz tartalmazott. Hogyan lehetséges ez? Megkülönböztethető betű és szám? Ez ellentmondana a korábban megfogalmazott szekrénytani (neumann-i) elveknek! Egyetlen lehetőségünk, hogy minden megjelenő jelnek – legyen az betű, számjegy, írás-, vagy műveleti jel – megfeleltetünk egy kódot, ezt küldjük az ablakon át a külvilágba. Ennek fényében viszont korábbi algoritmusunk kiíró utasítása helyére egy jóval bonyolultabb utasítás-sorozatot kellene illesztenünk, amely révén Lóti Futi képes lesz a számot átalakítani megfelelő számjegyek sorozatává. Ezt a visszamenőleges javítást hadd ne végezzük el pótlólag! És most következne a fenti algoritmus kódolása ..., de ezt jobb nem is említeni, hát még véghezvinni!
E nyúlfarknyira sikeredett felvonás szünetét most is a konklúziók megbeszélésére használjuk föl! Röviden a tanulságok:
Fogalom | Mesebeli megfelelő |
---|---|
elágazás utasítás | Folytasd ... , ha ... (vezérlésátadó utasítás), amely egy speciális regiszter, a feltétel regiszter (El’ Dönti saját notesze) segítségével valósítható meg. |
Utasítás | Megjegyzés |
---|---|
... elvégző ukázok, a következő megállapodással: az A regiszterbe teszi a feltétel logikai értékét, a 0=hamis, illetve 1=igaz konvencióval |
|
Egyenlő A 1-gyel | új ukáz: A=1? |
Folytasd OTT, ha nem nulla | az OTT a folytatás helyének ’címkéje’ |
... az igaz értékhez tartozó ukázok ... |
|
Folytasd TOVÁBB-nál | átugrás TOVÁBB-hoz, a hamis-ág utánra |
OTT: | a Folytasd OTT, ha... ukáz erre a pontra hivatkozik |
... a hamis értékhez tartozó ukázok ... |
|
TOVÁBB: |
|
a végrehajtás itt folytatódik akár igaz, akár hamis feltételérték esetén ... |
Utasítás | Megjegyzés |
---|---|
... |
|
CIKLUS: |
|
... a feltétel kiértékelését elvégző ukázok, a korábbi konvencióval ... |
|
Egyenlő A 1-gyel | A=1? |
Folytasd KILÉP-nél, ha nem nulla | KILÉP: a folytatás helyének címkéje |
... a ciklusmag ukázai ... |
|
Folytasd CIKLUS-nál | az ismétlődő rész vége, ugrás az elejére |
KILÉP: |
|
a végrehajtás itt folytatódik a ciklus után ... |
Elképzelhető lenne ettől lényegesen eltérő kódhozzárendelés is, uram bocsá’ az sem feltétel, hogy minden karakternek 1-bájtos kód feleljen meg. Gondoljunk csak a közismert Morse-ABC-re, vagy a nem annyira közismert, a fájltömörítéseknél használt Huffman-kódra!
1. Valósítsd meg az előző felvonás végén említett 'bootstrap' programot, pontosabban
Megoldás:
fióksorszám | programhossz | programkód |
Be: cím, hossz
Ciklus i=cím-től cím+hossz-ig
Be: adat
fiók(i):=adat
Ciklus vége
másként
Be: cím, hossz
Ciklus amíg hossz>0
Be: adat
fiók(cím):=adat
cím:=cím+1
hossz:=hossz-1
Ciklus vége
A megismert Lótis utasításkészlettel a betöltés (utóbbi változatának) programja a következő (most sem foglalkozunk a beolvasásnál a karakteresről a belső, bináris ábrázolásúra való konvertálással, továbbá itt is alkalmazzuk a még nem tisztázott gépi kódhoz közeli szimbolizmust):
Utasítás | Megjegyzés |
---|---|
Olvasd be az adatot Tedd el A-belit CÍM-re Olvasd be az adatot Tedd el A-belit HOSSZ-ra Tégy C-re '1'-t Tedd vissza CÍM-ről B-be Tedd vissza HOSSZ-ról D-be ÚJRA: Folytasd AMOTT, ha 0 Olvasd be az adatot Tedd el A-t (B-beli cím)-re Add B-belihez C-belit Vond ki D-beliből C-belit Folytasd ÚJRA-nál AMOTT: Tedd vissza CÍM-ről B-be Folytasd (B-beli cím)-en CÍM: '0' HOSSZ: '0' | betöltési cím . programhossz . C⇐1 B⇐a mozgó cím D⇐a csökkenő hossz . . . újdonság: indirekt címzés . . . indítsd el a programot B⇐az eredeti kezdőcím újdonság: indirekt címzés . virtuális kezdőérték . virtuális kezdőérték |
2. Tervezz programot, amely egy beolvasott szöveget tömöríti a következő elvek alapján, majd ebben a tömörebb formában írja vissza! Tömörítési elvek:
Tervezd meg a tömörítést megszüntető program algoritmusát is! Gondolj ki más tömörítési elveket is! (Egynek ötletéül a mindenki által ismert Morse-abc szolgálhat, amelyben az egyes jelek nem azonos hosszúságú kóddal rendelkeznek. Vajon miért éppen annyival, amennyivel? ...)
![]() ![]() |
![]() |
![]() |
A tananyag az ELTESCORM keretrendszerrel készült