Sunteți pe pagina 1din 10

5.

Instruc•iuni Pascal neiterative :

atribuire, compus•, vid•, citire/scriere, condi•ionale.

Exist• mai multe instruc•iuni Pascal, toate notate prin metasimbolul <ins>.
Exist• instruc•iuni Pascal simple în interiorul c•rora nu se afl• alte instruc•iuni •i
instruc•tiuni structurate, compuse din alte instruc•iuni. Deci

<ins> ::= <ins_simple> |

<ins_structurate>

unde

<ins_simple> ::= <ins_atribuire> |


<ins_goto> |
<ins_vid•> |
<apel_procedur•>
iar

<ins_structurate> ::= <ins_compus•> |


<ins_iterative> |
<ins_condi•ionale> |
<ins_with>

Instrunc•iunile repetitive vor fi prezentate în lec•ia urm•toare (lec•ia 6),


instructiunea With va fi explicat• în lectia 7 ( tipul Record ), apelul de procedur•
în lec•ia 8, iar celelalte vor fi prezentate în continuare.

35
5.1. Instruc•iunea de atribuire.

Instruc•iunea de atribuire are scopul de a da valori unor variabile. Ea are


sintaxa: <ins_atribuire> ::= <variabil•> := <expresie> unde
<variabil•> •i <expresie> sunt de acela•i tip. Tipurile tv •i te ale elementelor
<variabil•> •i <expresie> pot fi întreg, real, boolean, enumerare sau orice tip
structurat cunoscut în programul în care apare instruc•iunea, cu excep•ia tipului
fi•ier.
Instructiunea cere mai întâi evaluarea expresiei din partea dreapta a
semnului de atribuire ":=". Dac• tv •i te sunt identice atunci valoarea expresiei
este atribuit• variabilei din stânga semnului de atribuire. Dac• aceste tipuri difer•
atunci se semnaleaz• eroare, exceptând patru cazuri care vor fi prezentate în
continuare:
1) Astfel, dac• te este Integer iar tv este Real atunci se converte•te valoarea
întreag• a expresiei într-o valoare real• care se atribuie variabilei.
2) Dac• tv •i te sunt tipuri enumerare sau subdomeniu cu acelasi tip de baz• •i
dac• valoarea expresiei apar•ine tipului tv, aceast• valoare se atribuie
variabilei.
3) Dac• tv •i te sunt mul•imi atunci este posibil ca unul sau ambele tipuri s• fie
subdomenii ale aceluia•i tip ordinal. Atribuirea este permis• dac• valorile
din mul•imea rezultat sunt incluse în tipul de baz• al variabilei din stânga
semnului de atribuire.
4) A patra excep•ie se refer• la tipul String; tv •i te putând fi tipuri String
diferite. Atribuirea este corect• dac• valoarea ei se poate atribui variabilei
din stânga atribuirii.
Sintactic, în partea stâng• a semnului de atribuire, <variabila> poate fi o
variabil• simpl• sau o component• a unui tablou sau alt tip de dat• structurat•. De
asemenea, ea poate fi un tablou atunci când •i în partea dreapt• este un tablou de
acela•i tip. În acest caz prin A := B, se în•elege o scriere condensat• a atribuirilor

36
A[i]:=B[i] pentru toate valorile indicelui i aflate în tipul de index folosit în
definirea tablourilor A •i B.
În general, este posibil• atribuirea A := B când •i A •i B sunt variabile de
acela•i tip. În toate cazurile se cere ca partea dreapt• a atribuirii s• aib• o valoare
anterioar•, altfel vom spune c• variabila B este neini•ializat•, iar atribuirea va
conduce la erori logice în execu•ia programului.

5.2. Instruc•iunea compus• •i instruc•iunea vid•.

În definirea unor instruc•iuni structurate sau a construc•iei <bloc>, se cere


folosirea unei singure instruc•iuni, a•a cum se va vedea în continuare. Pentru a
putea include în aceste locuri grupuri de instruc•iuni, în Pascal este posibil s•
definim o succesiune de instruc•iuni ca o singur• entitate. Aceast• entitate se
nume•te instruc•iune compus• •i are sintaxa

<ins_compus•> ::= Begin


<ins> {; <ins> }
End

În limbajul Pascal caracterul ';' separ• dou• instruc•iuni; el nu are rolul de a


marca sfâr•itul acestora. Adesea îns• întâlnim caracterul ';' în fa•a cuvântului
End. În acest caz se considera c• între ';' •i End se afla o instructiune vida:
<ins-vida> ::=

Cu toate c• instruc•iunea vid• nu execut• nimic, este posibil s• întâlnim


situa•ii în care avem nevoie de aceast• instruc•iune. De exemplu, dac• un anumit
rezultat întreg r dorim s• îl corect•m dup• urm•toarea regul• :

