3. Limbajul Pascal : elementele limbajului, structura programelor, tipuri simple de date.

Cu toate c• limbajul Pascal a fost conceput pentru înv••area program•rii, el este folosit ast•zi la rezolvarea celor mai diverse probleme, de orice nivel.

3.1. Vocabularul •i sintaxa limbajului.

Limbajul Pascal este construit folosind un alfabet ce con•ine caracterele întâlnite în scrierea obi•nuit• •i cea matematic• (cu ajutorul c•rora se vor scrie toate instruc•iunile limbajului) : - literele (mari •i mici) ale alfabetului latin: A, B, C,..., X, Y, Z, a, b, c, ... , x y z - cifrele zecimale: 0, 1, ... , 9 - caractere speciale: + − * / . , ; : ( ) [ ] { } = < > ! ? ^ @ # $ % \ ‘ “ _ ... .

În aceste lec•ii vom utiliza nota•ia BNF prezentat• în continuare. Prin scrierea unei construc•ii între acolade { ... } se indic• faptul c• acea construc•ie poate s• se repete de ori câte ori (inclusiv de zero ori). Parantezele drepte [ , ] sunt folosite pentru scrierea construc•iilor op•ionale (ceea ce se afl• închis între aceste paranteze poate lipsi). Se observ• c• în sintaxa de mai sus se folosesc metasimbolurile [ , ] , { •i } , având alt• semnifica•ie fa•• de caracterele [, ], { •i } permise •i folosite în anumite construc•ii Pascal. Ca în toate limbajele de programare •i în Pascal se folosesc frecvent identificatorii. Prin identificator, notat în defini•iile sintactice care urmeaz• prin <id>, se în•elege o secven•a de litere (mari sau mici) •i cifre, primul caracter fiind obligatoriu o liter•. De asemenea, în construc•ia identificatorilor este permis •i caracterul ’_’. Acesta se recomand• s• se foloseasc• în scrierea identificatorilor compu•i din dou• cuvinte unite prin acest caracter.

19

O parte dintre identificatori au un rol special în definirea instruc•iunilor limbajului Pascal, (fiind Cuvinte rezervate). Ace•tia sunt:

And Array Begin Case Const

Div Do

File For

In Label Mod Nil Not

Of Or Packed Procedure Program

Record Repeat Set Then To

Type Until Var While With

DownTo Function Else End GoTo If

Cuvintele rezervate nu pot fi folosite în program în alt scop decât cel fixat, acela de a defini sintaxa instruc•iunilor Pascal. Pentru a fi mai u•or descoperite într-un program acestea vor fi scrise în exemplele ce urmeaz• înclinat, iar primul caracter va fi litera mare (ca •i în lista de mai sus).

3.2. Structura unui program Pascal.
Un program Pascal const• dintr-un antet, o parte de declara•ii •i instruc•iunile care formeaz• programul principal. El are urmatoarea structur• : <program> ::= <antet_program> ; <bloc> . unde <antet_program> ::= Program <id> [ ( <lista_id> ) ] iar <bloc> ::= <lista_decl> ; <ins_compus•> Construc•iile <lista_decl> •i <ins_compus•> vor fi complet întelese pu•in mai târziu, dup• ce se vor prezenta declara•iile •i instruc•iunile limbajului Pascal. În general prin <lista_el> se în•elege un simplu element <el>, sau o succesiune de elemente <lista_el> ::= <el> { , <el> }

20

