Oszd meg!

Add a Twitter-hez Add a Facebook-hoz Add a Startlaphoz Add az iWiW-hez Add a Google Reader-hez

Közösség

Belépés

E-mail cím:
Jelszó:

Változók beolvasása billentyűzetről - ReadLn

Változók beolvasása billentyűzetről - ReadLn

     A Turbo Pascal-ban a szabványos adatbeviteli (standard input) periféria a billentyűzet. A read és a readln eljárások felfüggesztik a program futását és a billentyűzetről az <Enter> lenyomásáig beolvassák az adatokat:

            read(paraméterek);

            readln(paraméterek);

A paraméterek csak numerikus vagy szöveges változók lehetnek, amelyek ilyen módon kapnak értéket. Ennek megfelelően a read, readln eljárásokat csak egész és valós számok, karakterek illetve sztringek beolvasására használjuk. (A boolean típusú változók értékét nem lehet billentyűzetről beolvasni! A boolean logikai típus, igaz/hamis értéket vehet fel. Ismerjük az Excelből, Itt 11. osztályos anyag.)

A read eljárás felfüggeszti a program futását és várakozik az adatok billentyűzetről történő bevitelére. A read utasítás a begépelt adatokból sorra értéket ad a paramétereknek. Ha kevesebb adatot adunk meg, mint ahány paraméter szerepel a paraméterlistán, akkor további adatok megadására vár az eljárás. Ha viszont több adatot gépeltünk be, mint amennyi szükséges, akkor a fel nem dolgozott adatokat a következő read eljárás kapja.

A readln eljárás hívása után az adatbeviteli puffer fel nem dolgozott része nem adódik át a következő readln eljárásnak. Ha több adatot adunk meg az <Enter> lenyomásáig mint amennyire a readln eljárásnak szüksége van, akkor a „felesleges” adatok elvesznek.

Általában a változó értékét a program felhasználójától szeretnénk megtudni. A ReadLn(változólista); parancs segítségével a program futása alatt a felhasználó billentyűzeten keresztül adhatja meg a változók értékét, azt a villogó kurzor helyére beírva, majd entert ütve.

     Például szeretnénk egy olyan programot készíteni, amelyet ha elindítunk, akkor a számítógép előbb megkérdezi a nevünket, majd miután megadtuk (pl. beírtuk hogy Micimackó) üdvözöl bennünket (kiírja, hogy Szia Micimackó!). Mivel a nevünk valamilyen szó, ezért a név tárolására egy string típusú változót fogunk használni.

A tömör algoritmus, mely leírja a teendőket

Be(nev)

Ki(’Szia’, nev)

A Be(nev) kódolásakor egy kis segédszöveget is meg kell jelenítenünk, hogy mit is várunk a villogó kurzor helyére! Ezért programunk a következőképpen néz ki:

program Pelda08;
var nev:string;
begin
 write('Kérlek add meg a neved: ');
 ReadLn(nev);
 WriteLn('Szia ' ,nev, '!');
end.

     Miután a programot elindítottuk, elsőként lefut a write parancs, ami kiír egy mondatot a képernyőre és a kurzor a kiírt szöveg mögött marad. Majd lefut a ReadLn parancs és ahol állt a kurzor, ott kéri a nev változó értékének a megadását. Tehát a következő jelenik meg a képernyőn:

Kérlek add meg a neved: _

     A ReadLn parancsnál a program addig vár, amíg nem írunk be valamilyen nevet, majd nem nyomjuk meg az ENTER billentyűt. Ekkor a kurzor a ReadLn végrehajtásának eredményeként a következő sor elejére ugrik, majd folytatódik a program futása. A továbbiakban se feledkezz meg a már említett jó tanácsról!

     A következő parancs a programban a WriteLn, amely kiírja az üdvözlő szót (Szia), majd a nev változó értékét jeleníti meg (amit előtte beírtunk, bekértünk a ReadLn parancsnál) és végül kirak a képernyőre egy felkiáltójelet, majd a kurzort a következő sor elejére teszi.

 

Most ez olvasható (?) a képernyőnkön:

Kérlek add meg a neved: Micimackó  (MJ: ezt a billentyűről vittük be)

Szia Micimackó!

_

     A program használhatóságának szempontjából fontos, hogy mielőtt bekérünk, beolvasunk valamilyen változót a ReadLn(valtozonev) segítségével, írjuk ki a képernyőre, hogy minek a megadását várjuk a felhasználótól. Ezt legcélszerűbb a write paranccsal kiírni, mivel ekkor a felhasználó rögtön a kiírt szöveg után, mögött adhatja meg a változó értéket. Ha itt write helyett WriteLn-t használnánk, akkor a szöveg kiírása után a kurzor új sorba ugrana, így a beolvasásnál a felhasználó a következő sor elejére írná be a nevét. Logikailag természetesen ez is ugyanolyan jó, de az előzőnek szebb formája van. (Na, ezt is jegyezd meg újra és írd le magadnak kedves 10. c-s!!)

     Hasonlóan, mint a write, WriteLn parancsoknál, a ReadLn parancsnak is van egy read verziója. Ennek azonban elsősorban a külső állományokból való beolvasásnál van jelentősége. A különbséget a kettő között egy rövid példán szemléltetjük: (az érdeklődők kedvéért, lásd a korábbi intelmemet)

