Upload failed. Maybe wrong permissions?

User Tools

Site Tools



4. Folytatás

4-0.jpg
  

25:49
1985. február 6.
MTV 2. csatorna, 19:30

Feltételes elágazás

4-1.jpgKiss Donát Spectrum
  0:36 A múlt adásban megszakított mondókámat most folytatnám, ha megengedik, és ha hagyják. Talán emlékeznek, hogy a múlt adás végén arról beszéltünk, hogy lehet egy program végrehajtását a végéről mindig az elejére vezérelni. Vagyis hogyan lehet egy programot végtelen ciklusba vezérelni. Az adás végén a rendezőasszisztens úgy gondolta, hogy én magam is ilyen végtelen ciklusba kerültem, s ennélfogva orvul, a BREAK vagy a STOP billentyű, illetve mindkettő működtetésével megszakította mondókámat.
  Nos, ebben a mai adásban arra fogunk kísérletet tenni, hogy bemutassunk önöknek egy olyan módszert, amelynek segítségével, hát, ennél finomabb eszközökkel is meg lehet majd állítani egy program futását. Ehhez pedig a számítógépnek azt a képességét fogjuk kihasználni, hogy a számítógép döntésekre is képes. Más szavakkal: egy feltétel teljesülésének függvényében képes például a programot az egyik vagy a másik programsoron folytatni. Nézzük ehhez a programunkat, amely, mint emlékeznek, fáradhatatlanul számítja át a lóerőket kilowattá és folyton követeli az újabb adatokat. Próbáljuk meg ezt most kiegészíteni olyan utasításokkal, melyek segítségével ennek a futását bármikor – egy arra alkalmas billentyű lenyomásával – például megállíthatjuk.
  2:02 Nézzük meg, hogy milyen utasítással vagy utasításokkal kell kiegészítenünk a már futóképes programunkat ahhoz, hogy például a 0 billentyű lenyomása esetén a program futása megálljon. Nos, ehhez a feltételes elágazást megfogalmazó utasítást fogjuk használni, ami az IF – THEN párral, rövidítéspárral írható le a BASIC-ben, ami megfelel a magyar jelentésének is körülbelül, tehát ha – akkor. Vagyis ha valamilyen feltétel teljesül, akkor valamit végre kell hajtani. Ha külön nem rendelkeznek arról, hogy egyébként mi történjen, akkor egyébként a program futása a soron következő soron folytatódik, és figyelembe sem veszi ezt az utasítást. (A műsorban szereplő gépek közül csak a Primo és a HT–1080Z BASIC-je adott módot arra, hogy „egyébként” részt is meghatározzunk – L. A. D.)
  4-2.jpg2:47 Ez tehát az IF – THEN BASIC utasítás, ami két ilyen rövidítésből áll. Az IF után mindig meg kell adni a feltételt, aminek a vizsgálatától függően kell majd végrehajtani valamit. Ebben az esetben a feltétel az, hogy a LO változóba beolvasott lóerőérték… ami vagy egy valós érték, vagy pedig a nulla… ebben az esetben, ha nulla, akkor ezt nem azért írták be, hogy ezt átszámítsuk, mert ez könnyen megtehető fejben is, hanem mert meg szeretnénk állni. Tehát ha a LO nulla, akkor végre kell hajtani valamit, hát mit is… meg kellene állni. Tudjuk ugye, hogy ez a STOP utasítással érhető el.
  Ezt az utasítást például a 45-ös sorba lehetne felvenni, a lényeges pusztán az, hogy az INPUT, vagyis a LO változóba való beolvasás után történjen valamikor, hiszen akkor kerül ebbe a legutóbb bevitt érték.
  Erről azért illő lenne tájékoztatni is a program felhasználóit, hogy kibővült a program egy ilyen új lehetőséggel, ezért írjuk ezt ki egyszer a képernyőre valamilyen távirati stílusban: leállítás 0.
  Nézzük meg, hogy valóban úgy működik-e, mint ahogyan erre számítottunk.
  