În defini•ia blocului elementul <decl> este metasimbolul folosit pentru declara•ia Pascal care va fi definit• în lec•ia urm•toare (4), iar <ins> este metasimbolul folosit pentru a nota o instruc•iune Pascal •i va fi definit în lec•ia 5. A•a cum se va vedea mai târziu, în defini•ia declara•iilor de procedur• se folose•te metasimbolul < bloc >. Deci un bloc care con•ine o procedur• con•ine un alt bloc care, la rândul lui, poate con•ine alt bloc. Oriunde în textul programului pot fi incluse comentarii. Acestea sunt folosite de c•tre utilizatori în scopul îmbun•t••irii clarit••ii programului •i a explic•rii semnifica•iei unor nota•ii sau par•i de program. Ele nu sunt luate în seam• de calculator, singurul lor scop fiind acela de a oferi programatorului posibilitatea de a insera în program explica•ii utile omului. Un comentariu este orice text închis între acolade <comentariu> ::= { text } | (* text *) Un exemplu de program Pascal este urm•torul : $ Program Suma; Var a,b : Real; Begin Write (’ Dati doua numere separate prin spatiu, apoi Enter : ’); Readln(a,b); Write (’ Suma este ’,a+b); Readln End. { Tipare•te suma a dou• numere reale,} { a •i b, citite de la tastatur•.}

21

3.3. Constante •i variabile Pascal.

Datele dintr-un program pot fi constante sau variabile. Constantele se caracterizeaz• prin aceea c• nu-•i modific• valoarea în timpul execu•iei unui program. Orice constant• este precizat• prin sintaxa ei •i are o valoare bine definit•. Constantele pot fi: numerice, •ir de caractere •i booleene. La rândul lor constantele numerice pot fi întregi sau reale. Constantele întregi sunt cele care reprezint• numerele întregi din matematic• •i au sintaxa obisnuit•. De exemplu, 15, 1989, -314 sunt constante întregi. Constantele reale sunt cele care reprezint• numerele reale. Scrierea unui num•r real poate fi în forma normal• sau în forma exponential•. În forma normal• este obligatoriu atât punctul zecimal "." cât •i partea întreag• •i partea frac•ionar• a num•rului real. De exemplu 3.14159 1.72 -5.749 sunt constante reale, în timp ce scrierile .23 103. 375. -123.+44 sunt gre•ite. În forma exponential•, un num•r întreg sau un num•r real în forma normal• este urmat de litera E sau e •i de un num•r întreg numit exponent. Valoarea num•rului real scris în aceast• form• este egal• cu num•rul scris în fa•a literei E înmul•ita cu 10 la puterea egal• cu exponentul scris dup• litera E. De exemplu: 12345E-6 este egal cu 0.012345 ; 3.123456E5 este egal cu 312345.6 . $ 103.0 0.23 $

22

Constanta •ir de caractere este o secven•• de caractere (un text) închis• între apostrofuri. Valoarea constantei este chiar textul închis între apostrofuri. Dac• este necesar ca în text s• apar• •i apostroful el trebuie dublat. De exemplu: ’22 Decembrie 1989’ ’Domnu’’ Trandafir’ În cazul în care un singur caracter este închis între apostrofuri avem o constant• de tip caracter. O constant• •ir de caractere este considerat• ca fiind rezultatul concaten•rii mai multor constante de tip caracter. De•i s-a afirmat la început c• literele mari se consider• identice cu cele mici, singura excep•ie este folosirea lor în constanta •ir de caractere. Constanta booleana reprezint• o valoare logic• •i se reprezint• prin identificatorii True pentru valoarea logic• "adev•rat", respectiv False pentru valoarea logic• "fals". Variabila corespunde m•rimii care î•i poate schimba valoarea în timpul execu•iei programului. Ea are un nume •i poate primi o valoare dintr-un domeniu bine precizat de valori. Numele unei variabile este un identificator. Pe timpul execu•iei programului în limbajul Pascal fiecare variabil• are un tip care trebuie s• fie declarat în program. $

3.4. Tipuri de date.
Prin tip de dat• se în•elege o mul•ime de valori (domeniul tipului) •i o mul•ime de opera•ii ce pot fi efectuate cu aceste valori. Unele tipuri de date sunt predefinite, iar altele sunt definite de c•tre programator în timpul scrierii programului. Dup• elementele care formeaz•

