Upload failed. Maybe wrong permissions?

User Tools

Site Tools



7. A programozás módszere

7-0.jpg
  

27:41
1985. február 27.
MTV 2. csatorna, 19:30

Bevezető

7-1.jpgHerneczki Katalin
  0:52 Köszöntöm kedves nézőinket. Eddigi adásainkban a BASIC nyelv számos utasításával, lehetőségével megismerkedtünk már. Úgy gondoljuk, hogy itt az ideje, hogy egy feladatot elejétől végéig, a tervezéstől a kódolásig, ellenőrzésig megoldjunk. Igen ám, de hogyan lássunk hozzá? Személyi számítógépeknél igen nagy a csábítás, hogy egyszerűen leüljünk a gép elé, és utasításonként beüssük a programot. Aztán megpróbáljuk futtatni. Ez persze elsőre az esetek többségében nem sikerül. Ilyenkor javítani próbálunk. Ha megint nem jó a megoldás, újabb és újabb javító menetek következnek. Ilyenkor új sorokat szúrunk be, régieket törlünk, netán GOTO utasításokkal előre-hátra ugrálunk a programban. Ettől persze a program egyre kuszább, egyre szövevényesebb lesz, és bizony nem mindig jutunk el a megoldáshoz. Sokszor az ember mérgesen félreteszi a programot úgy, ahogy van. Így van ez egyébként a köznapi életben is. Ha például mondjuk Kőbányáról Kelenföldre szeretnénk átjutni személygépkocsival, ráadásul még tanuló gépkocsivezetők is vagyunk, hát ilyenkor elég sokat kevergünk a városban, zsákutcákat találunk, egyirányú utcákkal találkozunk, sokszor visszajutunk egy olyan pontra, ahol már voltunk, és persze előbb vagy utóbb eljutunk Kelenföldre, de ez bizony komoly benzinköltségbe kerül, nem beszélve az eltelt időről és az idegességről. Nos, autóvezetésnél is, programozásnál is sokkal jobban járunk, ha előre eltervezzük, mit szeretnénk csinálni. Számos programtervezési módszer ismeretes – sajnos adásidőnk rövidsége miatt nem tudjuk egyiket se részletesen ismertetni. Ezek között a tervezési módszerek között azonban sok különbség van, de nagyon sok közös vonás is. Ezeket a közös vonásokat szeretnénk kiemelni és kihasználni a továbbiakban. Az egyik alapelv például az „oszd meg és uralkodj” elv. Azaz: egy feladatot bontsunk részekre, és a részfeladatokat további feladatokra, további részfeladatokra finomítsuk. Ez a finomítás addig tart, amíg egy olyan elemi részhez nem jutunk, amelyet már könnyen tudunk kódolni. Legegyszerűbb lesz, hogyha ezt egy konkrét feladaton megnézzük. Nézzük most a feladatot.

A feladat

7-2.jpgDr. Kocsis András Commodore 64
  3:09 Itt vagyunk ismét meghitt környezetünkben, a számítógépek között, és most nézzük a feladatot. Készítsünk egy olyan programot, amely napi középhőmérsékletet számol és ír ki a képernyőre, a reggeli, déli és az esti hőmérséklet alapján. Hogy az eredmény szemléletesebb legyen, ne csak a számszerű értékeket írja ki a program a képernyőre, hanem az egyes hőmérsékletek értékével arányos vonalat is rajzoljon ki. Ezek a vonalak álljanak csillagokból, és annyi csillagból, ahány fok van. Ha például öt fok van, akkor öt csillagból, és így tovább. Egyszerűsítésképpen tételezzük fel, hogy a fűtési időszak kezdetén vagyunk, és csak egy és harminc fok közötti értékek fordulhatnak elő. Ez a programunkat is némileg egyszerűsíteni fogja.

Programtervezés

