Pinkert László Commodore 64
1:29 Köszöntöm nézőinket. Ígéretünknek megfelelően ma először megoldjuk a múlt heti házi feladatot. A házi feladat az volt, hogy módosítsuk a szalagnaptárt, első részt úgy, hogy ne csak harminc, hanem tetszés szerint huszonnyolc, huszonkilenc vagy harmincegy napos hónap naptárlistáját is el tudja készíteni. A módosítás két részből fog állni. Egyrészt a harmincas helyébe egy változót írunk, ez most H lesz, másrészt beírjuk 1. sorba, hogy a program kérdezze meg, hány napos hónapról van szó. Tehát kiírja: „hány napos a hónap?”, erre mi begépeljük mondjuk azt, hogy 28, ezek után a FOR–NEXT ciklusban a K értéke már csak 1-től H-ig, vagyis 28-ig fog változni.
A második feladat az volt, hogy tegyünk olyan módosítást, hogy ne csak a hétfővel kezdődő hónapok listáját tudja elkészíteni, hanem szintén a futás elején kérdezze meg, hogy a hét hányadik napjára esik elseje. Itt tulajdonképpen arról van szó, hogy az I változót, amellyel a hét napjait számoltuk, nem 1-ről kell indítani, hanem egy tetszés szerinti értékről, melyet a program megkérdez. Ezért az 5-ös sort javítom ki.
Ezek után nézzük meg a program futását. Hány napos a hónap? – vegyünk mondjuk egy harmincegy napos hónapot… és elseje legyen mondjuk harmadik nap, vagyis szerda.
Amint látjuk, Commodore gépen van még egy szépséghibája ennek a listának, hogy az eleje nem olvasható, mert kifut a képből. Ezen egy egyszerű megoldással lehet segíteni: a CTRL gomb lenyomása ezeket a listázásokat lassítja. Tehát nézzük meg még egyszer. Hány napos a hónap? Legyen 28. Elseje essen mondjuk vasárnapra, vagyis hetedik nap. És a CTRL gombot lenyomom, a lista lelassul… fölengedem… ismét gyors. A huszonnyolcadik napnál vége.
Horváthné Majsa Katalin Commodore 64
4:44 Korábbi adásaink példafeladataiban lényegében már találkoztunk programelágazásokkal, ciklusokkal. Ezek azonban olyan lényeges kérdések, hogy úgy gondoltuk, érdemes közelebbről is megvizsgálni őket. Kezdjük talán az elágazásokkal. Erre a hétköznapi életben is könnyen találunk példát. Képzeljünk el mondjuk egy hajdanvolt susztert. A suszter kezdetben egyedül dolgozott, tehát szépen sorban egymaga csinálta végig a cipőkészítés valamennyi fázisát. Mivel egymaga dolgozott és jól dolgozott, tevékenységének folyamatában nem voltak elágazások. Később azonban, amikor kezdett jól menni az üzlet, a mester segédeket, inasokat fogadott és rájuk bízta a munkát. A segédek azonban nem voltak olyan lelkiismeretesek, mint ő, és bizony gyakran előfordult, hogy selejtes darabot készítettek. Ezért az egyes darabok elkészítése után egy ellenőrzést kellett közbeiktatni. Nézzük meg ennek a tevékenységsorozatnak a folyamatábráját.
Herneczki Katalin Commodore 64
6:42 Az IF–THEN utasítás a programozásban azt jelenti, hogy egy tevékenységet vagy tevékenységcsoportot végrehajtunk, vagy pedig nem hajtunk végre egy feltételtől függően. Ha a feltétel igaz, előbbi példánkra hivatkozva: a cipő selejtes, akkor a THEN utáni utasítás kerül végrehajtásra, vagyis a cipőt az erre kijelölt kosárba kell bedobnunk – természetesen a selejtgyűjtő kosárba. Egyébként pedig az IF–THEN szerkezetet követő utasítás kerül végrehajtásra, vagyis a jó cipőket máris csomagolhatjuk.
Nézzük meg, hogy mik lehetnek tulajdonképpen ezek a feltételek pontosabban. A feltételek matematikai relációk formájában fogalmazhatók meg. Nézzük most meg ezeket relációkat.
A relációk az egyenlőség, a kisebb, a nagyobb, a kisebb-egyenlő, a nagyobb-egyenlő és a nem egyenlő reláció. A relációs jel mindkét oldalán értéknek kell szerepelni, és ez az érték lehet egy konstans, lehet változó vagy bonyolultabb esetben valamilyen kifejezés. Kifejezésnek egyébként a változóknak és a konstansoknak műveleti jelekkel való összekapcsolását nevezzük. Előfordulhat az, hogy bonyolultabb kifejezésről van szó, amelyben sok művelet szerepel. Az egyértelműség kedvéért ilyenkor bizonyos elsőbbségi szabály bevezetésére volt szükség, ezt más néven prioritási szabálynak is szokták nevezni. (A mai szakirodalom gyakrabban használja a precedencia elnevezést – L. A. D.) A BASIC programozási nyelvben ismeretes a zárójel. Mégpedig a zárójelet pontosan ugyanúgy használhatjuk, mint ahogy a matematikában. A műveletek kiértékelésénél mindig a legbelső zárójelben lévő művelet kerül először végrehajtásra, aztán fokozatosan haladunk kifelé. Nézzük most erre egy példát.
Ebben a példában a B–C/2 művelet kerül először végrehajtásra, hiszen ez van a legbelső zárójelben, és utána haladunk fokozatosan kifelé. Zárójeles kifejezésekben a zárójelben vagy pedig zárójel nélküli kifejezésekben elsőbbségi szabályra van szükség, ez pedig a következőt mondja ki. Legmagasabbrendű műveletünk a hatványozás. (A sorozatban eddig nem említették, a korabeli számítógépek ↑ jellel jelölték, a ZX81 kivételével, ahol ** a jele – L. A. D.) Ezt követi a szorzás és az osztás, ezek egyenrangú műveletek, majd ezeket követi az összeadás és a kivonás, amelyek szintén egyenrangú műveletek. Tehát ebben a sorrendben kerülnek végrehajtásra a műveletek.
Erre is mutatunk egy példát. Vagyis itt is először a hatványozás, utána a szorzás-osztás, majd pedig az összeadás és a kivonás következik.
Előfordulhat azonban az is, hogy egy kifejezésben több azonos prioritású művelet szerepel, tehát szorzás-osztás, összeadás-kivonás, ilyen esetben van még egy szabályunk, az úgynevezett balról jobbra szabály, amely azt mondja ki, hogy a műveletek végrehajtása egyenrangú műveletek esetén balról jobbra történik.
Tehát a következő példánkban A+B az első, majd ebből az összegből levonjuk a C-t, és végül ehhez hozzáadjuk a D-t.
Pinkert László Commodore 64
10:06 Térjünk most vissza az IF utasításhoz. Annál is inkább, mert alkalmazásának jó néhány trükkje van, ezekből most néhányat bemutatunk.
Az IF utasítást a képen látható egyszerű szerkezetben használtuk eddig. Egy relációból és egy utasításból áll, melyet a reláció teljesülése esetén végre kell hajtani, egyébként pedig nem. Próbáljuk meg most ezt az egyszerű szerkezetet ábrázolni.
A relációt egy sarkára állított négyszöggel fogjuk jelölni, amelynek két kijárata van: az I-vel jelölt, ha a feltétel igaz, és az N-nel jelölt, ha nem igaz. Szemléletesebb az ábra, ha a megfelelő helyre beírjuk a relációt, illetőleg az utasítást.
Ez a szerkezet használható még akkor is, hogyha a feltétel teljesülése esetén nem egy, hanem néhány, mondjuk három-négy utasítást kell végrehajtani, mert ezek a THEN kulcsszó után kettősponttal elválasztva beírhatók a programba.
Ezt az egyszerű ábrát azért készítettük el, mert a későbbiekben a bonyolultabb szerkezetek kódolásához az ábrakészítés fog segítséget nyújtani.
Vegyük például a következőt. A reláció teljesülése esetén most nem néhány, hanem sok, mondjuk húsz-harminc sorból álló programrészletet kell végrehajtani, ezt a részletet jelöli a képen a négyzet, illetőleg benne az R betű. Az biztos, hogy ezt a programrészletet is az utasítások sorában kell elhelyezni, tehát például a 20-as sorszámmal kezdődően.
Ezek után mit kell csinálni? Azt szeretnénk, ha a feltétel teljesülése esetén a programrészlet végrehajtódna, ezt elérhetjük, hogyha egy GOTO utasítással ugratunk a 20-as sorra. Másrészt amennyiben a feltétel nem teljesül, ezt a programrészletet ki kell kerülni, ezt egy másik GOTO utasítással érhetjük el.
Kiss Donát Spectrum
16:25 Mint az imént láttuk, egyes elágazások feltételeit érdemes átfogalmazni a jobb megoldás érdekében. Nos, ebben, bonyolultabb kifejezések felírásában lesznek segítségünkre a BASIC nyelv logikai műveletei. Mielőtt azonban belekezdenénk ennek részletes magyarázatába, nézzünk talán egy programot, amely remélhetőleg illusztrálja majd ezek hasznát.
Tételezzük fel, hogy önök egy nagy forgalmú személyiszámítógép-üzlet eladói. Nap mint nap igen sokan avval a kérdéssel térnek be, hogy vajon milyen számítógépet vegyenek a gyereknek mondjuk húsvétra. Ez egy olyan munka, ami könnyen gépesíthető vagy könnyen számítógépre vihető, és ezért, számítógépbolt lévén, önök ehhez egy nagyon egyszerű kis programot írnak, amely ezeket a kérdéseket önmagától is megválaszolja. Hát ez a „milyen gépet vegyünk a gyereknek” tanácsadó program, amelyet itt látunk, amely – és ezt szeretném előrebocsátani – pusztán didaktikai jelentőségű, és arra szolgál, hogy bemutassa ezeket a logikai műveleteket majd.
Nos, a kérdés, ami itt látható alul, az, hogy a gyermek kora vajon mennyi. Tegyük fel, hogy önök igen előrelátóak, és óvodáskorú gyermeküket szeretnék majd meglepni egy számítógéppel, s ötéves a gyermek.
A program bölcs önmérsékletről tanúskodik, ugyanis azt állítja, hogy ebben a korban ez még egy kicsit korai. Ha azonban a gyermek már mondjuk kilenc éves, akkor egy ZX81-et javasol, ami kezdetben mindenképpen jó lesz.
Középiskolás korú gyermekeiknek azonban a program már egy Commodore 64-et vagy egy Spectrumot javasol, ami talán jobban megfelel ennek a korosztálynak az igényeinek.
Felnőtt vásárlók számára a program az anyagi helyzet tüzetes megvizsgálását javasolja, hiszen a választék akkora, hogy nagyon nehéz lenne itt javasolni egy vagy két típust.
Tegyük fel, hogy önök nemrég nyugdíjba vonult nagypapájukat szeretnék megajándékozni egy géppel, és a nagypapa nyolcvanhét éves – erre a program ugyanazt válaszolja, mint ötéves gyermekükre, hogy korai. No, nem cinizmusból, pusztán azért, mert itt éppen egy logikai művelet bemutatására lesz majd alkalmas ez a válasz.
18:57 Nézzük meg most ezt a programot, hogy néz ki a listája. Keressük meg azt a sort a programban, amelyik az „esetleg egy ZX81-et” kiírásért felelős. Miről van itt szó? Arról, hogy a K változóba korábban, egy korábbi programsorban beolvastuk „a gyermek kora” kérdésre adott választ, vagyis ebben a változóban az a szám található, amit ott bevittünk. Nos, itt látható egy k>=6 reláció. Ennek a relációnak vagy kifejezésnek van egy logikai értéke. Mégpedig aszerint, hogy K valóban nagyobb-e, mint 6 vagy nem. Eszerint ez a reláció vagy igaz, vagy hamis. Vagy más nyelven szólva: logikai 1 vagy logikai 0 értékű. Nomármost. A programot úgy írtuk meg, hogy az „esetleg egy ZX81-et” feliratot hat és tizenkét éves gyermekeknek ajánlanánk, vagyis azt kell megvizsgálnunk egyszerre, hogy K nagyobb-e, mint 6, és ugyanakkor kisebb-e, mint 12. Vagyis hogy a k>=6 reláció és a k<12 reláció egyszerre teljesül-e. És már el is mondtuk az ÉS függvénynek tulajdonképpen az igazságtáblázatát.
Arról van ugyanis szó, hogy két kifejezés ÉS kapcsolata akkor igaz értékű, ha mindkét kifejezés önmagában is igaz, minden más esetben hamis.
Nézzük meg azt a sort – amely, nagyon reméljük, nem tántorítja el majd nyugdíjas nézőinket ettől a műsortól –, amelyik a „korai” feliratért felelős. Mi úgy írtuk meg a programot, hogy k<6, valamint k>80 értékeknél legyen látható. Más szavakkal ha akár k<6, akár k>80, tehát vagy az egyik, vagy a másik teljesül, ebben az esetben azt szeretnénk, ha a gép kiírná ezt, hogy „korai”. Máris elhangzott a VAGY kulcsszó, ami nem más, mint ismét egy BASIC művelet, ez az OR angol szócska formájában látható is a képernyőn. Vagyis ha akár az egyik, akár a másik reláció teljesül, vagyis logikai értéke 1, akkor megtörténik ez a kiírás.
Azt jelenti ez más szavakkal, hogy a logikai VAGY művelet értéke akkor igaz, ha legalább egyik összetevőjének logikai értéke igaz, és csak akkor hamis, ha mindkettő hamis.
Végezetül pedig létezik egy harmadik logikai függvény is, ez pedig a tagadás, aminek a BASIC angol nyelvű rövidítése az, hogy NOT. Ez nagyon egyszerű, ugyanis itt csak egyetlenegy relációról, egyetlenegy logikai kifejezésről van szó – amennyiben annak az értéke igaz, vagyis logikailag 1, akkor a tagadás értéke hamis lesz, és viszont.
Mint látni fogjuk, ezeket a logikai függvényeket vagy logikai műveleteket igen gyakran fogjuk majd használni, elsősorban az elágazásokat tartalmazó programokban.
Herneczki Katalin
22:18 Térjünk most vissza kedvenc cipészmesterünkhöz, és nézzük meg közelebbről, hogyan történik a cipők csomagolása. A cipészmester a különböző méretű, jellegű cipőket más-más dobozba helyezi és a dobozokat más-más polcra teszi. A már ismert folyamatábránk DOBOZ nevű részfeladatát emeljük most ki, és ezt részletezzük. A cipészmester a különböző méretű, jellegű cipőket más-más dobozba teszi és más-más polcra rakja őket. Ha egy feladat olyan, hogy egy feltételtől függően nemcsak kétfelé, hanem többfelé is el lehet ágazni, akkor a feladat működési ábrája az alábbi módon alakul.
A MÉRET feltételtől függően többféle elágazás is lehetséges. Például ha a cipő férficipő, az A1-es tevékenységet hajtjuk végre, a megfelelő dobozba, megfelelő polcra tesszük a cipőt. Ha a cipő női méretű, akkor az A2-es tevékenységet hajtjuk végre, másfajta dobozba, másik polcra kerülnek az ilyen cipők. Ha a cipő gyerekcipő, akkor az A3-as tevékenységet hajtjuk végre. Természetesen egyéb méretmegkülönböztetések is lehetnek, de előfordul, hogy egy cipő egyik feltételnek sem tesz eleget. Ebben az esetben az EGYÉB ágon fut tovább a programunk, az AN tevékenység végrehajtásával.
23:41 Az ilyen típusú elágazást CASE szerkezetnek nevezzük. A CASE angol szó, esetet jelent, és arra utal, hogy itt tulajdonképpen egy esetszétválasztó szerkezetről van szó. Ennek a szerkezetnek a megvalósítása BASIC nyelven IF–THEN utasítások segítségével történhet, mégpedig így:
A programrészlet megvizsgálja az egyes feltételek teljesülését, és attól függően ugrik tovább. Vagyis ha A=1, akkor az 500-as sorba, A=2 esetén a 600-asba, és így tovább, A=5 esetén a 2500-as sorba. Ez a megoldás azonban egy kicsit bonyolult, és erre egyszerűbb megoldás is létezik a BASIC nyelvben, mégpedig az ON GOTO utasításnak a használata. Ez sajnos nem minden gépnél van meg. (Az adásban szereplő gépek közül csak a Sinclair-gépekről hiányzik, de ott van helyette „kiszámított GOTO” utasítás – L. A. D.) Ugyanezt a programrészletet fogjuk most megnézni az ON GOTO utasítás segítségével.
(A programsor hibásan jelenik meg: a sorszámokat vesszővel kell elválasztani egymástól, de szóköz áll közöttük. A helyes szöveg: ON A GOTO 500,600,1200,1600,2500 – L. A. D.)
A megoldás lényegesen egyszerűbb. A 30-astól a 34-es sorig mindössze egy sort kell beírni – ezt most 30-assal jelöltük –: ON A GOTO 500, 600 és így tovább, 2500. Ez az utasítás lehetővé tette, hogy az A kifejezés vagy változó értékétől függően a listában felsorolt ágak bármelyikére ugorjunk. Tehát az 500-as, 600-as, és így tovább, 2500-as sorba. Fontos az, hogy A itt is 1-ről indul és egyesével növekszik. Van még néhány megkötésünk az A-ra vonatkozóan. Ha A nulla, akkor a program az utasítást követő sorban folytatja működését. Ugyanez a helyzet akkor is, ha A értéke nagyobb, mint az elágazások száma. Vagyis ebben a programban öt elágazásunk volt, ha mondjuk A hat, akkor ez az eset áll fenn. Előfordulhat az is, hogy A negatív. Ebben az esetben hibajelzést kapunk. Ha pedig A nem egész szám, akkor A egész részét veszi figyelembe a program.
A Rádiótechnika című lapban az ON GOTO utasítás használatára láttunk egy mintafeladatot. Utána tudnak nézni az 1984-es évfolyam nyolcadik számában. A feladat lényege az volt, hogy háromjegyű számokat, amelyeket számjeggyel adnak meg, szöveges formában kell kiírni.
Nézzük meg ennek a működését. Az idő rövidségére való tekintettel csak az egyeseket kezelő programrészt vesszük szemügyre. A 360-as sorban az ON GOTO utasítás található, E változóval. Tehát ON E GO TO 380, 390, és így tovább, 460. A 380-as sorban történik meg az 1-es kiíratása egy PRINT utasítással, a 390-esben a 2-esé, és így tovább, a 460-as sorban a 9-es számjegyet tudjuk kiírni. (Ezek a sorok is hibásak. A kiírandó szövegek jól láthatóan ' aposztrófok között vannak (amelyet a Commodore-gépek ferde vonalkával írnak), pedig " idézőjelnek kellene ott állnia, és hiányzik az utasítások közötti kettőspont is. A helyes szöveg 380 PRINT "EGY": END lenne, és a többi sorban is hasonlóképpen – L. A. D.) Házifeladatként javasoljuk, hogy gondolják végig: a tízesek, százasok kiíratását hogy lehetne megoldani ezzel a programmal. Vagyis hogy az egész háromjegyű számot tudjuk most már szöveges formában kiírni. Ebben az esetben az se baj, ha egy kicsit puskáznak, tehát a Rádiótechnika című lap használható.
Horváthné Majsa Katalin Commodore 64
27:04 Visszatérve a jó öreg suszterhez, elmesélem, hogy mi történt a selejtes kosárba került cipőkkel.