domeniul tipului deosebim tipuri de date simple, respectiv compuse cu ajutorul altor tipuri. <tip> ::= <tip_simplu> | <tip_structurat> | <tip_referin••>

23

Tipul de date <tip_simplu> se define•te în continuare, iar celelalte tipuri vor fi definite în lec•iile urm•toare. Tipurile simple de date con•in tipurile numerice Integer •i Real, tipul Boolean, tipul Char, tipul enumerare •i tipul subdomeniu. Avem: <tip_simplu> ::= <tip_real> | <tip_ordinal> unde <tip_ordinal>::=<tip_întreg>|<tip_boolean>|<tip_caracter>| <tip_enumerare>|<tip_subdomeniu> Tipurile întreg, real, boolean •i caracter sunt predefinite •i sunt marcate prin cuvintele Integer, Real, Boolean, respectiv Char. Deci <tip_real> <tip_întreg> ::= Real ::= Integer

<tip_boolean> ::= Boolean <tip_caracter> ::= Char Tipurile Integer •i Real se refer• la mul•imile Z •i R, dar mul•imea valorilor fiec•rui tip este finit• •i depinde de calculatorul folosit. De•i func•iile Pascal vor fi indicate în sec•iunea urm•toare prezent•m aici câteva func•ii definite asupra valorilor de tip ordinal sau de tip caracter. Pentru fiecare tip ordinal, deci •i pentru tipul caracter, mul•imea valorilor este finit• •i ordonat•. Pentru ob•inerea rangului elementului x în aceast• mul•ime ordonat• se poate folosi func•ia Ord(x). Pentru primul element p din aceast• mul•ime avem Ord(p) = 0. Func•ia Succ furnizeaz• succesorul unui element în aceast• mul•ime, deci Succ(x) reprezint• succesorul elementului x în domeniul valorilor •i este nedefinit pentru ultimul element din domeniu. Prin Pred(x) se noteaz• predecesorul elementului x în domeniul tipului •i este nedefinit pentru primul element din domeniu. Din defini•iile de mai sus se deduc u•or urm•toarele propriet••i: Ord( Succ(x) ) = Ord(x) + 1;

24

Ord( Pred(x) ) = Ord(x) − 1.

3.4.1. Tipul întreg.

Domeniul tipului întreg este submul•imea numerelor întregi cuprinse în intervalul [-Maxint-1, Maxint], unde Maxint este o constant• întreag• predefinit• a c•rei valoare depinde de calculatorul folosit •i este determinat• de m•rimea loca•iei pe care se reprezint• un num•r întreg în calculatorul respectiv (de exemplu Maxint = 32767). Opera•iile definite între valori de tip întreg sunt +,−,* , DIV, MOD •i /, iar semnifica•ia lor se d• în tabelul urm•tor:

Œ + −
*

Semnifica•ia lui x Œ y adunare sc•dere înmul•ire împ•r•irea întreag• (11 DIV 4 este 2) împ•r•irea real• (11/4 este 2.75) restul împ•r•irii întregi a lui x la y ( 11 MOD 4 = 3 )

DIV / MOD

De asemenea, prin − se noteaz• •i o opera•ie unar• (−x fiind opusul lui x fa•a de opera•ia de adunare).

3.4.2. Tipul real. Tipul real reprezint• o submul•ime finit• de numere reale aflate în intervalul [-vmax, vmax], submul•ime care depinde de modul de reprezentare a numerelor reale în calculatorul folosit. Deci vmax este o constant• real• care

25

difer• de la un calculator la altul, dar nu e o constant• predefinit• ca Maxint în cazul tipului Integer. Opera•iile definite între valori de tip real sunt adunarea, sc•derea, înmul•irea si împ•r•irea, notate prin +, -, *, respectiv / . De remarcat c• aceste opera•ii sunt definite •i când un operand este întreg ,iar cel•lalt real, rezultatul fiind real, datorit• conversiei implicite a tipului întreg la real. Men•ionam c• în reprezentarea oric•rui num•r real în calculator se re•in un num•r finit de cifre semnificative. Din aceast• cauz• rezultatul unei opera•ii cu numere reale este aproximativ. Pentru a în•elege exact aceste afirma•ii este necesar• cunoa•terea reprezent•rii numerelor în calculator.