7-3.jpgHerneczki Katalin Commodore 64
  3:59 Tervezzük most meg a programot. Eddig az alapszerkezetek, így a feltételes szerkezet, illetve ciklusszerkezet működésének megértéséhez folyamatábrát használtunk. Programszerkezet ábrázolásához, programtervezéshez ennél jobb eszköz az úgynevezett hierarchiadiagram. Ezen jobban ábrázolható a részekre bontás, illetve a finomítás menete. Javasoljuk egyébként nézőinknek, hogy a későbbiekben egy konkrét programtervezési módszert alaposan tanulmányozzanak át.
  7-4.jpgMostani feladatunk, az átlagszámító feladat egy egyszerű program. De ezen szeretnénk bemutatni a programtervezés lépéseit. Ezt a későbbiekben bonyolult feladatoknál fogják igazán jól használni.
  Első megközelítésben a program három résztevékenységre bontható. Ezek közül az első az olvasás, a második az átlagszámítás, s végül a harmadik a kiírás. Ha közelebbről szemügyre vesszük őket, akkor az első mindössze három hőmérsékleti adat beolvasását jelenti, ezért ezt tovább nem részletezzük. A második, az átlagszámítás egyetlenegy művelet, szintén nincs értelme tovább bontani. És végül a harmadik, a kiírás – hát ez bizony több résztevékenységet tartalmaz, úgyhogy ezt tovább bontjuk.
  7-5.jpg5:18 A tervezés következő lépése tehát a hármas résztevékenység továbbfinomítása, tovább-bontása. Kérdés az, hogy mi alapján történjen a további finomítás. Hát a feladat szövegének figyelembe vételével, a feladat természetes szerkezetét követve. Vagyis az alábbi négy résztevékenységet sorolhatjuk fel: reggeli hőmérsékleti adatok kezelése, déli hőmérsékleti adatok kezelése, esti hőmérsékleti adatok kezelése, természetesen kiírásra gondolunk, és végül az átlaghőmérséklet kezelése, kiírása.
  Ez a négy résztevékenység még nem úgynevezett elemi résztevékenység, mert tovább-bontható. Mind a négy egyébként ugyanazokat a műveleteket végzi el, ezért csak az egyik tovább-bontását, finomítását mutatjuk meg, a többit hasonlóképpen kell elvégezni.
  7-6.jpgA reggeli hőmérsékleti adatok kezelése két részből áll. Az első a hőmérséklet kiírása, természetesen Celsius-fokban, a második rész pedig a vonal kiírása. Ez a vonal tulajdonképpen csillag karakterek ismétlődéséből áll össze, annyi csillagot kell írnunk, ahány fokos hőmérsékletet mértünk aznap. Azt, hogy itt egy ciklusról van szó, azt a doboz jobb felső sarkában lévő csillag karakter jelzi. Ennek semmi köze nincs a feladat szövegében szereplő csillaghoz, ez egy egyezményes jel a ciklus ábrázolására, természetesen más jelöléseket is szoktak alkalmazni. Teljesen hasonló a felbontása a déli, az esti, illetve az átlag-hőmérsékleti adatoknak is. Ezért ezt most nem is mutatjuk meg.
  Ezzel tulajdonképpen a programtervezés végére értünk, hiszen itt már csak elemi tevékenységeink vannak, ezeket könnyen tudjuk kódolni.

Kódolás

7-7.jpgPinkert László Commodore 64
  7:08 A program kódolását kezdjük azzal, hogy az első néhány sorban megjegyzésekből fejlécet készítünk. Ez nem szerepelt az eddigiekben a részfeladatok között, de fontos ahhoz, hogy a későbbiekben a programot azonosítani tudjuk. Ezek után pedig megkezdhetjük a részfeladatok kódolását. Mindegyik elé írjunk megjegyzéssort, ezzel a program áttekinthetőbbé válik.
  Az első feladat, ha visszaemlékszünk rá, beolvasni a reggeli, déli és esti hőmérsékleti adatokat, egymás után. Természetesen mindegyik előtt megfelelő szöveget írunk, amelyik felhívja a felhasználó figyelmét, hogy melyik hőmérsékletre vár a program. Nézzük tehát a reggelt.
  Megjegyzés tehát: a reggeli adatokkal fogunk foglalkozni. Ezek után, bár ez nem szerepelt külön a részfeladatok között, de nyilván itt kell elvégeznünk, hogy letöröljük a képernyőt.
  