4-3.jpg4-4.jpg

  Látjuk, hogy ez egy lóerő–kilowatt átszámító program, amelyben leállítás 0 billentyűvel történhet. Tehát ha bármi mást nyomok meg, mint a 0, akkor azt átszámítja a program. Például azt, hogy 26, vagy azt, hogy 55, vagy bármilyen más értéket. Ha viszont a nullát viszem be, akkor a program futása megáll. Vagyis hozzájutottam egy olyan programozható eszközhöz, aminek a segítségével mindenféle goromba beavatkozás nélkül is megállítható egy program.
  
4-5.jpg4-6.jpg

Ismétlés

4-7.jpgHerneczki Katalin HT–1080Z
  4:39 Úgy gondolom, hogy ezt az egyszerű programocskát már nem érdemes tovább cicomázni. Inkább foglaljuk össze röviden, mit is tudunk már. Nos, aki azt mondja, hogy mindent, ami a programozáshoz szükséges, tulajdonképpen igaza van, hiszen az eddig megismert utasítások segítségével igen bonyolult feladatok is megoldhatók már. Beszéltünk a változókról, vagyis azokról a „fiókokról”, amelyek a gép memóriájának részét képezik, és változó adatokat tartalmaznak. A fiók tartalma a változó értéke. A fiók adattartalmára gondolunk természetesen, a fiók címkéje pedig a változó neve. Egy változónak a LET, vagyis az értékadó utasítás segítségével adhatunk értéket. Egyes géptípusoknál egyébként a LET kulcsszó elhagyható. A változók neve a BASIC nyelvekben tetszőleges szó vagy szöveg lehet. Lényeges viszont, hogy az első karakternek minden esetben betűnek kell lennie. A különböző géptípusoknál egyébként megkötések vannak, nézzünk ezekből néhányat a gépkönyvek segítségével. A HT típusú számítógépnél például csak az első kettő jelet használja azonosításra, valamint az azonosítók nem tartalmazhatják a BASIC egyetlen utasításának úgynevezett kulcsszavát. A Primónál pedig a név tetszőleges hosszúságú lehet, de csak az első két karaktert különbözteti meg a rendszer, első karaktere csak az angol ábécé karaktereiből állhat, és a további karakterei számjegyek vagy az angol ábécé karakterei lehetnek. (Az angol ábécé hangsúlyozásának azért van jelentősége, mert a Primo a magyar ábécé betűit is ismeri, de változónévben nem engedi használni – L. A. D.)
  4-8.jpg6:26 Előfordulhat az is, hogy egy változónak szöveges értéket kívánunk adni. Ebben az esetben a változó neve után dollárjelet kell tenni, értékadáskor pedig a szöveget idézőjelbe kell tenni.
  Eddig összesen hat utasítással, illetve paranccsal ismerkedtünk meg. Nagyon fontos dolog az, hogy ha ezeket a szavakat begépeljük, természetesen a megfelelő formai szabályok figyelembe vételével, a számítógép azonnal végrehajtja őket a sorzáró billentyű megnyomása után. Ha viszont sorszámot írunk eléjük, akkor utasítás lesz a nevük, ebben az esetben a számítógép a sorszámok sorrendjében tárolja, raktározza őket, és külön parancsra, a RUN-ra sorrendben végrehajtja őket.

NEW

4-9.jpgPinkert László Primo
  7:16 Hogy továbblépjünk, ismerkedjünk meg egy újabb paranccsal. Erre akkor van szükség, ha a gépbe új programot szeretnénk beírni, és azt akarjuk, hogy a régit felejtse el. Ilyenkor használhatjuk a NEW parancsot. Ebben a számítógépben van egy program; hogy meggyőződhessünk róla, kilistázom.
  

