Tipuri de date simple


Conceptul de dată

Informația care se păstrează în calculator se numește șir de date.
Data reprezintă o entitate cu care poate opera calculatorul.
Majoritatea limbajelor de programare conțin de introducere a datelor, de prelucrare și de afișare a acestora.
O data se păstreaza in calculator sub formă de variabilă.
Majoritatea limbajelor de programare cer ca variabilele folosite sa fie declarate. La declararea lor se indica 2 caracteristici:
<numele variabilei>:<tipul de date>


Prin tip de date se înţelege modul în care informaţia este reprezentată în memoria 
calculatorului. Tipul datei oferă două informaţii esenţiale: 

  • Mulțimea de valori admisibile;
  • Mulțimea de operații care pot fi aplicate la anumite tipuri de date.
  1. Folosind operația de citire (de exemplu: READ(x));
  1. Folosind operația de atribuire (<nume variabila> := <expresia>).


Folosirea unor operaţii care nu sunt specifice cu tipul de operanzi, generează o eroare semnalizată la compilarea programului. 

La declararea variabilei, tipul de date se indică print-un nume. Și în dependență de acest nume,  în memoria operativă a calculatorului se rezervează un anumit spațiu. 

TIPUL DE DATE INTEGER

Tipul de date INTEGER se utilizează pentru prezentarea numerelor întregi cu semn.
Exemplu:
VAR   A: integer
          B: integer

Mulțime de valori admisibile a acestui tip de date se afla pe intervalul 

Pentru acest tip de date pot fi utilizate următoarele operații:


TIPUL DE DATE REAL


Tipul real este mulțimea de numere reale
{x |x = + 0 , x x . . . x · b și x sunt cifre în baza b și l < e < l }
unde baza b a sistemului de enumerație, limitele l și l ale exponentului e și numarul n + 1.
Exemplu: b=2, -128<e < 127 iar n = 23.
Elementele tipului real se reprezintă în programe prin literale numerice de formele i . f , i . fEs sau iEs , eventual precedate de semnul + sau - , unde i și f sunt numere zecimale întregi fără semn reprezentînd partea întreagă și respectiv partea fracționara a literalului numeric.
Exemplu: -0,25 al tipului real poate apare în programe Pascal în una din formele -0.25, -25E-2, -25.0E-2.
În programele Pascal elementele tipului real se presupun a fi scrise în baza 10. Reprezentarea sau memorarea acestora în calculator se face în virgulă mobilă pe 2 cuvinte 32 biti – simpla precizie sau pe 4 cuvinte 64 biti – dubla precizie. Pozitie binara 15 prima din stanga, in notatia uzuala a primului cuvant este a semnului, in pozitiile 7 – 14 ale primului cuvant se memoreaza caracteristica exponentului marit cu 128, iar in rest se memoreaza mantisa partea fractionara fara prima pozitie dupa virgula.
Caracteristica este: c= 128 + e = 2 + 1= 10000001
Primul cuvant al reprezentarii in calculator este 0 10000001 000000, iar al doilea cuvant 0000000000000000 in baza 2. Reprezentarea octala este 40200, respectiv 0. In mod analogic, -5.0 se va reprezenta prin numerele octale 140640 si 0.
Cel mai mare numar real reprezentabil in simpla precizie este
0, 111111111111111111111111· 2 1 · 2 10 .
Cel mai mic numar real pozitiv reprezentabil este:
0,1 · 2 = 2 10 .

Numerele reale de forma 0,1 x …….. x i,part intervalul [½, 1) in 2 subintervale de lungime (1- ½) ∙2 = 2 .

Pentru acest tip de date pot fi utilizate următoarele operații: 
Operatori
Domeniu de definiţie
Domeniu de valori
+ - / *
real x real
real
= <> < > <= >=
real x real
boolean


TIPUL DE DATE BOOLEAN

Datele de tip Boolean pot avea valorile adevărat sau fals:

  • – pentru False
  • – pentru True



Declaraţia de tip: <nume>[=<valoare>] [,<nume>[=<valoare>]] : <tip> ;
Declaraţia de tip boolean:  <nume>[=<valoare>][,<nume>[=<valoare>]] : boolean;
Exemplu: beta, gamma = true, delta = false : boolean ;

Operaţii corecte şi incorecte
:= – Operaţia de atribuire
Exemplu:
a := True;
b := False; 

Readln – datele nu se introduc de la tastatură.
Writeln – datele de tip logic nu pot fi afişate. 


NOT – operaţie unară, de o singură variabilă. Ea reprezintă operaţia de negare (inversare).
Tabelul de adevăr al operaţiei NOT:

