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.