3.4.3. Tipul boolean.

Domeniul tipului boolean const• din mul•imea valorilor logice "fals" •i "adev•rat", marcate prin constantele False respectiv True. Ordinea este False < True. Opera•iile logice binare sunt marcate prin And (conjunc•ia logic•) •i Or (disjunc•ia logic•), iar nega•ia (opera•ie logic• unar•) prin Not. Operatorii

rela•ionali au în acest caz semnifica•ii logice. Deci prin =, <>, <=, >=, sunt notate echivalen•a, neechivalen•a (Sau exclusiv), implica•ia, respectiv implica•ia invers•.

3.4.4. Tipul caracter. Tipul caracter se define•te prin cuvântul Char •i are ca domeniu de valori mul•imea tuturor caracterelor (litere mari •i mici, cifre •i caractere afi•abile). Nu exist• opera•ii definite asupra valorilor de tip Char. Pe lânga func•iile definite pentru argument de orice tip ordinal, pentru tipul caracter mai întâlnim •i func•ia

26

Chr. Pentru i întreg, Chr(i) furnizeaz• caracterul de rang i din domeniul tipului Char. Se observ• c• Ord( Chr(i) ) = i 3.4.5. Tipul enumerare. Tipul enumerare se specific• prin scrierea valorilor acestui tip între paranteze: <Tip_enumerare> ::= ( <Lista_id> ) identificatorii din paranteze constituind valorile tipului enumerare definit. Ordinea lor este cea dat• de ordinea identificatorilor în lista. Nu este permis ca o valoare a acestui tip (deci un identificator) sa fie reutilizat în defini•ia altui tip. Exemplu : (Luni, Mar•i, Miercuri, Joi, Vineri, Sâmbata, Duminic•) (Prim•var•, Var•, Toamn•, Iarn•) Pentru aceste exemple avem : Pred(Toamn•) = Var• Succ(Joi) = Vineri Ord(Luni) = 0 Ord(Iarn•) = 3 . Men•ion•m c• valorile variabilelor de tip enumerare nu pot fi citite si nici tip•rite. $ •i Chr( Ord(c) ) = c .

3.4.6. Tipul subdomeniu. Tipul subdomeniu poate fi definit din orice tip ordinal prin precizarea limitelor inferioar• •i superioar• care definesc valorile subdomeniului. Tipul ordinal pentru care se define•te subdomeniul se nume•te tip de baz• al subdomeniului. Avem: <tip-subdomeniu> ::= constanta1 .. constanta2 unde constanta1 si constanta2 sunt valori ale tipului ordinal de baz• care satisfac inegalitatea : Ord(constanta1 ) ≤ Ord(constanta2 ).

27

De exemplu: - subdomeniul întregilor de la 1 pân• la 20: 1..20 - subdomeniul zilelor lucr•toare: Luni .. Vineri - caracterele cifre zecimale: ’0’ .. ’9’. 3.4.7. Alte tipuri predefinite în Turbo Pascal.

$

Pe lânga tipurile prezentate mai sus, existente în limbajul Pascal standard, în Turbo Pascal exist• câteva extensii importante. În primul rând exist• extinderi ale tipului Integer, prezentate în tabelul urm•tor împreun• cu domeniile acestora.

Tipul
Byte ShortInt LongInt Word Comp

Domeniul
[0, 255] [-128, 127] [-231, 231-1] [ 0, 65535] [-2*1063+1, 2*1063-1]

Opera•iile sunt cele precizate pentru tipul Integer, doar c• domeniile difer•. Ele sunt bine definite dac• rezultatul face parte din domeniul men•ionat.

28