7-8.jpg7-9.jpg

  És ezek után most már következhet az adatbevitel. INPUT utasítást használunk, és a szöveg az lesz, hogy „reggeli hőmérséklet”, kettőspont, és ezek után kell bevinni a reggeli hőmérsékletet, amit RH-nak fogunk elnevezni, hogy a későbbiekben könnyebb legyen azonosítani a változókat.
  Ezek után már kezdhetnénk is a déli hőmérséklet bevitelét, de ide iktassunk be most egy üres PRINT utasítást, azért, hogy ne folyjon össze a program. Tehát egy soremelés üres PRINT utasításban. Ezek után ehhez hasonlóan következik a déli adatok bevitele, vagyis 100-as – itt egy megjegyzést írunk ismét –, következik a dél. 110-es: INPUT, idézőjel, „déli hőmérséklet”. Ezt most DH-nak fogjuk elnevezni. Ismét soremelés következik, majd az este a megszokott módon, megjegyzéssel. „Esti hőmérséklet”, utána egy újabb soremelés, és készen vagyunk.
  
7-10.jpg7-11.jpg

  Tehát elvégeztük az első részfeladatot, amit három részben oldottunk meg, három külön INPUT utasítással vittük be az egyes hőmérsékleti értékeket. A második részfeladat – ismét emlékezzünk vissza a megoldásra –, a második részfeladat az átlaghőmérséklet számítása. Ez egy egyszerű matematikai művelet, itt egyetlen sorral el lehet végezni, hiszen az átlaghőmérsékletet úgy kell számítani, hogy a bevitt három hőmérsékleti adatot összeadjuk és elosztjuk hárommal. Mivel azonban külön részfeladatként kezeltük eddig, ezért ide is megjegyzés kerül: átlagszámítást végzünk. És végül a számítás. Az átlaghőmérsékletet az eddigi gyakorlatnak megfelelően AH-nak nevezzük el. Átlaghőmérséklet egyenlő… zárójelet kell alkalmazni a műveletek végrehajtásának sorrendje miatt… RH plusz DH plusz esti hőmérséklet: ezt kell elosztani hárommal.
  7-12.jpgElvégeztük tehát a második nagyobb részfeladatunkat is, a következő már csak a kiírás. Ez több apró részletből is áll, mindenesetre elkezdjük. Az első rész természetesen ismét a megjegyzés: kiírás következik. Mivel a bevitel során már majdnem teleírtuk az egész képernyőt, ezért itt kezdjük ismét azzal, hogy letöröljük. Az első kiírósorba pedig írjuk ki azt, hogy „reggeli hőmérséklet” – erre azért lesz szükség, mert a felhasználó a letörölt képernyőn már nem emlékszik arra, hogy milyen adatot vitt be. Tehát visszaírjuk a bevitt adatokat. Egyébként ez azért is jó lesz, mert – és itt most ismét emlékezzünk a blokkvázlatra – csillagokkal fogjuk ábrázolni a hőmérséklet nagyságát, tehát együtt fog szerepelni számmal és csillagokkal, tehát gyakorlatilag grafikonon ábrázolva a hőmérsékleti érték. Tehát PRINT, és akkor egy szöveg. „Reggel”, kettőspont, és ide visszaírjuk a reggeli hőmérsékletet. Ezek után következne a csillagok kiírása, de azelőtt még írjunk egy üres sort is, ismét csak az áttekinthetőség kedvéért. Most álljunk meg egy pillanatra és nézzük meg, hogy mit írtunk eddig, ez egyúttal a gépelésünk ellenőrzése is lesz.
  7-13.jpgTehát. A programot öt sorral kezdtük, a tízestől az ötvenes utasítássorig, egyszerű fejlécet készítettünk – emlékezzünk vissza arra, hogy ez csak és kizárólag a program azonosítását szolgálja. Ezek után még mindig egy programozási fogás, hogy megjegyzéseket írunk az egyes részfeladatok elé, így a későbbiekben ezeket könnyű azonosítani. Tehát a reggelt kódoltuk, úgy, hogy először a 70-es PRINT utasításban letöröltük a képernyőt, majd a 80-as INPUT utasítással megkértük a felhasználót, hogy írja be a számítógépbe a reggeli hőmérsékletet. Ezek után egy üres sort hagyunk, hogy szebb legyen a kiírási kép, és a dél adatainak bevitele következik: a 110-es INPUT utasítás az előzőhöz hasonlóan a déli hőmérsékletet várja… talán szebb lesz a program, ha ide is írok egy kettőspontot… tehát már láthatjuk, hogy érdemes volt végignézni a listát. Ezek után ismét üres sor következik, majd az esti adatok az előzőhöz hasonlóan: INPUT, üres sor. Ezek után következik az átlagszámítás. Az átlagot az AH változóban helyezzük el, és matematikai szabályoknak megfelelően úgy képezzük, hogy összeadjuk az RH, DH és EH változókat, s az értéket elosztjuk hárommal. S ezek után következik a harmadik nagy részlete a programkódolásnak, a kiírás megoldása. Mivel a kiírás valószínűleg igénybe fogja venni az egész képernyőnket, ezért letöröltük a bevitel után a képernyőt, ennek megfelelően viszont az adatokat ismét számmal visszaírjuk, hogy az ezek után következő, csillagokkal ábrázolt grafikont számszerűen is lássuk a képernyőn.