37
“dac• r este pozitiv •i impar atunci r:=r+1, iar dac• r este negativ atunci
r:=r−1”,

secven•a urm•toare

If r>0 Then
If Odd(r) Then r:=r+1
Else r:=r−1;

este gre•it• pentru c• ea este interpretat• astfel :

If r>0 Then
If Odd(r) Then r:=r+1
Else r:=r−1;

Scrierea corect• implic• instruc•iunea vid• •i este urm•toarea :

If r>0 Then
If Odd(r) Then r:=r+1
Else { instruc•iunea vid• }
Else r:=r−1;

Subliniem îns• c• este interzis• folosirea instruc•iunii vide, deci •i a


caracterului ';' în fa•a cuvântului Else :

If a < b Then Min:=a ; { aici, caracterul “;” este interzis !!! }


Else Min:=b ;

Scrierea corect• este :

If a < b Then Min:=a { am eliminat caracterul “;”}


Else Min:=b ;

5.3. Citirea •i scrierea datelor.

38
Pentru transferul datelor între memoria intern• •i suportul extern de date se
folosesc procedurile Read •i Write. De•i procedurile vor fi prezentate mai târziu,
d•m semnifica•ia acestor dou• proceduri pentru a putea da în continuare exemple
complete de programe Pascal.

Procedura Read se folose•te pentru transferul datelor în memoria intern•.


Sintaxa apelului acestei proceduri este

Read ( <list•_variabile> )

Efectul acestui apel este de atribuire a unei valori fiec•rei variabile


prezente în lista de variabile. Valorile se iau de pe suportul extern începând din
punctul în care s-a ajuns dup• citirea anterioar•. Valorile sunt astfel luate încât s•
corespund• tipului variabilei corespunz•toare. Dac• acest lucru nu este posibil
atunci se va semnala o eroare în execu•ie.
Ca exemplu, dac• X este o variabila de tip întreg iar U •i V sunt variabile
de tip caracter, instructiunea

Read(X, U, V)
cere atribuirea unei valori întregi variabilei X •i a câte o valoare caracter
variabilelor U •i V.
Dac• pe suportul extern se afl•
125 A
atunci X va primi valoarea 125, variabila U va primi valoarea ’ ’ (caracterul
blanc), iar V va primi valoarea ’A’.
Daca îns• suportul extern con•ine
12.4 A
execu•ia se va termina cu eroare întrucât valoarea 12.4 nu are tipul întreg. Tot cu
eroare se va termina execu•ia când pe suportul extern avem
TEXT 25
întrucât prima valoare întâlnit• nu este un num•r întreg.

39
Procedura Write asigur• transferul informa•iei din memoria intern• pe
suportul extern. Apelul procedurii are forma

Write ( <list•_expresii> )

Efectul acestui apel este tip•rirea valorilor expresiilor din <list•_


expresii>. Bineîn•eles c• pentru a tip•ri aceste valori se vor evalua mai întâi
expresiile prezente în list•. Valorile expresiilor sunt tip•rite dar nu sunt re•inute
în memorie •i nu pot fi folosite în alte instruc•iuni din program. Dac• dorim s•
folosim valoarea unei expresii •i în alte instruc•iuni atunci o vom atribui mai întâi
unei variabile •i vom folosi aceast• variabil• atât în <list•_write> cât •i în
celelalte instruc•iuni.
Pentru a în•elege mai bine procesul de introducere •i extragere a datelor
vom folosi no•iunea de înregistrare. Prin înregistrare vom în•elege informa•ia pe
care o transfer• la un moment dat o unitate periferic•. Pentru imprimant• o
înregistrare va fi un rând al hârtiei de scris (listingului), a carei lungime depinde
de imprimanta folosit• (de obicei 80 sau 132 de caractere).
Pe suportul extern datele de transferat se afl• scrise, sau vor fi tip•rite pe o
succesiune de înregistr•ri. La procedurile Read •i Write atunci când se epuizeaz•
o înregistrare se începe o alt• înregistrare. Adeseori este îns• necesar s• se treaca
la o alt• înregistrare înainte de a fi epuizat• precedenta. Pentru aceasta se pot
folosi procedurile Readln •i Writeln, care au sintaxa •i semnifica•ia procedurilor
Read, respectiv Write, dar cer în plus ca la terminarea execu•iei lor s• se treac• la
începutul unei noi înregistrari. Astfel dac• instruc•iunile

Write (1); Write (2); Write (3);


vor tip•ri pe ecran :
123
instruc•iunile
Writeln (1); Writeln (2); Writeln (3);

vor avea ca rezultat pe ecran

40
1
2
3

5.4. Instruc•iuni condi•ionale.

Exist• dou• instruc•iuni Pascal care permit execu•ia unor instruc•iuni în