4-10.jpg4-11.jpg

  Most pedig kiadom a NEW parancsot. Ismét megkísérlem a listázást. Megállapíthatjuk, hogy a számítógépben nincsen program.
  7:53 Az előbb szóltunk róla, hogy a kulcsszavak mindegyike használható utasításként, sorszámmal ellátva, vagy parancsként, közvetlenül. A sorszámmal, utasításként használt NEW-nak azonban nincs sok értelme, hiszen az így keletkező program öngyilkos program lesz. Spectrum Nézzünk meg most egy másik számítógépben egy programot, ahová az első utasításként beírom a NEW-t.
  
4-12.jpg4-13.jpg

  Mielőtt elindítanám, gondoljuk végig a program működését. Az első, vagyis az ötös sornál a gép kitörli memóriájából a programot, vagyis ezek után már nem tudja a programot folytatni. Így nyilvánvaló, hogy a futásnál semmi mást nem fogunk kapni, mint egy villogó kurzort. Íme, a gép alapállapotba került, vagyis törlődött.
  4-14.jpg

Szalagnaptár

4-15.jpgKiss Donát
  8:52 Eddigi ismereteink birtokában egy újabb, ámde nem túl bonyolult feladat elvégzéséhez lássunk neki. A feladat a következő. Készítsünk olyan számítógépes programot, amely a képernyőre szalagnaptárt fog kiíratni. A szalagnaptár, mint bizonyára sokan tudják, hagyományos megjelenésében így néz ki, s arra használható, hogy megtudjuk, hogy egy hét vagy egy hónap adott napja éppen a hét melyik napjára esik. Hát egy ilyen feladatnak úgy kezdenénk neki, hogy először megírnánk azt a programrészt, amelyik a hónap napjainak sorszámát megjelenítené egytől harmincig. Írjuk meg ezt a kis programot. Ehhez felhasználjuk mondjuk az I változót, melynek kezdeti értékét 1-re állítjuk be egy értékadó utasítással… ennek értékét kinyomtatjuk, majd a már említett módon az I változó értékét eggyel megnöveljük és visszaírjuk az I-be. Itt pedig egy szintén már ismert feltételes elágazás következik, amikor is megvizsgáljuk, hogy kell-e még tovább nyomtatni és tovább növelni az I értékét. Vagyis IF, tehát ha az I értéke kisebb vagy egyenlő 30-nál, tehát még nem végeztünk, akkor a program futását visszaküldjük a 20-as sorba. Vigyázzunk azonban, hogy nehogy véletlenül a 10-esbe, ebben az esetben ugyanis mindig csak az 1-est látnánk a képernyőn, hiszen a kezdeti értékadást hajtanánk végre számtalanszor. Tehát akkor GO TO 20. Hogy észrevegyük, hogy a program lefutott, utolsó utasításként egy STOP-ot vegyünk fel… nézzük meg, hogy eddig hogy működik.
  

4-16.jpg4-17.jpg

  10:52 Íme az első huszonkét sor, ami befér a képernyőre, és itt vannak a továbbiak is. Eljutottunk tehát egy funkcionálisan működő programhoz, azonban valószínűleg már sokan sejtik, hogy ez a magas szintű nyelvek többségében, így a BASIC-ben is, nem a legelegánsabb megoldás. Ennél erre a célra sokkal praktikusabb utasítások is vannak, ezeket nevezik ciklusszervező utasításoknak. Ennek bemutatására írjuk meg ezen utasítások segítségével ugyanezt a programrészletet, vagyis ami pontosan ugyanezt fogja eredményezni. Mégpedig a 100-as sortól. A ciklusszervező utasítások két részből állnak, az egyik a ciklus elején található mindig, a második lezárja azt, és a kettő között található a ciklusmag. Vagyis az az utasítás, amit valahány számszor meg kell ismételni, hiszen az egész ciklusnak az a lényege, hogy egy adott műveletet sokszor egymás után el akarunk végeztetni. Hogy hányszor, azt egy változónak kezdeti és végértékével adjuk meg. Ezt nevezzük ciklusváltozónak. Legyen ez itt most ugyancsak az I. FOR I=1FOR ugye az első része ennek az utasításnak – TO 30. Ezt azt jelenti, hogy mindaddig, míg az I egytől a harmincat el nem éri, mégpedig egyesével növelve. Vagyis harmincszor. Hát mit kell harmincszor elvégezni – PRINT I, ami már eddig is ismerős volt, és most jön az az utasítás, ami mindig lezár egy-egy ciklust, ez pedig a NEXT, és a megfelelő ciklusváltozó, vagyis I.
  