Ciklusok, ismétlés

7-14.jpgDr. Kocsis András Commodore 64
  15:24 Most pedig nézzük meg, hogyan lehet a csillagokból álló sorokat kódolni. Először is állapodjunk meg abban, hogy az alapművelet itt egyetlen csillagnak a kiírása, és ezt az alapműveletet mi annyiszor fogjuk ismételni, ahány csillagot egy sorba ki kell írni. Hogyan valósítható meg ez kód szintjén? A legkézenfekvőbb megoldás az, hogy annyi csillagkiíró PRINT utasítást írunk a programba, ahány csillagot ki kell írni. Mint ahogy a képen látható, itt csak két utasítást írtunk – ha ezt végrehajtjuk, akkor a feladatot korrektül végrehajtja. (Mint más esetekben is, itt és a következő példákban is ' aposztróf áll " idézőjel helyett – L. A. D.) De ez egy nagyon fáradságos megoldás, hiszen az utasítást annyiszor kell leírni, ahányszor végre akarjuk hajtani.
  

7-15.jpg7-16.jpg

  7-17.jpgNyilván ennél van egyszerűbb megoldás is. Nevezetesen az, hogyha a csillagkiírási utasítás után egy GOTO utasítással visszatérünk erre az utasításra, ilyenkor kevesebbet kell írni – de mi történik akkor, hogyha ezt végrehajtjuk? Sajnos azt látjuk, hogy a csillagkiírásnak se vége, se hossza, a gép folytatja a csillagkiírást egészen addig, míg le nem állítjuk a programot. Tehát ez a megoldás sem megfelelő, ezt is valahogy módosítani kell. Tulajdonképpen mi az, ami ebből a megoldásból hiányzik? Ugye azt mondtuk, hogy egy sorba meghatározott számú csillagot kell kiírni, itt viszont a szám végtelen lett. Tehát a csillagkiírások közben számolni kell a kiírt csillagokat.
  7-18.jpg
  Hát erre föl kell vennünk egy külön változót, amelyben fogjuk számolni a csillagokat, és mondjuk azt, hogy minden egyes csillagkiírás után ezt a változót növelni fogjuk. Az első csillag után legyen ennek a változónak az értéke egy, a második után kettő, és így tovább. És ebből fogjuk tudni azt, hogy amíg a megfelelő számú csillagot ki nem írtuk, addig kell ezt a műveletet végrehajtani.
  7-19.jpg
  Itt látható ez a kódrészlet; a csillagkiíró utasítás után helyeztük ezt a – ciklusváltozó, úgy nevezzük ezt a változót – ciklusváltozó növelését, ezzel elérjük azt, hogy minden egyes csillagkiírás után ennek az értéke eggyel növekedjék, és hogyha például az a célunk, hogy tíz csillagot írjunk ki, akkor mindaddig, amíg ez az érték nem érte el a tízet, addig vissza kell mennünk a százas utasítássorra. Ha viszont már végrehajtotta a tíz kiírást, akkor a következő soron folytatódik a program. Még egy műveletet kell itt megemlíteni, nevezetesen azt, hogy ennek a ciklusváltozónak kell egy induló értéket adni, esetünkben ez nulla, azért, hogy az első csillag kiírása után az I értéke egy legyen. Ha most ezt a programszakaszt végrehajtjuk, akkor látható, hogy helyesen működik.
  7-20.jpg
  Egyébként megjegyezzük, hogy ez az úgynevezett hátultesztelő ciklusszerkezet, mivel a folytatás, illetve befejezés feltételét a ciklus végrehajtása után ellenőrizzük. Megjegyezzük azt is, hogy itt nem csak konstanst lehet meghatározni, tehát nem csak egy konkrét számértéket lehet beírni a 120. utasításba, hanem egy tetszés szerinti változót is, esetünkben például a reggeli hőmérséklet értékét, és ebben az esetben annyi csillagot fog kiírni, amennyi ennek a változónak az értéke. Ha például azt mondjuk: az RH 28, akkor huszonnyolc csillagot fog kiírni.
  
7-21.jpg7-22.jpg

  Ennél a BASIC-ben még egy egyszerűbb megoldás is van, méghozzá a FOR–NEXT utasításpár, amellyel egy korábbi adásban már megismerkedtünk. Ez annyiból kedvezőbb, hogy helyettünk dolgozik: a FOR utasítást kell az ismétlendő művelet elé írni, az ismétlendő művelet után pedig a NEXT utasítást. A FOR utasításban kell meghatározni azt, hogy a ciklusváltozót milyen értékről kell indítani és meddig kell növelni, és milyen lépésekben. A STEP után írt számérték ezt határozza meg. És minden egyes ciklusvégrehajtás után az I értéke a megfelelő módon növekedni fog, és hogyha elérte a végértéket, akkor pedig a program a NEXT utasítás utáni utasításon fog folytatódni.
  
7-23.jpg7-24.jpg

  Ezzel tulajdonképpen a feladatunkat megoldottuk, és a programban ezt az utóbbi megoldást fogjuk használni.

Programfuttatás

7-25.jpgPinkert László Commodore 64
  19:57 A csillagokat kiíró programrészletet beírva eljutottunk odáig, hogy az esti hőmérséklet is a képernyőre kerül. Ezek után az átlaghőmérsékletet fogjuk kiírni, és mivel ugyanolyan hőmérsékletérték, mint a többi, illetve ugyanúgy ábrázolni is fogjuk, ezért semmiben nem különbözik az előző háromtól. Tehát. A következő sorokban az következik, hogy PRINT, a szöveg természetesen az lesz, hogy átlag, és az átlaghőmérséklet értékét íratjuk ki. Ezek után következik a csíkhúzó ciklus, de előbb még egy üres sort hagyunk. (Rossz sorszámot ír – L. A. D.) …háromszáznyolcvan… annyi csillagot íratunk ki, amennyi az átlaghőmérséklet… következik a csillagot kiíró PRINT utasítás, pontosvesszővel lezárva, azért, hogy a csillagok egymás mellé kerüljenek. Végül a FOR utasításhoz tartozó NEXT, és két PRINT utasítás.
  

7-26.jpg7-27.jpg

  Kiírattuk tehát az átlaghőmérsékletet és a megfelelő számú csillagot. Ezzel befejeztük az utolsó részfeladat kódolását is. Most egészítsük ki még a programot egy üzenettel, amely jelzi, hogy a program futása véget ért. Tehát egy vége felirat. Előtte kihagyunk még egy sort, és kiíratjuk egyszerűen azt, hogy VÉGE. Végül egy END utasítással lezárjuk a programot. Készen vagyunk.
  7-28.jpg
  Nézzük végig még egyszer a programlistát. Az első öt sorban fejlécet készítettünk, majd az első három részfeladatként beolvastuk a reggeli, déli és esti hőmérsékletet. Átlagszámítást végzett a 170. sor, majd következett a kiírás. Ez is reggeli, déli, esti hőmérséklet, majd ezek után az átlaghőmérséklet kiírása, egy üzenet, hogy vége, és a programmal elkészültünk. Most következik az, hogy kipróbáljuk. Tehát RUN utasítást adok.
  22:47 Kérdés: reggeli hőmérséklet. Öt fok. Déli hőmérsékletnek megadok húsz fokot. Esti hőmérsékletnek pedig mondjuk tizenhármat.
  
7-29.jpg7-30.jpg

  Máris képernyőn van az eredmény. A hőmérsékletek ugyanúgy visszaírva, ahogy bevittem azokat, és a reggelnél ellenőrizhetjük, hogy valóban öt csillagot látunk a képernyőn. Feltűnhet, hogy az átlaghőmérséklet törtszám, ami önmagában nem feltűnő, de természetesen egész számú csillagot rajzolt a képernyőre a program – ez akkor nyilvánvaló, ha meggondoljuk, hogy egy ciklussal írattuk ki a csillagokat, amely nem figyeli azt, hogy a ciklusváltozó értéke megegyezzen a határral, vagyis hogy valóban az AH értékét érje el, hanem amennyiben azt meghaladta – és ez itt nyilván a tizenharmadik csillag kirajzolása előtt következett be –, akkor a program futása befejeződött, illetve a csillagok kirajzolása befejeződött. Ezek után már csak a VÉGE üzenet következik, és a READY üzenettel jelzi a számítógép, hogy várja újabb parancsainkat.

Értékellenőrzés

7-31.jpgHerneczki Katalin Commodore 64
  24:04 Programunk látszólag helyesen működik. Én azonban szeretnék néhány más értéket is megpróbálni. A reggeli hőmérséklet legyen negatív mondjuk –5 fok. A déli hőmérséklet pedig ötvenöt fok, az esti hőmérséklet mondjuk egy fok.
  (Az eredményképernyő felirataiból láthatóan itt a programnak egy másik változata fut – L. A. D.)
  7-32.jpg
  Eredményként átlaghőmérsékletnek tizenhét fokot kaptunk – igen ám, de a reggeli hőmérsékletnél, a mínusz öt foknál egy csillag jelent meg. Déli hőmérsékletként elfogadta az ötvenöt fokot. Tehát ez a feladat most nem úgy működik, ahogy ezt definiáltuk, vagyis nem csak a 0 és a 30 közötti értékeket fogadja el. Ezért feltétlenül be kell valamilyen ellenőrzést is iktatnunk.
  Ha programunkat helyesen terveztük, akkor könnyen megtaláljuk azt a helyet, ahová a hőmérsékleti adatok ellenőrzése elhelyezhető. A tervezés első szintjén három dobozunk volt, ezek közül az első az Olvasások nevű doboz volt, ez egy résztevékenység. Itt olvassuk be a reggeli, az esti és a déli hőmérsékletet. Nos, ez az a hely, ahova az ellenőrzést be kell iktatni.
  7-33.jpg
  Ahhoz, hogy a programunk teljesen helyesen működjön, az Olvasás résztevékenységet további elemekre kell bontani, finomítani kell, be kell iktatni az adatellenőrzést. Nézzük meg ezt a reggeli hőmérsékletnél. Beolvasom a reggeli hőmérsékletet, megvizsgálom, azaz megnézem, hogy valóban nulla foknál nagyobb-e, és harminc fokot pedig nem haladja meg. Az eredmény pedig vagy jó, tehát a feltételnek megfelelő, vagy pedig rossz, a feltételnek nem felel meg. Általában ilyen esetben, tehát a rossz esetben hibaüzenetet illik írni a programban. Teljesen hasonló a helyzet a déli és az esti hőmérsékleti adatok kezelésénél, tehát olvasás, vizsgálat követi egymást. Még egy magyarázattal tartozunk: mit jelent a két kis karika a Jó, illetve Rossz nevű dobozok jobb felső sarkában? Nos, ez hierarchiadiagram esetében az IF–THEN szerkezet, a szelekció jele, tehát vagy az egyik kerül végrehajtásra, vagy pedig a másik, egymást kizáró módon.
  Kedves nézőinknek javasoljuk, hogy gyakorlásként oldják meg most már ezt a feladatot teljesen helyesen, vagyis az adatellenőrzést is beépítve. Egyébként gyakorlásként – mind a programtervezés, mind a kódolás gyakorlására – hasznos feladatokat találnak a tankönyvben. Jó munkát kívánunk, viszontlátásra.
  26:43