OR  adunarea logică de 2 sau mai multe variabile. Rezultatul este adevărat, dacă măcar o variabilă este adevarată.
Tabelul de adevăr al operaţiei OR:

AND – înmulţirea logică de 2 sau mai multe variabile. Rezultatul este adevărat, dacă ambelevariabile sunt adevăraţe.
Tabelul de adevăr al oferaţiei AND:


Tipului de date Boolean îi sunt caracteristice următoarele operaţiile relaţionale






TIPUL DE DATE CHAR

Pentru acest tip de date pot fi utilizate următoarele operații:


Operatori
Domeniu de definiţie
Domeniu de valori
= <> < > <= >=
char x char
boolean
succ pred
char
char
ord
char
integer

Tipuri de date ENUMERARE


Pascal pune la dispoziţie programatorului mai multe mecanisme prin care el să-şi construiască noi tipuri. Cel mai simplu dintre acestea este enumerarea. Enumerarea construieşte un nou tip cu un număr finit de elemente descriind între paranteze reprezentarea canonică a fiecărui element.

Exemplu : (rosu, verde, albastru, galben, mov, negru, alb) este descrierea unui nou tip care are 7 elemente cu reprezentările rosuverde, etc. Putem da acestui tip un nume folosind directiva type din Pascal.

type culoare = (rosu, verde, albastru, galben, mov, negru, alb);
culoare = { rosu, verde, albastru, galben, mov, negru, alb }


Tipul boolean din Pascal ar putea fi definit el însuşi astfel:



type boolean = (false, true);


Pentru acest tip de date pot fi utilizate următoarele operații:

Eratori
Domeniu de definiţie
Domeniu de valori
pred succ
T
T
= <> < > <= >=
T x T
boolean
ord
T
integer

Tipuri de date SUBDOMENIU


Există o operaţie prin care dintr-un tip scalar putem extrage o submulţime formată din elemente consecutive. Ea devine un nou tip care se va numi un subdomeniu(``subrange'' în engleză) al celui iniţial. Pentru că pe tipurile scalare există o ordine, submulţimea se indică prin capetele ei. 
Exemplu: 1 .. 10 este un tip subdomeniu al integer, avînd 100 de elemente.
Iată un tip subdomeniu al tipului culoare definit mai sus, căruia îi dăm şi un nume:
type CulPrimara = rosu .. albastru;
Tipul numit CulPrimara are 3 elemente: 
CulPrimara = {rosu, verde, albastru }.

Tipuri 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.

Exemple:
ord(18)=18
ord(23)=23

Remarca:
Functiile pred si succ pot fi aplicate oricaror date de tip ordinal si vor returna o valoare ordinala de acelasi tip.
.....ord('1'), ord('2'),..., ord('9') 
returneaza valorile: 
.....49,50,51,...,57.
Remarci:
  • Nu este incorecta exprimarea "chr(n) converteste n într-un caracter", dar trebuie sa întelegeti exact sensul acestei exprimari:chr(n) sau ord(e) nu vor schimba efectiv pe "n" sau "e" - ele numai folosesc "n" si "e" pentru a "vedea" o valoare corespunzatoare în alt domeniu; astfel, functiile ord, respectiv chr functioneaza ca functii de transfer.
  • Functiile ord si chr pot fi folosite pentru a schimba o litera din majuscula în minuscula si invers. Astfel, enuntulwrite(chr(32+ord('D'))) va afisa d (vezi codul ASCII).
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'.
  • Pentru a converti cifra car de tip char în valoare numerica se utilizeaza relatia:
    ......ord(car)-ord('0'),
    unde, ord('0') are valoarea 48.
De exemplu:
ord('8')-ord('0')=56-48=8.
  • Daca val este un întreg în intervalul [0, 9], caracterul corespunzator lui va fi chr (val + ord('0')).
    De exemplu,
    ......chr(9+ord('0'))=chr(57)='9'.
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);
......
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:
k:=k+1 sau k:=k-8
(vezi exemplele anterioare).

Trei din cele patru tipuri de date PASCAL studiate sunt ordinale, si anume: integer, char siboolean. Î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: ordoddsuccpred 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 truedaca 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:
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:
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: 
De asemenea, conform codului ASCII, chr(102)='f' si chr(35)='#'.
Deci, numai pentru cazul care implica tipul char functiile ord si chr formeaza o pereche inversa.
.....ord(chr(13))=13, chr(ord('c'))='c'.
Procedura inc - este declarata cu doi parametri formali de tip întreg; al doilea parametru este optional. 
Procedura dec - este declarata cu doi parametri formali de tip întreg; al doilea parametru este optional.