program Pelda09;
var a,b,c:integer;
begin
 write('Irj be 3 szamot helykozzel elvalasztva: ');
 read(a,b);
 read(c);
 WriteLn('A beolvasott szamok: ',a,' ',b,' ',c); {figyelj az idézőjelekre}
 write('Irj be masik 3 szamot helykozzel elvalasztva: ');
 ReadLn(a,b);
 read(c);      { mivel az előző ReadLn parancs új sorra ugrott, ezért itt ez
                                a read parancs keri billentyuzetrol a c ertek megadasat }
  WriteLn('A beolvasott szamok: ',a,' ',b,' ',c);
end.

     Ha lefuttatjuk a programot, a következő történik:

Irj be 3 szamot helykozzel elvalasztva: 3 5 7
A beolvasott szamok: 3 5 7
Irj be masik 3 szamot helykozzel elvalasztva: 2 4 6
8
A beolvasott szamok: 2 4 8
_

     Amint láttuk a példánkban az első read(a,b) beolvassa a 3, 5 számokat, de mivel ezeket read-el olvastattuk be a legközelebbi beolvasás innen folytatódhat. Ezért a következő read(c) parancsnál nem kell megadnunk billentyűzeten keresztül semmit, itt automatikusan beolvassa a 7-es számot.

     Miután ismét megadtunk három számot, a ReadLn(a,b) parancs beolvassa ezek közül a 2, 4-es számokat (a két szám után megadott többi rész elvész), majd mivel ezt a ReadLn (read line) utasítással végeztettük el, a legközelebbi beolvasás a következő sorban fog folytatódni. Ezért a read(c) már a következő (új) sor elején várja a c változó értékének billentyűzeten keresztüli megadását. Itt miután beírtuk a 8-as számot, az bekerül a c változóba.
     Mivel a mi programjainkban általában egyszerre csak egy változó értékét fogjuk bekérni, ezért szinte mindig a ReadLn parancsot fogjuk használni a billentyűzetről való beolvasáshoz.

Feladat: Készítsünk programot, amely billentyűzetről beolvassa a négyzet oldalának a hosszát (aminek egész számot adunk meg), majd a megadott érték alapján kiszámolja a négyzet kerületét és területét. Majd kiírja az értékeket a megfelelő szöveg kíséretében! (a számolt értékeket még nem tároljuk)

Megoldás: A ReadLn parancs segítségével beolvastatjuk a négyzet oldalának hosszát egy a változóba. Beolvasás előtt természetesen kiírjuk a felhasználónak hogy milyen adatot kérünk. Miután a felhasználó beírta a kért adatot, kiíratjuk a négyzet kerületét a matematikából jól ismert k = 4*a képlet segítségével, majd hasonlóan a négyzet területét a T = a*a képlet segítségével.

program Pelda10a;
var a:integer;
begin
 write('Kerem a negyzet oldalanak hosszat: ');
 ReadLn(a);
 WriteLn('A negyzet kerulete: ',4*a);
 WriteLn('A negyzet terulete: ',a*a);
end.

Ha szeretnénk a kerületet és a területet is megőrizni (változókban tárolni), akkor használhatunk ezekre például egy k és egy t változót, melyekbe először kiszámoljuk, nekik átadjuk a számolt kerületet ill. területet, majd utána kiírjuk ezeknek a változóknak az értékét. Programunk ebben az esetben így néz ki:

program Pelda10b;
var a,k,t:integer;
begin
 write('Kerem a negyzet oldalanak hosszat: ');
 ReadLn(a);
 k:=4*a;
 t:=a*a;
 WriteLn('A negyzet kerulete: ',k);
 WriteLn('A negyzet terulete: ',t);
end.

  A fenti példában is láthattuk, hogy egy feladatnak több helyes megoldása is lehet. Próbáljuk meg ezek közül mindig az áttekinthetőbb megoldást megkeresni.

 Feladat: Készítsünk hasonló programot a téglalap kerületének és területének kiszámítására. Feltételezzük, hogy itt is a téglalap oldalainak hossza egész szám.

Megoldás:

Be: a

Be: b

Ki: ’Kerület: ’, 2*(a+b)

Ki: ’Terület: ’, a*b

 

 

A program a négyzet kerületének és területének kiszámításához hasonló lesz, de itt két értéket fogunk beolvasni: a téglalap a és b oldalának a hosszát, majd ezekből számoljuk ki a kerületet és a területet a matematikából jól ismert képletek segítségével. Egy helyes megoldás a feladatra:

program Pelda11;
var a,b:integer;
begin
 WriteLn('Kérem a téglalap méreteit.');                  {fő szöveg, tájékoztató szöveg}
 write('a = ');                                                               {további segítő szöveg}
 ReadLn(a);                                                               {adatbekérés ReadLn-nel}
 write('b = ');
 ReadLn(b);
 WriteLn('A téglalap kerülete, k = ',2*(a+b));    {itt, az eredmény megjelenítésnél is két rész van}
 WriteLn('A téglalap területe, T = ',a*b);              {egy tájékoztatás egy érték}
end.

A fenti feladat megoldását is írd át, úgy hogy a k (kerület) és t (terület) értékét számolod, tárolod, és kiírod!

Javaslat: A változókat billentyűzetről egyenként olvastassunk be ReadLn segítségével a megfelelő segédszöveg előzetes megjelenítése mellett.