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;
|