4-18.jpg4-19.jpg

  Ide is írjunk egy STOP-ot, hogy észrevegyük azt, hogy ez is lefutott, és most a futást a 100-as soron indítsuk. Vagyis RUN 100: nem meglepő módon ugyanazt az eredményt kaptuk.

A FOR ciklus

4-20.jpgHorváthné Majsa Katalin Spectrum
  12:54 A FOR–NEXT utasításokkal létrehozott ciklusokkal a későbbiekben még olyan gyakran fogunk találkozni, hogy azt hiszem, érdemes egy kicsit alaposabban is megvizsgálni őket. Egyáltalán milyen esetekben használhatók ezek a ciklusok? Hát pontosan olyan esetekben, mint amilyen az előző is volt, tehát amikor egy utasítást vagy utasítássorozatot egymás után többször végre akarunk hajtatni, s azt, hogy hányszor, már a program írásakor is tudjuk. A többször végrehajtandó utasítást vagy utasítássorozatot nevezzük a ciklus magjának, és ez elé kell betennünk egy FOR utasítást, s az egészet lezárni egy NEXT-tel. A FOR utasításban definiálunk egy ciklusváltozót. A ciklusváltozónak az lesz a szerepe, hogy a program futása során ez utal arra, hogy hányszor hajtottuk végre a ciklus magját. Ugyanitt megadjuk a ciklusváltozó kezdeti és végértékét is. A NEXT utasítás pedig csak azt jelöli, hogy meddig tartott a ciklusmag. Hát akkor gyorsan nézzünk is erre egy példát, írjunk egy ciklust. Az elmondottak alapján úgy kezdődik, hogy FOR, most kell definiálni egy ciklusváltozót, ez akármi lehet, (Sinclair gépeken a ciklusváltozók neve csak egybetűs lehet – L. A. D.) úgyhogy legyen egy U változó – egyébként általában az ábécé közepéről szokták ezt a változót választani, de természetesen akármit választhatunk –, a kezdeti értéke legyen 10, és a végértéke pedig 20, ez azt jelenti, hogy 10-től 20-ig fog változni. A ciklusmag egy egészen egyszerű, egyutasításos legyen, ez pedig nem más, mint az U változó aktuális értékének a kiíratása, azért választottam most ezt, hogy nyomon tudjuk követni, hogy mennyi a ciklusváltozó értéke, s az egészet ezek szerint lezárjuk egy NEXT u-val. Lássuk, eddig tartott a ciklusmag. Na gyorsan futtassuk le, így, s amint vártuk, 10-től 20-ig megjelentek az egymás után következő számok.
  

4-21.jpg4-22.jpg

  4-23.jpg
  15:12 Hát ebben a példában a ciklusváltozó értéke egyesével növekedett. Ez azonban egyáltalán nem feltétlen történik mindig így. Lehetőségünk van más érték megadására is, erre a STEP kulcsszó szolgál. Ezt a STEP kulcsszót a FOR utasítás végére kell biggyeszteni – ezek alapján javítsuk is a 10-es sorunkat –, tehát ideírom a végére, hogy STEP, ez magyarul lépésközt vagy lépést jelent, legyen 2, ennek az lesz az eredménye, hogy nem egyesével, hanem kettesével fog növekedni az U ciklusváltozó értéke. Ellenőrizzük le, s egy listát is alá, tehát 10-től 20-ig kettesével.
  
