Ori de cāte ori scriem un program (Borland) PASCAL nu este bine sa ne limitam numai la tipurile ordinale primitive (predefinite) integer, char si boolean. (Borland) Pascal, spre deosebire de alte limbaje, ne ofera facilitatea de a crea tipuri ordinale suplimentare: enumerare (tratat īn aceasta sectiune) si subdomeniu. Ambele tipuri de date se utilizeaza īn special pentru a da mai multa claritate programelor.
Prin introducerea acestor tipuri de date ni se ofera posibilitatea de-a transmite compilatorului informatii īntr-un limbaj mai apropiat de limbajul nostru natural (informatii ce se supun unei sintaxe validate de compilator) si de a realiza astfel programe mai usor de scris si de citit.
Noile tipuri de date (enumerare si subdomeniu) pot fi identificate printr-un nume ales de utilizator (de regula īn concordanta cu semnificatia obiectelor de tipul respectiv), definit īntr-o sectiune TYPE, sau pot fi anonime, acestea definindu-se direct īn sectiunea VAR.
Iata un exemplu de sectiune TYPE care defineste tipuri enumerare, utilizate apoi īn sectiunea VAR pentru a declara o serie de variabile:
|
Exemplu:
|
Mai jos este prezentata diagrama de sintaxa a tipului enumerare:

Observati, deci, ca un tip enumerare este o lista de identificatori (Borland) PASCAL valizi, separati prin virgule si inclusi īntre paranteze rotunde.
Identificatorii din paranteze se numesc elementele tipului enumerare (īn engleza, elements of an enumerated type). Odata ce tipul (zi, operator,..., procesoare) a fost definit īn sectiunea TYPE, putem declara īn sectiunea VAR variabilele corespunzatoare ca fiind de tipul respectiv.
Putem atribui valori particulare variabilelor:
|
Exemplu:
|
Nu putem scrie, de exemplu:
....persoana:=sefcatedra;
īntrucāt nu am prevazut īn descrierea tipului "functie" pe "sefcatedra" ca un nume de functie autorizat (acest identificator -sefcatedra- nu exsita īn lista de definire a tipului functie") cu toate ca putem sa o facem.
Din moment ce variabila zilucru, de exemplu, poate lua o data numai o singura valoare, atunci tipul corespunzator lui zi nu este numai tip de enumerare, ci este si un tip simplu de date. Nu este totusi un tip primitiv (standard sau predefinit) īntrucāt zilele saptamānii (luni, marti, miercuri, joi, vineri, sāmbata, duminica) reprezinta elemente ale unui tip enumerare, care nu pot fi citite sau scrise ca atare (chiar daca ele pot arata ca siruri de caractere, PASCAL-ul standard nu le considera astfel).
Exista dialecte PASCAL care permit introducerea si afisarea valorilor de tip enumerare, precum si a valorilor de tip boolean.
Pentru cazul mai sus prezentat:
succ(joi)=vineri
nu din cauza faptului ca (Borland) PASCAL-ul este destept, ci numai pentru faptul ca zilele saptamānii au fost listate īn ordinea lor obisnuita atunci cānd am declarat tipul zi. Aceasta ordine aleasa de noi, īn mod natural, fireste, forteaza ca ord(luni) sa fie zero si ord(duminica) sa fie 6. Totusi succ(duminica) si pred(luni) sunt nedefinite chiar daca pentru noi toti este evident ca dupa duminica urmeaza luni.
Trebuie sa facem cāteva remarci suplimentare referitoare la tipul enumerare.
![]() |
Remarci:
nu sunt legale daca luni,..., duminica reprezinta elementele unui tip enumerare. Īn astfel de cazuri luni, marti etc. sunt identificatori, reprezentāndu-se pe ei īnsisi - nu sunt variabile. |
Acum, referitor la omisiunea lui vineri, sa presupunem ca un programator este ispitit sa declare doua tipuri enumerare īn aceasi sectiune type, ca īn exemplul urmator:
|
Exemplu:
|
Nu este nimic gresit īn legatura cu tipul celor sase zile, dar exista o problema cu duplicarea celor sase nume īn tipurile zi si zile. Ce poate raspunde compilatorul (Borland) PASCAL la succ(joi)? Urmatoarea regula previne astfel de situatii.
![]() |
Regula: Elementele tipurilor enumerare declarate īn sectiunile type trebuie sa fie unice. Exprimarea "īn sectiunile TYPE" acopera situatia īn care un program principal si procedurile sale au fiecare propriile lor sectiuni TYPE. Asa cum īntr-o procedura se pot declara variabile locale care au acelasi nume ca variabilele (globale) din programul principal, tot asa se pot folosi elemente ale unui tip enumerare, locale, care au acelasi nume cu identificatorii din programul principal. |
|
Remarca: Declaratiile anonime ale tipului enumerare, din sectiunea VAR pot genera o serie de probleme de compatibilitate; de aceea se recomanda ca orice nou tip de data necesar īn rezolvarea unei probleme sa fie definit explicit (īn sectiunea TYPE). |
Precizam la īnceputul sectiunii cāteva din avantajele pe care le ofera tipul enumerare. Īn cele ce urmeaza ne propunem sa fim mai convingatori.
Daca o problema ce implica zilele saptamānii o putem rezolva apelānd la tipul enumerare, la fel de bine putem rezolva aceeasi problema folosind, pentru zilele saptamānii coduri, de la 1 la 7 sau de la 0 la 6. Folosirea unei liste de tip enumerare, cu specificatii literale ale zilelor saptamānii are doua avantaje. Primul: daca am folosi numere (coduri), putem savārsi erori de genul - ziua a 8-a sau a 13-a - exprimari legale sintactic, dar semantic fara sens. Cu exprimari literale (text), compilatorul nu va avea de ce sa se ... blocheze.
Al doilea avantaj: tipul de date enumerare confera programului mai multa claritate.
Enuntul:
este cu siguranta mult mai pe īntelesul cititorului, decāt corespondentul sau:
Folosirea judicioasa īn cadrul programelor PASCAL a tipului enumerare duce la minimizarea comentariilor, programele devenind mult mai clare si mai usor de īnteles. Si acum, o aplicatie care foloseste tipul de date enumerare.
![]() |
Aplicatie. Dāndu-se un numar de la 1 la 365 , care reprezinta ziua din cadrul unui an (nu un an bisect) sa se afiseze īn clar data respectiva. De exemplu, pentru 1 se va afisa 1 ianuarie; pentru 365 se va tipari 31 decembrie s.a.m.d. Se va tipari un mesaj de eroare daca numarul introdus este mai mic ca 1 si mai mare ca 365. |
![]() |
Indicatie. Daca numarul precizat se afla īn intervalul 1-31, inclusiv , evident luna este ianuarie. Pentru domeniul 32-59 luna trebuie sa fie februarie. Daca numarul introdus este 40, data este: (40 minus 31) februarie, unde 31 reprezinta numarul de zile ale lunii anterioare. Asadar, pentru numarul 40 programul va afisa 9 februarie. |
Lista programului sursa si rezultatele executiei programului sunt prezentate īn continuare:
- luna=(ianuarie, februarie, martie, aprilie, mai, iunie, iulie, august, septembrie, octombrie, noiembrie, decembrie);
- nrzi:integer; {variabila de intrare: numarul zilei}
- m:luna; {numele lunii corespunzatoare numarului zilei}
- zi:integer; {numarul zilei īn cadrul lunii identificate}
Rezultatele executiei programului
|
|
Remarca.
^Z (Ctrl + Z) este end of file. |