Negyedik lecke

4. lecke: Gyakorlás




Eljött az idő, hogy végre programozzunk is egy kicsit. Az eddig megtanultakat felhasználva és némi újat is tanulva írjunk egy programot, ami szorzási feladatokat ad a felhasználónak és számolja menniyt hibázott illetve talált el. Az összeszorzandó számok lenyenek véletlenszerűek. Végjelre lépjen ki, nevezetesen arra, ha a felhasználó -1-et ír be eredménynek. A program pedig ablakban jelenjen meg. Mondjuk így:

Hogyan készíthetünk ablakot? Nagyon egyszerű, megrajzoljuk speciális karakterekből. Ezeket a kararktereket az ASCII kódjukkal írhatjuk be. Lenyomjuk a bal alt gombot majd a numpadon begépeljük a karakter kódját. Ha kíváncsi vagy arra mi mindent tartalmaz az ASCII kódtábla és mik az egyes karakterek kódjai látogass el a http://www.lookuptables.com/ oldalra. Szükség lesz még a karakterek színének állítására. Erre szolgál a:


TextColor(green);

Milyen színeket adhatunk meg? Ehhez nézd meg a Pascal help-jét. Mindenesetre jó tudni, hogy szavak helyett számokat is meg adhatunk (0-tól 15-ig). Ha már a színeknél járunk, érdemes megemlíteni, nem csak a betű színét lehet állítani, hanem a betű hátterének a színét is.

 TextBackGround(blue);

Ha szeretnénk, hogy az ekész képernyő ilyen színű legyen, töröljünk képernyőt közvetlenül utána. Következő probléma, amire nem tudjuk a választ a véletlen számok generálása. Létezik egy függvény ami megteszi ezt nekünk.

 valtozo := Random(100);

A valtozot eyenlőve tesszük egy véletlen számmal ami nulla és 99 közé esik, úgy hogy a 0 és a 99 is lehetséges érték. Magyarul [0, 99] zárt intervallumból választ véletlenszerűen egyet. Előfordulhat egy olyan feladat amikor a véletlen számnak 20 és 30 közé kell esnie. Ilyenkor tegyük a következőt. Generáljunk egy számot 0 és 10 között, majd adjunk hozzá 20-at. Így:

 valtozo := Random(10) + 20;

Ahhoz, hogy mindez működjön a program elején, vagy legalább is a szám generálás előtt be kell írni a következő sort:

 Randomize;

Remélem ezzel nem lesz gond, de ha mégis, akkor írjatok e-mailt, vagy használjátok a vendégkönyvet. Most már végre mindent tudunk, ami szükséges a program megírásához.

Természetesen én már meg is írtam és az oldal alján te is letöltheted. Most nem fogom az elejét ide bemásolni, mert feleslegesen foglalná a helyet. Az ablak megrajzolását mindenki megtalálja a forrásban, nincs semmi különös benne, egyszerű GoToXY();- és Write(); -ok sorozata. Kezdjük a kód tárgyalását a változókkal.


 var 
     { Az a szám amit a felhasználó beír. }
     eredmeny : Integer;
     { Ezekben számoljuk mennyit hibázott, illetve talált el. }
     talalat, hiba : Integer;            
     { Szorzásban szereplő tagok. Véletlen szerű értékeket kell adni neki. }
     elso_tag, masodik_tag :Integer;
     { Tartalmazza majd, hogy hány százalékát találtuk el a feladatoknak. }
     siker : Real;

Nézzük a főciklust. Mivel nem tudjuk hány szorzást számol ki a felhasználó, azt sem tudjuk hányszor kell futtatni a ciklust. Ezen oknál fogva csakis a feltételes ciklus jöhet szóba. Én az előltesztelős változatnál döntöttem, a feltétel pedig az, hogy az eredmény változó -1 e. Lássuk tehát!

 while (eredmeny <> -1) do
 begin
      GoToXY(57,7); Write(talalat);
      GoToXY(54,9); Write(hiba);
      GoToXY(24,9); Write('               ');
      elso_tag := Random(100);
      masodik_tag := Random(100);
      GoToXY(24,9); Write(elso_tag,' * ',masodik_tag,' = ');
      ReadLn(eredmeny);
      If (eredmeny = elso_tag * masodik_tag) Then
      begin
           talalat := talalat + 1;
      end
      Else
      begin
           hiba := hiba + 1;
      end;
 end;

A ciklusmag első három során nincs mit magyarázni, egyszerű szövegkiírás a kívánt pozícióba. A harmadik sorban azért írok ki szóközöket, mert oda kerül a felatad. Ha már nem először fut a ciklusunk akkor az előző iterációban szereplő feladványt le kell törölni. Ezek után jöhet a két összeszorzandó tag generálása. A fent tárgyalt módon történik. Kiírjuk a szorzást a képernyőre és várunk, hogy a felhasználó beírja az általa helyesnek vélt megoldást. Ha megtette, eldöntjük helyesen számolt e. Mivel lehet eldönteni? Mi mással mint az if then else -el. Összehasonlítjuk a kapott eredményt a két szám tényleges szorzatával. Ha egyezik, növeljük talalat változó értékét. Ha nem, akkor a hiba változóét. Ezzel véget is ért a ciklus tárgyalása.

A ciklus után még van egy feladatunk. Ki kell számolnunk a találatok és hibák arányát.


 hiba := hiba - 1;
 If (talalat + hiba <> 0) then
 begin
      siker := talalat / (talalat + hiba) * 100;
      GoToXY(23, 9); Write('               ');
      GoToXY(24, 9); Write(siker:0:0,'% talalat.');
 end
 Else
 begin
      GoToXY(23, 8); Write('               ');
      GoToXY(24, 8); Write('Egyet azért');
      GoToXY(22, 9); Write(' megprobálhattál ');
      GoToXY(25,10); Write(' volna!! ');
 end;

Hibából ki kell vonni egyet, hiszen a -1 végjelet mindenképp hibás eredményként könyveli el a ciklus. A nullával való osztás hibát eredményezne, ezért egy feltétel segítségével ellenőrizzük próbált-e megfejteni legalább egy feladatot. Ha igen, kiírjuk a képernyőre hány százalékos a teljesítménye.

Ezzel be is fejeztem ezt a leckét. Legközelebb az alprogramokról és függvényekről lesz szó.

A leckében tárgyalt program kódjat letöltheted itt!

Vissza