4-24.jpg4-25.jpg

  4-26.jpg
  15:59 Amint ebben a példában is láttuk, a ciklusváltozó kezdeti értéke, végértéke és a lépésköz között szoros kapcsolat van. Itt a kezdeti érték egy kis szám volt, a végérték egy ennél nagyobb szám, s természetesen ehhez egy pozitív lépésközre van szükség. De nyugodtan megadhatok egy negatív lépésközű ciklust is, ehhez azonban egy magasabb kezdeti és alacsonyabb végérték szükséges. Ezt megint be kell látnunk, úgyhogy módosítsuk ismét a programot. Kijavítom a 10-es sort úgy, hogy a ciklusváltozó 10-től menjen mondjuk a játék kedvéért egészen –2-ig, a lépésköz pedig legyen –3. Futtassuk le, listát is alá… Tehát 10-től haladunk –2-ig hármasával visszafelé.
  
4-27.jpg4-28.jpg

  4-29.jpg
  17:06 Az eddig látott példáinkban a ciklusváltozó kezdeti értékét, végértékét és a lépésközt konstansokkal adtuk meg. Azonban a BASIC-ben lehetőség van arra, hogy ezek megadására változókat vagy akár matematikai műveletek eredményét is felhasználhassuk. Nézzük ezt is egy példán. Rögtön módosítom a 10-es sort. Most a ciklusom legyen olyan, hogy az U ciklusváltozó kezdeti értéke legyen annyi, amennyi az A változó értéke, a végértéke legyen 100, a lépésköz pedig a B és C változók szorzatánál kettővel kevesebb. Hát ahhoz, hogy ezt le tudjam futtatni, valamilyen módon értéket kell adnom ezeknek a változóknak, úgyhogy ezt gyorsan pótolom is. Az 5-ös sorban LET utasításokkal adok nekik értéket, de a program során akármilyen más módon, tehát INPUT-tal is kaphatnának ezek értéket. Az A legyen 80, a B változó értéke legyen 3, a C-é meg legyen 2. (Csak néhány perc múlva fogjuk látni, hogy a legtöbb BASIC-ben [kivétel a ZX81] egyetlen sorban több utasítás is szerepelhet, kettősponttal elválasztva – L. A. D.)
  Igen, gyorsan egy futtatás… alá egy lista.
  
4-30.jpg4-31.jpg

  4-32.jpg
  Nézzük az eredményt. A megadott értékek alapján a ciklusváltozóm megy 80-tól 100-ig, a lépésköz pedig kettőször három az hatból kettő, tehát négy, így tényleg érthető a 80, 84, 88 stb., egészen 100-ig.
  18:54 Hát a ciklusoknál még azt kell megemlítenünk, hogy vajon mi lehet a ciklus magjában. Hát természetesen akármi, akár újabb ciklus is. A ciklus magjára egyetlen kikötés van, hogy ne szerepeljen benne olyan utasítás, ami a ciklusváltozónak az értékét megváltoztatná, ebből ugyanis óriási káosz és különböző bonyodalmak következhetnek. Tehát hogyha újabb ciklust rakunk a ciklusmagba, természetesen mást kell ciklusváltozónak használnunk. Az előző példában a ciklus magjába olyan utasítást raktunk, ami kiíratja a ciklusváltozó értékét, tehát ebben az esetben annak az aktuális értéke nem romlik el. És ezt használtuk fel a szalagnaptáras példában is.

Kérdés

Kiss Donát Spectrum
  19:46 Ezzel meglennénk, most már csak az a kérdés, hogy hogy fog a napok sorszámai mellé odakerülni az a bizonyos szöveg, vagyis a hét napjai.
  4-33.jpg

IF utasítások