func•ie de îndeplinirea unor condi•ii: instruc•iunile If •i Case.

Instruc•iunea If are sintaxa

If <cond> Then <ins1>


sau
If <cond> Then <ins1> Else <ins2>

unde <cond> este o expresie logic• ,iar <ins1> •i <ins2> sunt instruc•iuni Pascal.
Subliniem c• dup• cuvântul Then •i în fa•a cuvântului Else nu poate fi scris
caracterul ';' (deci nu poate apare •i o instruc•iune vid• ) .
În ambele variante instruc•iunea cere mai întâi evaluarea expresiei logice
<cond>. Dac• valoarea ob•inut• este True atunci se execut• instruc•iunea <ins1>
cu care se încheie execu•ia instruc•iunii If . Dac• valoarea ob•inuta este False
atunci, în cazul variantei a doua se execut• instruc•iunea <ins2>, iar în cazul
primei variante nu se execut• nimic.
Aceast• instruc•iune permite scrierea în Pascal a structurilor alternative •i
este echivalent• ca semnifica•ie cu propozi•ia Pseudocod

Dac• <cond> Atunci <ins1>


Altfel <ins2>
Sf_Dac•

41
Ca un prim exemplu, pentru a efectua atribuirea V:= |x| în Pascal putem scrie

If x < 0 Then V :=−x Else V := x

Ca exemplu vom scrie un program de rezolvare a ecua•iei de gradul al doilea.

Program Ecgr2; {Rezolvarea ec.de grad 2 }


Var a, b, c, {Coeficientii ecuatiei }
d, {Discriminantul ecuatiei}
r, {variabila de lucru}
x1, x2: Real; {Rezultatele}
kod: Integer; {Indicator_rezultat}
{0=rad.reale, 1=complexe}
Begin
Writeln(’Se rezolva ecuatia de gradul doi’);
Writeln(’Dati coeficientii a, b, c’);
Readln(a, b, c);
d := b*b - 4*a*c;
If d < 0 Then
kod := 0
Else
Begin
kod := 1;
r := sqrt(d);
x1 := (-b-r)/(a+a);
x2 := (-b+r)/(a+a)
End;
If kod = 0 Then Write(’Ec. nu are radacini reale’)
Else Write(’Radacinile ecuatiei sunt:’, x1, x2);

42
Readln
End.

Instruc•iunea Case permite selectarea unei instruc•iuni dintr-o mul•ime de


instruc•iuni marcate, în func•ie de valoarea unui selector. Sintaxa instruc•iunii
este

Case <eo> Of
<lista-c> : <ins> { ;
<lista-c> : <ins> {
[ Else <ins> ]
End

unde <eo> este o expresie de tip ordinal, <lista-c> este o list• de constante-case,
fiecare constant•-case având tipul ordinal al expresiei <eo>. În <lista-c> în locul
unei constante poate apare •i un subdomeniu c1..c2 pentru o scriere mai
condensat• în cazul când constantele sunt consecutive.

Execu•ia instruc•iunii Case cere mai întâi evaluarea expresiei <eo>,


ob•inându-se o valoare v, care constituie valoarea selectorului. Apoi se caut• în
listele de constante-case constanta egal• cu v •i se execut• instruc•iunea a c•rei
etichet• este chiar v.
Dac• nu exist• nici o instruc•iune cu eticheta v atunci, în cazul c• este
prezent cuvântul Else se execut• instruc•iunea ce urmeaz• dup• acest cuvânt,
altfel nu se execut• nici o instruc•iune.

Urm•torul program analizeaz• un caracter c dat de la tastatur•, precizând


dac• acesta este liter• (mare sau mic•, vocal• sau consoan•), cifr• sau caracter
special.

43
Program Case_Caracter; { Analiza unui caracter c. }
{ daca este litera, cifra sau alt caracter ? }
Var c : Char; { Litera poate fi mica/mare, }
{ vocala/consoana }
Begin
Write (’ Dati un caracter ’); Readln(c);

Case c Of
’a’..’z’ : Begin
Write (’ Este litera mica,’);
Case c Of
’a’,’e’,’i’,’o’,’u’ : Write (’ vocala.’)
Else Write (’ consoana.’)
End
End;
’A’..’Z’ : Case c Of
’A’,’E’,’I’,’O’,’U’ : Write (’ Este litera mare, vocala.’)
Else Write (’ Este litera mare, consoana.’)
End;
’0’..’9’ : Write (’ Este o cifra. ’);
Else Write (’ Este un caracter special.’);
End;
Readln
End.

Se observ• în exemplul dat c• o instruc•iune Case poate fi con•inut• în


alt• instruc•iune Case •i de asemenea dac• pe o ramur• dorim s• scriem mai
multe instruc•iuni, acestea vor fi grupate într-o instruc•iune compus• (Begin ...
End).

44