Grigore Marius Catalin
clasa a X-a A
Limbajele de programare reprezinta unul din principalele mijloace de comunicare om-masina, evolutia lor fiind nemijlocit legata de cea a calculatoarelor electronice, a caror era incepe in 1944. Primele calculatoare puteau fi programate numai in limbaj masina, dar, chiar la inceputul anilor ’50, se inregistreaza trecerea la programarea simbolica, prin aparitia limbajelor de asamblare caracterizate prin folosirea codurilor mnemonice pentru instructiuni si a adresarii simbolice a operanzilor. Dupa aparitia primului limbaj de nivel inalt, limbajul FORTRAN (1954), se observa o proliferare accelerata a limbajelor de programare. Intr-o lista considerata exhaustiva la data respectiva (1969), J.E. Sammet identifica 120 de limbaje de programare cu o larga utilizare; trei ani mai tarziu, acelasi autor extindea aceasta lista la 170 [Dodescu et al., 1987]. In primii ani ai deceniului opt, un sondaj efectuat in S.U.A. identifica, la nivelul unui singur domeniu de activitate - sistemele informatice ale armatei americane - utilizarea a peste 450 de limbaje de programare sau dialecte ale unor limbaje.
Din acest adevarat "turn al lui Babel", prin perspectiva prezentei lucrari, un interes aparte prezinta limbajele procedurale, destinate descrierii algoritmilor de rezolvare a problemelor, sub forma unor succesiuni de instructiuni. Ele mai sunt numite limbaje algoritmice sau limbaje universale, nefiind limitate la o clasa particulara de probleme. Dintre cele mai cunoscute limbaje de programare incluse uzual in aceasta clasa pot fi mentionate: ADA, ALGOL, BASIC, C, COBOL, FORTRAN, PASCAL, PL/1 etc.
Aparitia evolutia si caracteristicile generale ale limbajului Pascal
Aparitia limbajului Pascal este un rezultat al conceptelor dezvoltate ca urmare a crizei programarii ce caracteriza domeniul programarii calculatoarelor la sfarsitul anilor ’60. In aceasta perioada, raspandirea pe plan mondial a prelucrarii automate a datelor a cunoscut o extindere remarcabila, trecandu-se la abordarea si rezolvarea unor probleme din ce in ce mai complexe. Programele mari asociate acestor probleme s-au complicat in asa masura incat au devenit foarte greu accesibile, chiar si pentru autorii lor. Intelegerea, depanarea si dezvoltarea unor astfel de programe prezinta dificultati majore. Limitarile limbajelor de programare cu larga utilizare in epoca (FORTRAN, COBOL etc.), dublata de inexistenta unor principii clare, care sa impuna o disciplina a programarii, au favorizat in mare masura programarea empirica. Ca raspuns la cerinta de elaborare a unei metodologii generale de dezvoltare sistematica a programelor s-a cristalizat metoda proiectarii si programarii structurate.
Un program structurat este constituit din unitati functionale bine conturate, ierarhizate conform naturii intrinseci a problemei. In interiorul unor astfel de unitati, structura se manifesta atat la nivelul actiunilor (instructiunilor), cat si al datelor.
Programarea structurata este o metoda independenta de limbajul de programare, actionand la nivelul stilului de lucru. Totusi, practica a demonstrat ca limbajul de programare poate inlesni in mod hotarator realizarea desideratelor evidentiate. Limbajul Pascal reprezinta un exemplu edificator in acest sens. El a aparut intr-o forma preliminara in 1968, autorul sau fiind profesorul elvetian Niklaus Wirth. Numele limbajului a fost ales ca un omagiu adus marelui matematician, fizician, filosof si scriitor francez Blaise Pascal (1623-1662), primul care, in 1642, a inventat o masina de calcul. Dupa o faza de dezvoltare extensiva, un prim compilator devine operational in 1970, limbajul fiind publicat in 1971. Interesul trezit de aparitia sa a condus la necesitatea unor consolidari ale limbajului, finalizate prin publicarea in 1973 a unui raport revizuit, in care se realizeaza o definire a formei de referinta numita Pascal Standard, redactata ulterior conform normelor ISO si devenita baza comuna pentru diverse implementari.
Limbajul Pascal include conceptele programarii structurate in ambele laturi ale efortului de abstractizare presupus de realizarea unui program - organizarea datelor si conceperea actiunilor. Printre principalele caracteristici ale lui pot fi mentionate:
• Include o serie de instructiuni care reprezinta chiar structurile de control impuse de tehnica programarii structurate (IF-THEN-ELSE, CASE, REPEAT, WHILE, FOR).
• Are facilitati puternice si deosebit de flexibile pentru reprezentarea datelor. Notiunea de tip de date a fost extinsa dincolo de cercul restrans al datelor intregi, reale, siruri de caractere si tablouri (masive). S-au introdus structuri de date complexe, ca articolul (inregistrarea), multimea, fisierul si posibilitati de a descrie altele noi, combinandu-le pe cele existente. La acestea se adauga facili-tatea de a defini si manipula structuri dinamice (liste liniare, arbori etc.). In anumite implementari ale limbajului a fost introdus tipul obiect, care permite reunirea in aceeasi constructie a datelor si metodelor care le prelucreaza (proceduri si functii), creand cadrul trecerii la programarea orientata obiect (POO).
• Ofera posibilitati de modularizare a programe-lor, prin structurarea lor in module carora le pot fi asociate constructii ale limbajului (proceduri si functii).
• Fundamenteaza constructiile pe conceptul de bloc, care permite, pe de o parte, definirea de date proprii (variabile locale) si, pe de alta parte, accesul la datele din blocurile de pe nivelurile superioare (variabile globale).
• Poseda o biblioteca bogata de functii si proceduri standard, cu elemente specifice diverselor implementari ale limbajului si permite, totodata, construirea de biblioteci ale utilizatorului.
Aceste caracteristici au facut ca, desi conceput initial pentru a servi ca suport de studiu al progra-marii structurate, limbajul sa fie folosit intens si de catre programatorii profesionisti. Ca efect, s-a ajuns rapid la o crestere spectaculoasa a productivi-tatii muncii de programare, ducand la raspandirea utilizarii limbajului.
Limbajul Pascal beneficiaza de implementari pe toate tipurile de sisteme de calcul. Multe dintre aceste implementari marcheaza si dezvoltari ale limbajului insusi, adica in raport cu care Pascal Standard apare ca un subset. Dintre variantele utilizate de informaticienii romani pot fi mentionate: implementarea pe calculatoarele din generatia a treia din familia FELIX, din 1978; Pascal Oregon pentru minicalculatoarele din familiile Independent si Coral; implementarile realizate de firma Borland International pentru microcalculatoarele IBM PC si compatibile.
Firma Borland a realizat, incepand cu 1983, medii integrate de dezvoltare (IDE - Integrated Development Environment) cu denumirile generice Turbo Pascal, Borland Pascal si Delphi. Turbo Pascal, ajuns la versiunea 7.0, a marcat introducerea progresiva a unor noi facilitati, dintre care cele mai semnificative sunt: · realizarea segmentarii programelor folosind tehnica overlay, incepand cu versiunea 5.0 (1988); · introducerea conceptelor POO, incepand cu versiunea 5.5 (1989); · folosirea mouse-ului, ferestrelor de editare multiple, asamblorului integrat si sistemului Turbo Vision, pentru dezvoltarea de aplicatii orientate obiect, in versiunea 6.0 (1990).
Versiunile din categoria Turbo Pascal sunt destinate utilizarii sub DOS. Pentru dezvoltarea de aplicatii Windows a fost lansata implementarea Borland Pascal 7.0 pentru Windows, cu posibilitati superioare de utilizare a POO. Ultima realizare a firmei Borland o reprezinta Delphi, care implementeaza facilitati de POO si programare vizuala. Evolutia acestei implementari a cunoscut, de asemenea, doua etape: pentru sisteme pe 16 biti, specifice platformelor Windows 3.x, in versiunea Delphi 1.0; pentru sisteme pe 32 de biti (Windows 95, Windows NT), incepand cu Delphi 2.0.
Daca in cazul implementarilor pe 16 biti apare limitarea importanta a dimensiunii segmentelor de date si de cod la 64 KB (spatiul maxim de adrese care poate fi gestionat cu un cuvant de 16 biti), trecerea la cod pe 32 de biti face ca limitarile sa fie impuse numai de sistemul de operare (2 GB la Windows 95).
Constructiile limbajului
Acceptand terminologia folosita in definirea limbajelor formale, limbajului Pascal ii poate fi asociata o gramatica formata din urmatoarele clase de elemente:
- alfabetul terminal (AT), format din entitatile elementare ale limbajului, adica din cele mai mici unitati cu semnificatie proprie. Prin comparatie cu limbajul natural, aceste unitati formeaza multimea cuvintelor sau lexicul limbajului Pascal (simboluri speciale, cuvinte rezervate, identificatori, etichete, literali numerici, literali nenumerici);
- alfabetul neterminal (AN), format din multimea constructiilor sintactice realizate prin agregare succesiva pornind de la elementele alfabetului termi-nal;
- simbolul de start sau axioma gramaticii (aoIAN), care este constructia sintactica de cel mai inalt nivel;
- multimea productiilor (P), formata din regulile de sintaxa ce se aplica in realizarea constructiilor limbajului.
• Constructiile sintactice ale limbajului Pascal sunt formate, in ultima instanta, din unitati lexicale si separatori, unde separatorul este un spatiu sau un comentariu. Doua unitati lexicale trebuie sa fie sepa-rate prin unul sau mai multi separatori, daca fiecare dintre ele este un cuvant rezervat, un identificator, o eticheta sau un numar. Separatorii nu pot fi parte a unitatilor lexicale, cu exceptia includerii in siruri de caractere.
Principalele constructii sintactice ale limbaju-lui Pascal, intr-o ordine relativa a procesului de agregare sunt:
- expresiile, care sunt constructii formate din operanzi (date numerice, logice, de tip caracter etc.) si operatori (aritmetici, relationali, logici etc.) si a caror evaluare produce o valoare de un anumit tip;
- declaratiile, care sunt constructii pentru definirea si descrierea datelor (constante si/sau variabile, date scalare si/sau structuri de date etc.);
- instructiunile, pentru descrierea actiunilor realizate asupra datelor;
- subprogramele de tip functie si procedura, care, pe baza unor date de intrare, furnizeaza unu sau mai multe rezultate de iesire;
- programul, reprezentand constructia sintactica de nivel superior, care poate face obiectul prelu-crarii si executiei pe un sistem de calcul.
In termenii folositi anterior, constructiile sintactice enumerate apartin alfabetului neterminal, iar, dintre ele, programul reprezinta axioma gramaticii limbajului Pascal.
• Regulile de sintaxa ce formeaza multimea pro-ductiilor pot fi specificate in mai multe moduri, dintre care se remarca: notatia formala BNF (Backus Normal Form) si diagramele de sintaxa.
In notatia BNF, regulile sintactice (metadefini-tiile) au forma:
<parte-stanga> ::= parte-dreapta
unde:
<parte-stanga> |
: desemneaza metavariabila (variabila neterminala) ce se defineste; |
::= |
: metasimbol avand sensul de "este prin definitie"; |
parte-dreapta |
: definitia metavariabilei. |
In cadrul definitiei (parte-dreapta) se intalnesc urmatoarele elemente:
<metavariabila> |
: categorie sintactica folosita in definirea altei cate-gorii sintactice; |
metaconstanta |
: element al alfabetului terminal; |
| |
: separa alternativele in definitie; |
[ ] |
: indica o constructie optionala; |
{ } |
: indica posibilitatea repetarii constructiei. |
Alternativele se constituie prin juxtapunerea de metavariabile si/sau metaconstante.
O diagrama de sintaxa este un graf orientat avand o singura intrare si o singura iesire. Orice drum posibil in graf, incepand cu intrarea si terminand cu iesirea, defineste o constructie sintactica corecta. Ca noduri ale grafului se folosesc urmatoarele figuri geometrice, pentru care se precizeaza si conditiile de utilizare in prezentarea limbajului Pascal:
|
|
incadreaza simboluri speciale; |
|
|
incadreaza cuvinte rezervate; |
|
|
incadreaza elemente ale limbajului care se definesc prin alte diagrame de sintaxa. |
In sens restrans, diagramele de sintaxa si meta-definitiile ar trebui asociate numai constructiilor sintactice propriu-zise (neterminale). Totusi, avand in vedere ca utilizatorul este implicat nemijlocit in alcatuirea unora din clasele de componente ale lexicului, se vor folosi, si in cazul acestora, diagrame de sintaxa si/sau metadefinitii.
Pentru a ilustra comparativ cele doua moduri de reprezentare a regulilor sintactice, se prezinta in continuare metadefinitiile si diagramele de sintaxa pentru litera, cifra (zecima-la) si cifra hexazecimala. Diagramele de sintaxa sunt iar in notatie BNF se poate scrie:
<litera>:: = A|B|C|...|X|Y|Z|a|b|c|...|x|y|z
<cifra>:: = 0|1|2|3|4|5|6|7|8|9
<cifra hexazecimala>:: = <cifra>|A|B|C|D|E|F|a|b|c|d|e|f
In cele ce urmeaza vor fi folosite cu precadere diagramele de sintaxa care, pe langa rigurozitate, sunt si deosebit de sugestive. Cuvintele rezervate vor fi scrise cu majuscule, iar celelalte elemente cu litere mici.
Structura generala a programelor pascal
Pentru evidentierea relatiilor intre diverse constructii sintactice, in cele ce urmeaza se face o abordare descendenta, pornind de la axioma gramaticii limbajului. In forma sa cea mai generala, structura unui program Pascal poate fi descrisa prin diagramele de sintaxa. Antetul programului, atunci cand este prezent, are rol pur informativ. Totodata, posibilitatea definirii unor eventuali parametri este mentionata numai pentru asigurarea similitudinii cu Pascal Standard, fara a avea nici o semnificatie in Turbo Pascal. Clauza USES, cu caracter optional, permite specifica-rea unitatilor (UNIT-urilor) folosite in programul respectiv. Principala componenta a unui program este blocul, care reprezinta corpul acestuia. Blocul (diagramele) este format din declaratii (instructiuni neexecutabile) si instructiuni (instructiuni executabile).
· Partea de declaratii a blocului este subimpartita in:
- partea de declarare a etichetelor (LABEL), in care se declara etichetele folosite in partea de instructiuni a blocului;
- partea de declarare a tipurilor (TYPE), care contine definirea unor tipuri de date pe baza altor tipuri definite anterior, standard sau ale utilizatorului;
- partea de declarare a constantelor (CONST), care cuprinde declararea constantelor simbolice (identificatori asociati unor constante) si a constantelor cu tip (variabile initializate in momentul compilarii);
- partea de declarare a variabilelor (VAR), care contine definirea tuturor variabilelor specifice blocului respectiv;
- partea de declarare a procedurilor si/sau functiilor.
Procedurile si functiile sunt subprograme interne sau externe. Constructiv, indiferent de tipul sau, un subprogram este format dintr-un antet si un corp Antetul unui subprogram de tip PROCEDURE precizeaza numele (identificatorul) acestuia si lista parametrilor formali, care in momentul ape-larii vor fi pusi in corespondenta cu parametrii actuali, asigurand schimbul de informatii in contextul de apelare. Parametrii sunt de intrare si/sau de iesire, ceea ce inseamna ca un subprogram PROCEDURE returneaza zero, unu sau mai multe rezultate. Intrucat un subprogram de tip FUNCTION returneaza (cel putin) un rezultat asociat cu numele functiei, in antetul sau se include si o declaratie de tip corespunzand acestui rezultat. Corpul procedurilor interne contine drept princi-pala componenta blocul, care are aceeasi structura ca si in cazul programului.
· Partea de instructiuni este formata din instructi-unile executabile prin care se codifica algoritmul problemei. Termenul instructiune desemneaza generic tipurile de instructiuni pe care le poseda limbajul. Se mentionea-za ca insasi constructia BEGIN...END reprezinta o instructiune compusa (care, la limita, poate sa fie vida). Analizand alternativele sau revenirile din dia-gramele de sintaxa, pot fi precizate urmatoarele aspecte practice: • partea de declaratii poate sa lipseasca (rezul-ta ca in partea de instructiuni nu se refera date declarate in program); • partea de declaratii, atunci cand este prezen-ta, o precede obligatoriu pe cea de instructiuni; • ordinea diverselor componenete ale partii de declaratii este oarecare, cu conditia ca orice referire a unui obiect (tip, variabila, constanta etc.) sa fie precedata de definirea sa; • procedurile (functiile) interne sunt optionale, iar cand sunt prezente se definesc anterior partii de instructiuni care le refera; • pot fi realizate subprograme imbricate, adica definirea de proceduri/functii in cadrul altor proceduri/functii.
In se prezinta schema bloc a unui program Pascal, construita pe baza diagramelor de sintaxa definite anterior. Referitor la partile efectiv incluse in progra-mele concrete, trebuie precizat ca schema din /a> are in vedere o structura exhaustiva. Multe dintre parti au caracter optional, iar succesiunea lor in cadrul programului poate sa difere.
Programul se prezinta ca o succesiune de linii, fiecare de maximum 127 de caractere. Declaratiile si instructiunile programului se separa intre ele prin simbolul ;. Pentru lizibilitate se recomanda ca fiecare linie sa contina o singura declaratie sau instructiune, dar este permisa si scrierea mai multor asemenea con-structii pe aceeasi linie sau continuarea lor pe mai multe linii. In acelasi scop, desi pot fi folosite ca separator intre unitatile lexicale, se recomanda ca si comentariile sa fie scrise pe linii distincte.
In Pascal, comentariul este o succesiune de caractere inclusa intre acolade { } sau intre perechile de caractere speciale (* si *) folosite ca delimitatori, cu conditia ca in succesiune sa nu fie inclus delimi-tatorul de sfarsit al comentariului. Delimitatorii folositi pentru comentarii pot servi si la introducerea unor directive de compilare, ce contin imediat dupa delimitatorul stanga caracterul $, urmat de codul unei directive.
Clasificarea tipurilor statice de date
O clasificare a tipurilor statice de date in Turbo Pascal este prezentata in.
· Tipurile ordinale reprezinta multimi finite si ordonate de valori discrete. Unui element i se asociaza un numar de ordine in cadrul multimii, obtinut implicit (vezi tipurile intregi) sau prin functia ORD. Pot fi referite elemen-tele succesor, respectiv predecesor ale unui element, prin functiile SUCC si PRED. Valoarea unei date ordinale se reprezinta intern prin ordinul ei. Elementele pot fi puse in relatie (<, <=, =, >, >=, <>), rezultatul fiind evaluat in functie de numarul de ordine (elementul cu numarul de ordine mai mic este mai mic decat elementul cu numarul de ordine mai mare). Numarul de valori ale unei date de tip ordinal poate fi determinat prin relatia: ORD(ultim_element)-ORD(prim_element)+1.
Dupa modul de specificare a valorilor pe care le pot avea, datele de tip ordinal pot fi subimpartite in date de tip domeniu (subdomeniu) si date de tip enumerativ. Pentru tipul domeniu (subdomeniu), multimea valorilor discrete se precizeaza printr-un interval inchis . Marginile intervalului trebuie sa indeplineascaconditia:RD(limita_inferioara)<=ORD(limita_superioara).
Tipurile standard intregi au domeniile implicite prezentate in tabelul 2.1. De exemplu, prin tipul standard INTEGER se desemneaza multimea numerelor intregi din intervalul -32768..32767. Tipul standard CHAR are domeniul implicit #0..#255 (multimea carac-terelor setului extins ASCII). Utilizatorul poate sa-si defineasca propriile tipuri, prin subdomenii incluse in cele predefinite (standard).
Pentru tipul enumerativ, multimea de valori discrete se precizeaza prin liste ordonate.
Tipul standard BOOLEAN are lista de valori implicita (FALSE,TRUE). Utilizatorul poate sa-si defineasca propriile tipuri enumerative. Elementelor datelor de tip enumerativ li se asociaza numere de ordine, prima valoare din lista avand ordinalitatea zero.
· Datele de tip real au valori in multimea R. In functie de lungimea interna, se disting mai multe tipuri reale care au precizii diferite (tabelul 2.3). Datele de tip real nu sunt ordinale (intre oricare doua valori reale exista o infinitate de valori).
· Datele de tip structurat sunt multimi (colectii) de date de tipuri simple sau structurate, constituite dupa anumite reguli bine stabilite. Nici o data structurata nu poate ocupa in memorie mai mult de 65520 octeti. Avand in vedere clasificarea propusa in, tipul datelor statice (pentru care convenim sa folosim in continuare denumirea de tip) poate fi definit ca in Identificator_tip desemneaza un tip definit de utilizator.Tipurile definite conform se regasesc in declararea variabilelor si constantelor.
Variabile si constante
Din punct de vedere al posibilitatii de modificare a valorii in faza de executie a programului, se disting: date variabile, care isi pot modifica valoarea pe parcursul executiei programului; date constante, predefinite la momentul scrierii programu-lui si ale caror valori sunt generate in faza de compilare.
· Toate variabilele cu care se lucreaza intr-un program Pascal trebuie declarate in sectiunea VAR (unele si in CONST) a partii de declaratii a programului. Intr-o declaratie pot fi specifi-cate mai multe variabile.
Doua sau mai multe variabile pot fi definite la aceeasi adresa de memorie, folosindu-se clauza ABSOLUTE. Variabilele se numesc echivalente (sau echivalate). In acest caz, declararea de variabile se realizeaza conform /a>.
Exemple:
1. VAR a:INTEGER; b:BYTE ABSOLUTE a;
Variabila b are aceeasi adresa in memorie cu variabila a (b este, de fapt, primul octet al variabi-lei a).
2. VAR a:STRING[10]; b:CHAR ABSOLUTE a;
Variabila b are aceeasi adresa cu variabila a (b este, de fapt, primul octet al sirului, care este octetul de lungime).
· Datele constante pot fi literali (diagramele 1.5-1.13) care se autoindentifica prin valoare, sau constante simbolice, referite prin identificatori, carora li se asociaza declaratii in sectiunea CONST a partii de declaratii a programului/a>.
In, expresie_de_constante este evaluata in momentul compilarii, avand ca operanzi numai liter-ali sau constante simbolice. Operatorii folositi in expresii sunt cei specifi-ci tipului de data pentru care se defineste constanta. In expresiile de constante pot fi folosite si urmatoarele functii: ABS, CHR, HI, LENGTH, LO, ODD, ORD, PRED, ROUND, SIZEOF, SUCC, SWAP, TRUNC.
Exemple:
CONST hv=9999; constanta simbolica cu valoare literal
lv= -hv; constanta simbolica cu valoare expresie_de_constante nul=hv+lv; constanta simbolica cu valoare expresie_de_constante.
Unei constante simbolice nu i se poate modifica valoarea in timpul executiei. De exemplu, considerand constanta hv, definita anterior, nu se poate scrie hv:=0 sau hv:=hv+1. Limbajul Pascal defineste ca fiind constante (datorita faptului ca se declara in sectiunea CONST) si acele variabile initializate in momentul compi-larii. Ele se numesc, in limbaj, constante cu tip sau variabile initializate si se declara conform.In /a> se prezinta o sinteza a constantelor din PASCAL. In multe constructii sintactice se cere respectarea unor clase de compatibilitati de tip. Prin notiunea de variabile de acelasi tip se va intelege: variabile de acelasi tip utilizator; variabile simple de acelasi tip standard; variabile definite in aceiasi descriere (de exemplu, A si B sunt de acelasi tip daca sunt descrise astfel: A,B:ARRAY[1..10] OF REAL;).
Tipurile intregi
Tipurile intregi de date sunt: BYTE, WORD, SHOR-TINT, INTEGER, LONGINT. Ele se refera la intregi fara semn (BYTE, WORD) si la intregi cu semn (SHORTINT, INTEGER, LONGINT). Caracteristicile tipurilor intregi sunt prezentate in. Tipurile intregi sunt ordinale (domeniu/subdomeniu).
In ISO Standard Pascal sunt incluse doar tipurile INTEGER si CARDINAL (echivalent cu WORD). Tipurile WORD, SHORTINT, LONGINT se regasesc incepand cu versiunea 4.0 a limbajului. Compilatorul sesizeaza ca eroare tentativa de a atribui unei variabile de tip intreg constante cu valori din afara domeniului acceptat. La executie, depasirea domeniului de valori este semnalata ca eroare (cu optiunea de compilare {$R+}) sau rezultatul este imprevizibil pentru utilizator (cu optiunea de compilare {$R-}, care este si valoarea implicita). Ca o consecinta a acestei afirmatii, trebuie retinut faptul ca variabilelor BYTE si WORD nu li se pot atribui valori negative. Variabilele intregi, constantele simbolice si constantele cu tip se declara ca in unde tip este un tip intreg (BYTE, WORD, SHORTINT, INTEGER, LONGINT).
Exemple:
In operatii, toate tipurile intregi sunt compati-bile intre ele. Tipurile rezultatelor obtinute sunt ,operatorii aritmetici sunt:
|
+ |
adunare (sau operator unar); |
|
- |
scadere (sau operator unar); |
|
* |
inmultire; |
|
DIV |
impartire intreaga (se obtine catul); |
|
MOD |
impartire intreaga (se obtine restul). |
Din /a> se observa ca tipul rezultatelor operatiilor aritmetice cu operanzi intregi este: LONGINT (daca un operand este LONGINT); WORD (daca un operand este WORD si celalalt este WORD sau BYTE); INTEGER (in toate celelalte cazuri). Observatie: Operatorul "/" (impartire reala) se poate aplica asupra operanzilor intregi, dar rezul-tatul este real. Datele de tip intreg pot fi puse in relatie (<, <=, =, >, >=, <>), rezultatul logic fiind in concord-anta cu ordinea lor (ca tip ordinal) sau cu valoarea lor in Z. Functiile specifice tipurilor ordinale (ORD, PRED, SUCC) se aplica si tipurilor intregi, cu mentiu-nea ca numarul de ordine a datei coincide cu valoarea sa din Z.
In Turbo Pascal exista doua constante predefi-nite, avand identificatorii MaxInt (tip INTEGER) si MaxLongint (tip LONGINT) care au valoarea egala cu maximul din valorile domeniilor acestor tipuri (32767, respectiv 2147483647).
Tipul Boolean
Tipul BOOLEAN este ordinal, enumerativ: (FALSE, TRUE). Tipul boolean este prezent in ISO Standard Pascal. Asupra datelor booleene se pot aplica functiile specifice tipului ordinal (ORD, PRED, SUCC). O data de tip BOOLEAN se reprezinta in memorie pe un octet, in care se memoreaza valorile ordinelor elementelor: 0 (pentru FALSE), 1 (pentru TRUE). Literalii booleeni sunt FALSE si TRUE. Variabilele booleene, constantele simbolice si constantele cu tip se declara conform, unde tip este BOOLEAN. Operatorii logici sunt: NOT (nu); AND (si); OR (sau); XOR (sau exclusiv). Datele de tip BOOLEAN pot fi puse in relatie, rezultatul logic obtinut derivand din caracterul ordinal al acestui tip : FALSE < TRUE este adevarat.
Observatii: Datele de tip BOOLEAN nu se pot citi din fisiere text; scrierea pe fisiere text produce extragerea cu-vintelor TRUE/FALSE; scrierea pe fisier binar produce extragerea valorii interne (0 sau 1), reprezentata pe un octet.
Tipul caracter
Tipul caracter (CHAR) este ordinal, subdomeniul #0..#255. Multimea valorilor tipului caracter este formata din caracterele setului extins ASCII (256 caractere). Tipul CHAR este prezent in ISO Standard Pascal. O data de tip CHAR ocupa in memorie un octet, in care se memoreaza valori binare interne din intervalul 0..255. Literalii de tip CHAR pot fi scrisi in urmatoa-rele moduri:
a) Un caracter imprimabil cuprins intre apostro-furi;
b) Un intreg din domeniul 0..255, precedat de caracterul #;
c) Un caracter imprimabil precedat de ^. Valoarea interna generata de literalul ^x este egala cu valoarea interna a caracteru-lui x, din care se scade 64 (ORD(x^)=ORD(x)-64). Prin exprimarea literali-lor CHAR sub forma ^x se pot preciza usor codurile de control al transmisiei si imprimarii (caractere neim-primabile), din intervalul de valori #0..#31.
Exemple:
Variabilele caracter, constantele simbolice, constan-tele cu tip se declara conform, unde tip este CHAR. Asupra datelor de tip caracter se poate realiza operatia de concatenare (+), rezultatul fiind de tip STRING. Dupa operatia 'A' + 'B' rezulta sirul 'AB'. Acelasi efect se poate obtine utilizand functia CONCAT. Asupra datelor de tip CHAR se pot aplica functiile specifice tipurilor ordinale: ORD, PRED, SUCC. Datele de tip CHAR pot fi puse in relatie (<, <=, =, >, >=, <>), rezultatul logic fiind in concordanta cu ordinalitatea lor, care se memoreaza intern. De exemplu, urmatoarele relatii conduc la rezul-tatul TRUE: 'A' < 'B' ; 'a' > 'A'; '+' <> 'Y'. Exista o functie (CHR) care, avand ca argument numarul de ordine in cadrul multimii de valori, returneaza caracterul asociat acestuia. Functiile ORD si CHR sunt inverse. Daca ch este variabila de tip CHAR, sunt valabile relatiile:
CHR(ORD(ch))=ch; ORD(CHR(ORD(ch)))=ORD(ch).
SUCC(ch)=CHR(ORD(ch)+1)=CHR(SUCC(ORD(ch)));
PRED(ch)=CHR(ORD(ch)-1)=CHR(PRED(ORD(ch))).
Tipul enumerativ
Tipul ordinal enumerativ (prezent in ISO Standard Pascal) se defineste ca o lista ordonata de identificatori ai utilizatorului, care au sens de valori.Valorilor din lista ordonata care precizeaza tipul enumerativ li se asociaza numere de ordine in cadrul acesteia, incepand de la zero. De exemplu, se presupune lista ordonata (alb,rosu,negru,verde). Identificato-rului alb i se asociaza numarul de ordine zero, identificatorului rosu, numarul de ordine unu etc. Variabilele, constantele cu tip si cele simbolice se declara conform, unde tip este tip_enumerativ. Un identificator precizat intr-o lista nu poate fi prezent si intr-o alta lista.
Exemple:
Exemplul 3 scoate in evidenta faptul ca este bine ca tipul enumerativ sa fie definit in sectiunea TYPE (exemplul 2) si nu referit direct in declararea variabilelor si constantelor. Daca numarul elementelor listei este mai mic sau egal cu 256, variabilele de tip enumerativ se reprezinta pe un octet. In caz contrar, ele se reprezinta pe un cuvant. Intern este memorat numarul de ordine a valorii. Din aceasta cauza, numarul elementelor listei enumerative este maxim 65536.
Referirea unui element din lista se poate face prin identificatorul sau (de exemplu, marti, negru etc) sau printr-o constructie de tipul celei din. De exemplu, zile(0) este echivalent cu luni, zile(1) este echivalent cu marti etc. Constanta z de tipul zile initializata cu valoarea marti poate fi declarata astfel: z:zile=zile(1).
Observatie: Referirea unui element conform se face prin intermediul unui identifica-tor de tip si nu al unui identificator de variabila. Este gresit, de exemplu, sa se scrie saptamana(0). Asupra datelor de tip enumerativ se pot aplica functiile specifice tipurilor ordinale: ORD, PRED, SUCC. Datele de tip enumerativ pot fi puse in relatie (<, <=, =, >, >=, <>), rezultatul logic fiind in concordanta cu ordinea valorii lor. De exemplu, urmatoarele relatii conduc la rezul-tatul TRUE: miercuri < joi; miercuri = zile(2); sambata > luni. In general, datele de tip enumerativ se folosesc in urmatoarele situatii: • in operatia de atribuire: unei variabile de tip enumerativ i se poate atribui o valoare definita in lista tipului respectiv (si numai in aceea); • in declararea dimensiunilor masivelor si in expresiile indiceale pentru referirea ele-mentelor acestora; • ca variabile de control in instructiunea FOR.
Observatie:Elementele unei multimi de tip enumerativ nu pot fi citite/scrise din/pe fisiere text.
Tipul subdomeniu
Tipul ordinal subdomeniu (prezent in ISO Standard Pascal) se mai numeste tip interval. El se defineste ca submultime a unui tip ordinal ("tip parinte"), prin precizarea intervalului inchis de valori, conform. Toate caracteristicile tipului parinte se rega-sesc in tipul subdomeniu, singura deosebire dintre ele referindu-se la multimea valorilor pe care le pot lua. Literalii, constantele, functiile si operatiile definite pentru datele de tip subdomeniu sunt similare celor specifice tipului parinte.
Variabilele, constantele simbolice si constantele cu tip se declara conform, unde tip este tip_subdomeniu. Functia ORD aplicata unui element dintr-un subdomeniu returneaza numarul de ordine din domeniul parinte. Datele de tip subdomeniu se memoreaza identic cu cele din tipul parinte. Compilatorul sesizeaza tentativa de a atribui unei variabile literali din afara domeniului definit pentru ea. Sesizarea, la momentul executiei, a neinca-drarii valorilor in subdomeniul definit se poate face prin utilizarea optiunii de compilare {$R+}.
Tipurile reale
Tipurile reale sunt: REAL, SINGLE, DOUBLE, EX-TENDED, COMP. Datele reale sunt memorate intern in virgula mobila. Caracteristicile lor sunt prezentate in /a>. In ISO Standard Pascal este inclus doar tipul REAL. Celelalte tipuri sunt cuprinse in conventia IEEE (Institute for Electrical and Electronics Engineers). In Turbo Pascal exista posibilitatea de a folosi doua modele diferite de generare a codului intern pentru instructiunile de calcul in virgula mobila, specificate prin valoarea directivei de compilare {$N}, asociata prelucrarii numerice: {$N-} pentru folosirea exclusiva a tipului REAL (valoare implicita) si {$N+} pentru folosirea tipurilor din conventia IEEE (SINGLE, DOUBLE, EXTENDED, COMP), cand se genereaza cod pentru coprocesorul matematic 80x87. Aceasta solutie este posibila si cand coprocesorul lipseste din configuratia calculatorului, fiind disponibila o biblioteca de rutine care emuleaza software operatiile de calcul virgula mobila. Prezenta coproce-sorului, respectiv folosirea emularii se specifica prin directiva de compilare {$E}, astfel: {$E+} pentru folosirea emularii (valoare implicita) si {$E-} cand coprocesorul este prezent fizic. La compilarea cu starea {$N+,E+} se obtine un program executabil pe orice calculator, indiferent daca este prezent sau nu coprocesorul matematic. In starea {$N+,E-}, Turbo Pascal foloseste o biblioteca redusa de rutine, viteza de executie creste, dar programul poate fi rulat numai cu coprocesor existent in configuratie. Starea {$N-,E-} forteaza utilizarea tipului REAL, cand coprocesorul nu este necesar sau este igno-rat.
Tipul COMP desemneaza o data reala particulara, avand numai valori intregi. In operatii ea intra ca o data reala, cu partea zecimala egala cu zero. Valorile memorate intr-o variabila de tip COMP apartin, aproxi-mativ, intervalului [-9.2E18,9.2E18].
Variabilele reale, constantele simbolice si constantele cu tip se declara conform, unde tip este un tip real (REAL, SINGLE, DOUBLE, EXTENDED, COMP).
In operatii, toate tipurile reale sunt compati-bile intre ele. Operatorii aritmetici sunt:
+ adunare (sau operator unar);
- scadere (sau operator unar);
* inmultire;
/ impartire reala.
Rezultatul este de tip REAL (cu directiva {$N-}) sau EXTENDED (cu directiva {$N+}). Operatorul "/" se poate aplica si asupra a doi operanzi de tip intreg, rezultatul fiind real (REAL sau EXTENDED). Datele de tip real pot fi puse in relatie (<, <=, =, >, >=, <>), rezultatul logic fiind in concordanta cu valoarea lor in multimea R.
Tipul sir de caractere
In Turbo Pascal este implementat tipul structurat sir (STRING), care defineste siruri de caractere ASCII, de lungime variabila. Lungimea maxima a sirurilor este 255 caractere, iar lungimea minima este zero, pentru sirul null (vid). In ISO Standard Pascal nu este imple-mentat tipul STRING, dar se poate lucra cu siruri de lungime fixa, declarate cu tipul PACKED ARRAY[li..ls] OF CHAR. Literalii de tip STRING se declara conform Din analiza diagramei se observa ca in definirea literalilor de tip STRING se pot succede siruri scrise in cele trei moduri prezentate in
Exemple:
'PASCAL'
'EXPRESIE'#13#10'BOOLEANA'^B'w'
Trebuie retinuta restrictia ca doua siruri scrise intre apostrofuri nu se pot succede imediat (de exemplu, 'ALFA''BETA', nu reprezinta sirul ALFABETA ci sirul ALFA'BETA).
Tipul sir se declara conform. Daca la declarare nu se specifica lungimea maxima, se considera, implicit, 255 caractere. Variabilele, constantele simbolice si constantele cu tip se declara conform, unde tip este tip_sir.
Modelul de reprezentare interna a tipului STRING este redat in Lungimea efectiva a sirului este numarul de caractere pe care il are valoarea memorata. Lungimea maxima a sirului este numarul de caractere specificat in descrierea datelor STRING. Lungimea fizica a zonei ocupate de sir este egala cu lungimea maxima plus unu, deoarece un octet (cel de adresa relativa zero) este rezervat pentru memorarea lungimii efective. Lungimea efectiva se incarca in octetul zero in momentul atribuirii unei valori variabilei de tip STRING. In toate operatiile este implicat sirul efec-tiv, adica sirul a carei lungime este memorata in octetul zero. Sirurile pot fi referite in totalitatea lor, prin numele variabilei STRING. Pot fi, de asemenea, referite caractere din sir, utilizand constructia din. Elementul referit prin constructia 2.14 este de tip CHAR. In exemplul din ,b[1] este carac-terul P, b[2] este caracterul A etc. ORD(b[4]) returneaza valoarea 67, PRED(b[2]) returneaza caracterul B, SUCC(b[2]) returneaza caracterul D.
Se poate referi si octetul care memoreaza lungi-mea, prin numarul de octet zero. De exemplu, b[0]. Cu toate ca octetul zero memoreaza intregi din domeniul 0..255, el este tot de tip CHAR. De aceea, cu acest octet trebuie sa se lucreze ca si cu datele de tip CHAR. De exemplu, daca utilizatorul doreste sa forteze lungimea efectiva a sirului la 8, se poate scrie: b[0]:=#8 sau b[0]:=^H, sau b[0]:=CHR(8). Ultima varianta ofera avantajul ca lungimea efectiva poate rezulta dintr-o expresie intreaga (CHR(expresie_intr-eaga)).
Cu datele de tip STRING poate fi realizata operatia de concatenare (+). Acelasi efect se obtine utili-zand functia CONCAT. Datele de tip STRING pot fi puse in relatie (<, <=, =, >, >=, <> ). Compararea se face caracter cu caracter, de la stanga la dreapta (lexicogra-fic), terminandu-se fie la intalnirea primei perechi de caractere neegale, fie dupa un numar de comparari egal cu minimul dintre lungimile sirurilor. Doua siruri sunt egale cand au aceeasi valoare (si aceeasi lungime). Doua siruri sunt inegale cand au valori diferite (sau lungimi diferite). Un sir este mai mare ca altul in urmatoarele situatii:
a) cand, in analiza de la stanga la dreapta, se intalneste un caracter din respectivul sir mai mare decat caracterul corespunzator din celalalt sir (si analiza se termina).
b) cand lungimea sirului respectiv este mai mare si s-a realizat numarul de comparari egal cu minimul dintre lungimile sirurilor. In biblioteca Pascal exista subprograme care prelucreaza siruri de caractere (anexa 1)
Tipul masiv
Tipul masiv (prezent in ISO Standard Pascal) este structurat si desemneaza o multime finita de elemente omogene constituita ca un tablou cu una, doua sau mai multe dimensiuni. Multimea are un singur identificator si ofera posibilitatea referirii elementelor in acces direct prin pozitie, determinata printr-un numar de expresii indiceale corespunzand dimensiunilor masivului. Declararea tipului masiv (ARRAY) se face conform. Tip_dimensiune este ordinal (mai putin LONGINT) si precizeaza, pe de o parte, numarul de elemente de pe fiecare dimensiune, care se rezerva in moment