4-34.jpgHerneczki Katalin Spectrum
  19:55 Nos, ez egyszerű, amennyiben elseje hétfőre esik. Így I=1 esetén az N$ szöveges változó értéke hétfő, H-val rövidítjük, I=2 esetén a szöveges változó értéke kedd, K-val rövidítjük, és így tovább, I=7 esetén a változó értéke vasárnap, amelyet V-vel rövidítünk. Ezek a programban IF utasításokat jelentenek, és ezeket a 10-es és a 20-as sor közé kell beszúrnunk. Gépeljük a 12-es sortól kezdve. 12 IF I=1 THEN LET N$="H" Gépelem tovább…
  4-35.jpg

A kész szalagnaptár

4-36.jpgPinkert László Commodore 64
  20:51 A hetedik IF utasítás begépelése után meg kell állnunk. Ugyanis a hetedike után a naptárban természetesen nyolcadika következik, de ahhoz, hogy programunk a nyolcas mellé ismét hétfőt írjon, ahhoz az I-nek 1-nek kéne lennie. Láthatjuk tehát, hogy meg kell különböztetni a napok számlálását 1-től 30-ig, illetőleg annak a megjelölését, hogy hányadik napnál tartunk a héten. Ezért a FOR ciklus változóját megváltoztatom mondjuk K-ra.
  

4-37.jpg4-38.jpg

  Ezek után tehát a K fogja jelölni a dátumot, az I pedig azt, hogy a hétnek hanyadik napjánál tartunk. Viszont az I így nem ciklusváltozó. Tehát nekünk kell gondoskodni arról, hogy legyen kezdőértéke. Ezt megteszem az 5. sorban: I=1, vagyis hétfő; és szintén mivel nem ciklusváltozó, nekünk kell gondoskodni arról, hogy a ciklus lefutása után az I növelődjék, és megvizsgálja a program, hogy elérte-e már a határértéket, a hetet.
  4-39.jpg
  Ezzel tulajdonképpen el is készültünk a programmal, mindjárt bemutatom a futását, de előbb még vegyük észre, hogy a 19. sorban kihasználtam a BASIC nyelv egyik lehetőségét, mely szerint egy utasítássorba több utasítás is kerülhet, hogyha ezeket kettősponttal választjuk el. Ez a sor egyébként ugyanazt csinálja, amit a NEXT utasítással jelölünk, vagyis megnöveli a változó értékét és megvizsgálja, hogy a határt elérte-e már. Nézzük meg ezek után a program futását…
  
4-40.jpg4-41.jpg

  Mivel harminc napot kell kiírnia, kifut a képből, de ha jobban megnézzük, helyesen működik.

Scroll

4-42.jpgHerneczki Katalin Spectrum
  23:15 Közben én is elkészültem. Nézzük meg, hogy fut a program Spectrumon. Reméljük, futni fog… igen, egy oldal eredménylista kiírása után megjelent a scroll? felirat. Ebben az esetben bármelyik billentyű megnyomása után a program tovább futtatható. Tehát itt nincs olyan problémánk, hogy kifutnánk a képernyőből, mint Commodore-nál, HT-nél vagy Primónál. Egyébként komoly probléma ott sincsen, hiszen az egyes napok beírása után úgynevezett várakozási időt építhetünk be a programba, a program futása megállítható, tehát bármelyik sor tanulmányozható.
  4-43.jpg

Zárszó

Van azonban egy másik probléma, mégpedig az, hogy nem minden hónapban esik elseje hétfőre. Házi feladatnak szánjuk a következő végiggondolását. Vagyis a gép kérdezze meg, hogy az adott hónapban melyik napra esett elseje, és a válasznak megfelelően készítsük el az eredménylistát. És még egy házi feladat, merthogy még egy problémánk van. Vagyis az, hogy nem minden hónap harminc napos. Lehet harmincegy, huszonnyolc, sőt szökőévben még huszonkilenc napos is. Általánosítsuk, módosítsuk úgy a programot, hogy ezeket az eseteket is helyesen kezelje.
  Ezeket a feladatokat egyébként gyakorlásnak szántuk, úgyhogy ne küldjék be, mert a következő adásban a helyes megoldást közölni fogjuk. Viszontlátásra.