Procedura Read si Readln pentru citire

Instructiunea de citire

In mod obisnuit, tastatura este desemnata ca dispozitiv-standard de intrare.

Citirea datelor de la tastatura se realizeaza prin apelul procedurilor predefinite read sau readln. Aceste doua proceduri apartin unit-ului System care este deasemenea predefinit(nu trebuie de declarat). Lista parametrilor actuali a unui apel read sau readln poate sa includa variabile de tip integer, real, char si string.

Astfel apelul read(x) are urmatorul efect. Daca variabila x este de tip integer sau real, atunci este citit intregul sir de caractere care reprezinta valoarea intreaga sau reala. Daca x este de tip char, procedura citeste un singur caracter.

Apelul read(x1 , x2, …,xn) este echivalent cu read(x1); read(x2); … ;read(xn).

Datele numerice introduse de la tastatura trebuie separate prin spatii sau caractere sfarsit de linie. Spatiile dinaintea unei valori numerice sunt ignorate. Sirul de caractere care reprezinta o valoare numerica se conformeaza sintaxei constantelor numerice de tipul respectiv. In caz contrar, este semnalata o eroare de intrare-iesire.

De exemplu, fie programul:

Program exemplu;{Citirea datelor numerice de la tastatura}

Var i, j : integer; xl251v7

x,y:real;

begin

read(i, j, x, y);

writeln('Ati introdus: ');

writeln('i=', i);

writeln('j=', j);

writeln('x=', x);

writeln('y=', y);

end.

In care sunt citite de la tastatura valorile variabilelor i, j, x, y. Dupa lansarea programului in executie, utilizatorul tasteaza:

1

2

3.0

4.0

Pe ecran se va afisa:

Ati introdus:

i=1

j=2

x=3.0000000000E+00

y=4.0000000000E+00

Acelasi efect se va obtine si la tastarea numerelor intr-o singura linie:

1 2 3.0 4.0

Procedura readln citeste datele in acelasi mod ca si procedura read. Insa, dupa citirea ultimei valori, restul caracterelor din linia curenta se ignora. Pentru exemplificare, prezentam programul urmator:

Program exemplu1; {Apelul procedurii readln}

Var i, j :integer;

x,y : real;

begin

writeln('Apelul procedurii read');

read(i, j);

read(x, y);

writeln('Ati introdus:');

writeln('i=', i, 'j=', j, 'x=', x, 'y=', y);

writeln('Apelul procedurii readln');

readln(i,j);

readln(x, y);

writeln('Ati introdus:');

writeln('i=', i, 'j=', j, 'x=', x, 'y=', y);

end.

La executia instructiunilor read(i, j);read(x, y); valorile numerice din linia introdusa de utilizator

1 2 3 4

vor fi atribuite variabilelor respectiv i, j, x, y. La executia instructiunii readln(i, j); valorile numerice 1si 2 din linia 1 2 3 4 vor fi atribuite variabilelor i si j. In continuare calculatorul executa instructiunea readln(x, y); adica va astepta introducerea unor valori pentru x si y.

Mentionam faptul ca apelul procedurii readln fara parametri va forta calculatorul sa astepte actionarea tastei . Acest apel se utilizeaza pentru a suspenda derularea programului, oferindu-i utilizatorului posibilitatea sa analizeze rezultatele afisate anterior pe ecran. In programul de mai jos observam ca acesta se termina cu instructiunea readln. Ce rol are ea? Dupa ce un program isi incheie executia, se revine in mod automat in mediul in care se gaseste textul sursa. Rezultatele se pot vizualiza tastand ALT+F5. Pentru ca revenirea sa nu se faca automat (sa avem timp sa vedem rezultatul), vom utiliza instructiunea readln fara parametri. Efectul? Se va astepta sa se tasteze . In acest timp, avem posibilitatea sa vedem ce s-a tiparit.

Program exemplu;

Begin

Writeln(6);

Readln;

End.

Pentru a inlesni introducerea datelor, se recomanda ca apelurile read(…) si readln(…) sa fie precedate de afisarea unor mesaje sugestive. Exemple:

Write('Dati doua numere:'); readln(x, y);

Write('Dati un numar intreg:'); readln(i);

Write('x='); readln(x);

Write('Raspundeti cu D sau N:'); readln(c);

Unii incepatori sau cunoscatori ai limbajului BASIC cred ca se poate face o citire in felul urmator: readln('Dati n= ', n); iar altii nu sesizeaza diferenta intre un sir si valoarea identificatorului: readln('n');.

In cazul in care valoarea introdusa nu corespunde tipului variabilei declarate se va semnala o eroare de executie si astfel se va iesi automat din program. Pentru a evita aceasta iesire se poate testa daca datele introduse corespund tipului variabilei respective prin introducerea inaintea instructiunii read sau readln a directivei {$i-} si dupa instructiune - {$i+}. Aceste directive fac posibila continuarea rularii programului fara a iesi din el. Si pentru a verifica daca valoarea introdusa este corecta, verificam prin intermediul functiei predefinite IOResult care va returna un numar diferit in cazul unei erori, si va returna 0 daca nu exista nici o eroare. Ca exemplificare vom prezenta programul urmator:

Program ex;

Var a:integer;

Begin

Writeln('Dati o valoare pentru a!');

{$i-} readln(a);{$i+}

if IOResult<>0 then writeln('Ati introdus gresit!')

else begin a:=a+1; {marim valoarea lui a cu o unitate}

writeln('a=', a); end;

end.

Program exemplu;

Astfel daca in lipsa directivelor {$i-} si {$i+} dam lui a valoarea bicaz care este de tipul string se va semnala o eroare si se va iesi automat din program. Dar in prezenta lor programul va rula in continuare afisind mesajul Ati introdus gresit. Daca valoarea introdusa e de tipul integer se va mari valoarea variabilei cu o unitate si se va afisa noua valoare.

O larga intrebuintare o au procedurile read si readln in prelucrarea fisierelor.

Stim ca pentru deschiderea unui fisier pentru citire se apeleaza procedura reset(f) unde lui f ii este atribuit fisierul de tipul respectiv(text sau fisiere cu tip).Insa citirea datelor din fisier se face printr-o apelare de forma read(f, v), iar in cazul fisierelor de tip text se permite si apelarea readln(f,v) , care reprezinta citirea sffarsitului de linie din fisier.

O simpla apelare de tipul readln(f) va avea ca efect trecerea in fisier la linia urmatoare. O instructiune de forma readln(f,v1,v2,…,vn) este echivalenta cu secventa de instructiuni read(f,v1,v2,…,vn);readln(f); . Programul ce urmeaza afiseaza continutul fisierului FILE.TXT pe ecran.

Var f:text; c:char;

Begin

Assign(f,'FILE.TXT');

Reset(f);

While not eof(f) do

Begin

While not eoln(f) do

Begin

Read(f, c); {citeste c din f}

Write(c);

End;

Readln(f); {trece la linia urmatoare din f}

Writeln;

End;

Close(f);

Readln;

End.

Astfel fara de instructiunea de citire nu ne putem lipsi practic in nici un program Pascal.

download