Tipuri de date ordinale si functii ordinale
Tipul de date ordinale cuprinde un domeniu de valori care pot fi ordonate si care pot fi, prin urmare numarate (0, 1, 2, 3...) pâna la valoarea maxima permisa.
|
Remarca. În (Borland) PASCAL numaratoarea începe, mai degraba de la 0 decât de la 1; este ceva arbitrar, dar procedeul este obisnuit în stiinta calculatoarelor. |
Trei din cele patru tipuri de date PASCAL studiate sunt ordinale, si anume: integer, char si boolean. Întregii sunt evident ordinali. Tipul char este un tip ordinal datorita numarului finit al caracterelor si secventei acestora - caracterele sunt ordonate si consecutive. Valorile booleene sunt usor de numarat, din moment ce sunt numai doua; false este zero si true este unu..
Datele de tip real nu sunt de tip ordinal deoarece nici un numar real nu are un predecesor sau un succesor.
Exista patru functii ordinale (predefinite) utilizate frecvent: ord, odd, succ, pred si chr. În completarea functiilor succ si pred, (Borland) PASCAL ofera alte doua proceduri care modifica valorile ordinale: inc si dec.
Functia odd(x) - primeste un argument întreg si returneaza un rezultat boolean, cu valoarea true daca argumentul (x) este impar (pozitiv sau negativ) si false în caz contrar.
Functia ord(x) - primeste un argument de un tip ordinal si întoarce un rezultat de tip întreg, reprezentând valoarea ordinala a entitatii x. .
În acord cu valorile booleene, ord(false) returneaza 0 si ord(true) are valoarea 1.
Daca pentru functia ord folosim ca argumente întregii, aplicarea acestei functii este fara sens , întrucât ea va returna aceleasi valori (ordinea unui întreg este data de chiar valoarea acelui întreg!). Iata câteva exemple:
|
Exemple: ord(18)=18 ord(23)=23 |
Din cauza multitudinii de seturi de caractere folosite, evident nu ne putem astepta ca functia ord ('C'), de exemplu, sa returneze aceeasi valoare pe toate tipurile de calculatoare cu care lucram. Ne putem astepta însa ca:
ord('A') < ord('B') sau
ord('d') < ord('e') sau
ord('2') " ord('3').
In completarea lui ord, PASCAL-ul are o pereche de functii denimite succ si pred, astfel:
Functia pred(x) - primeste argument de tip ordinal; întoarce un rezultat de acelasi tip ordinal ca si argumentul, reprezentând elementul având valoarea ordinala cu 1 mai mica decât ce a lui x.
Functia succ(x) - primeste argument de tip ordinal; întoarce un rezultat de acelasi tip ordinal ca si argumentul, reprezentând elementul având valoarea ordinala cu 1 mai mare decât ce a lui x.
Este usor de observat ca succ(4) este 5, iar pred(9) este 8, dar aceleasi rezultate le putem obtine si prin adaugarea sau scaderea lui 1 din acel numar al carui succesor sau predecesor îl dorim. Pentru caractere, totusi, lucrurile sunt putin mai complicate ! Evident nu putem adauga 1 unei variabile de tip char, sa zicem aga, dar putem calcula succ(aga) pentru a obtine caracterul a carui valoare ordinala este cu 1 mai mare în secventa comparatoare (în engleza collating sequence).
De exemplu, daca aga este 'c' , atunci succ(aga)
este 'd'. Relatia dintre cele doua functii poate fi exprimata astfel:
pred(succ(d))=d=succ(pred(d)) unde d este un element de tip ordinal,
cu conditia ca pred(d) si succ(d) sa existe.
|
Remarca: Functiile pred si succ pot fi aplicate oricaror date de tip ordinal si vor returna o valoare ordinala de acelasi tip. |
Functia chr(x) - primeste un argument de tip întreg si întoarce un rezultat de tip char, a carui valoare este caracterul cu numarul de ordine x. Aceasta valoare depinde de implementare.
De exemplu, conform codului ASCII, secventa:
ord('1'), ord('2'),..., ord('9') returneaza valorile:
De asemenea, conform codului ASCII, chr(102)='f' si chr
Deci, numai pentru cazul care implica tipul char functiile ord si chr formeaza o pereche inversa.
ord(chr(13))=13, chr(ord('c'))='c'.
|
Remarci:
De notat, ca în conformitate cu codul ASCII, orice litera mica are o valoare mai mare cu 32 decât valoarea ordinala a literei mari corespunzatoare De exemplu, ord('D')=68, iar chr(32+68 )='d'. ord('a') - ord('A')=32 ord('z') - ord('Z')=32 Deci, putem generaliza: literamica:=chr(32+ord(literamare)) respectiv: literamare:=chr(ord(literamica)-32). De exemplu: chr(ord('d')-32)=chr(100-32)=chr(68)='D'.
De exemplu:
|
Procedura inc - este declarata cu doi parametri
formali de tip întreg; al doilea parametru este optional.
Efect: incrementeaza variabila data ca prim parametru cu valoarea data
de al doilea parametru. Daca nu se precizeaza un al doilea parametru, se
realizeaza incrementarea cu o unitate.
|
Exemplu: k:=17; inc(k); inc(k,2); |
Procedura dec - este declarata cu doi parametri
formali de tip întreg; al doilea parametru este optional.
Efect: decrementeaza variabila data ca prim parametru cu valoarea data
de al doilea parametru. Daca nu se precizeaza un al doilea parametru, se
realizeaza decrementarea cu o unitate.
|
Exemplu: k:=17; dec(k); dec(k,8); |
|
Remarca: Este de remarcat ca apelul procedurilor inc sau dec
produce un cod mai bun decât echivalentul: |
Tipul
Boolean
Tipul boolean este ordinal, enumerativ: (FALSE, TRUE).
Operatorii logici care i se pot aplica sunt:
* NOT
operatia logica "nu"
* AND
operatia logica "si"
* OR
operatia logica "sau"
* XOR
operatia logica "sau exclusiv" - un "sau exclusiv" este
adevarat daca un operand este adevarat, dar nu amandoi. A XOR B inseamna
"A sau B, dar nu amandoua".
Operatorii logici se pot aplica si tipurilor intregi de date, dar in acest caz operatiile logice se fac pe biti (se considera True = 1 si False = 0)
Tipul enumerare
Tipul enumerare defineste o multime ordonata de valori : se enumera un sir de identificatori care desemneaza valorile posibile. Primul identificator desemneaza cea mai mica valoare, cu numarul de ordine zero. Ceilalti identificatori desemneaza succesorul valorii specificate de catre identificatorul precedent. Identificatorii apar în ordinea crescatoare a valorii lor.
Tipul enumerare se defineste în sectiunea Type astfel :
Type nume_tip = (identif,identif, . , identif);
Exemplu :
Type sex=(barbat, femeie);
Studii=(elementare, medii, superioare);
Variabilele de tip enumerare sînt declarate în sectiunea var. Ele pot lua una din valorile însirate în lista de enumerare.
Var s:sex;
Pregatire:studii;
Limba:(engleza,franceza);
Aici variabila s poate sa ia una din valorile barbat sau femeie, variabila pregatire poate sa ia una din valorile superioare, medii sau elementare.
Tipul lgic este de fapt un tip de enumerare :
Type boolean=(False,True);
Operatiile care se pot face cu valorile unui tip de enumerare sînt urmatoarele :
Atribuirea
S:=barbat; studii:=superioare;
Limba:=germana;
Determinarea numarului de ordine
Se face cu functia Ord. De exemplu Ord(barbat) returneaza valoarea 0, Ord(medii) returneaza valoarea 1.
Determinarea succesorului se face cu functia Succ sau a predecesorului se face cu functia Pred. De exemplu, prin instructiunea de atribuire :
Limba:=Succ(engleza);
Variabila limba va avea valoarea franceza, iar prin instructiunea :
Pregatire:=Pred(medii);
Variabila pregatire va avea valoarea elemetare.
Încercarea determinarii succesorului ultimului element din lista sau a predecesorului primului element din lista, constituie o eroare.
Comparatia (<, <=, =, >=, >, <>). Doua valori v1 si v2 sînt într-una din relatiile anterioare daca Ord(v1) si Ord(v2) sînt în aceiasi relatie. De exemplu, comparatia "elementare < superioare" furnizeaza rezultatul True, deoarece Ord(elementare)=0 este mai mic decît Ord(superioare)=2.
Tipul interval
Fiind dat
un tip ordinal, din acest tip se poate genera un nou tip, numit tipul interval.
Definitia unui interval indica valoarea
Type nume_tip=valoarea_minima..valoarea_maxima;
Se subliniaza faptul ca nu este permisa definirea unui interval al tipului real, deoarece acesta nu este de tip ordinal. Valoarea minima trebuie sa fie mai mica sau egala cu valoarea maxima.
Exemplu :
Type
Indice=1..10;
Litera='A'..'Z';
Zile=(Lu,Ma,Mi,Jo,Vi,Sî,Du);
Zile_lucrat=Lu..Vi
Var
I:indice;
L:litera;
Z:zile_lucrat;
|