Tipuri de date simple:- Ordinale
Intregi |
Tipuri de date structurate
|
Întregii sunt numere ca: -80, -12, 0, 1 si 907. Matematic, întregii se extind la infinit (în ambele sensuri - pozitiv sau negativ), dar în programarea calculatoarelor exista limite pentru reprezentarea întregilor impuse de hardware. În implementarile uzuale ale limbajului PASCAL, o valoare tipica a limitei superioare (pentru calculatoarele mici) este 32767, dar calculatoarele puternice permit valori mult mai mari.
Indiferent de limita actuala, constanta maxint este predefinita sa contina pentru fiecare tip de calculator valoarea maxima a întregului ce poate fi reprezentat în memoria calculatorului respectiv. Apoi, în functie de modul de reprezentare (atât în program cât si în calculator) cel mai mic întreg negativ permis este, de regula, - maxint-1.
Remarca:Nu exista o constanta predefinita minint. Exista doar daca o definiti dumneavoastra!
De exemplu, (Turbo) PASCAL 4.0, 5.0, 6.0 si (Borland) PASCAL 7.0 prevad tipurile de date longint care pot manipula întregi pâna la 2147483647. În legatura cu aceasta, versiunile 4, 5, 6 si 7 ale limbajului PASCAL mai prevad tipuri întregi (byte, shortint) mai mici decât tipul de date integer (valoarea maxima 32767). In figurile 3.1 si 3.2 se prezinta diagrama de sintaxa pentru numere întregi si o lista completa a tipurilor de date pentru (Turbo) PASCAL, versiunile 4.0, 5.0 si 6.0 si (Borland) PASCAL 7.0.
Boolean
Variabilele de tip Boolean (Boolean vine de la numele matematicianului George Boole) pot avea una din valorile predefinite: true (adevarat) si false (fals). Modul de reprezentare în calculator este (de regula) 0 pentru false si 1 pentru true(false < true). Expresiile booleene, precum z > y, intervin mult mai des în programele PASCAL decât variabilele booleene declarate în cadrul acestor programe. Nu putine sunt cazurile când o valoare logica, rezultata în urma evaluarii unor expresii booleene urmeaza sa fie folosita pentru diferite teste, ca în programul urmator.
Reguli:
Asa cum abilitatea de a manevra cifre este esentiala pentru ingineri, tehnicieni, oameni de stiinta, tot asa abilitatea de a prelucra caractere, texte este esentiala pentru umanisti, oameni de afaceri etc. O variabila (Borland) PASCAL careia putem sa-i atribuim un caracter (litera, cifra, caracter special etc.) trebuie sa fie declarata de tip char, unde char este abrevierea de la character.
Remarca: Doua sau mai multe caractere pot fi combinate într-un sir... de caractere, dar astfel de siruri nu sunt tipuri de date simple, ele reprezinta tipuri de date structurate, ale caror caracteristici le vom prezenta în continuare.Reprezentarea unei constante de tip char se realizeaza încadrând caracterul respectiv între apostrofuri. Folosim apostroful pentru a distinge un caracter, cum ar fi "c" de un identificator c. În interiorul calculatorului, fiecare caracter trebuie sa fie codificat în mod distinct. Forma uzuala de codificare este un numar binar de opt biti care ocupa un byte (octet) de memorie.
String
Daca programele noastre au de a face cu texte sau documente de orice fel, atunci prelucrarea la nivel de caracter se dovedeste a fi incomoda si insuficienta. (Borland) PASCAL prevede, pentru astfel de situatii, un tip "superior" lui char, si anume STRING (sau sir de caractere).
Sirul de caractere, dupa cum îi spune si numele, reuneste mai multe caractere sub "un nume comun". Putem întelege sirul de caractere ca fiind un cuvânt, o propozitie sau o fraza, adica orice formulare scrisa ce contine semne (litere, cifre, semne de punctuatie, semne speciale etc).
Deoarece tipul char, conform tabelei ASCII, poate contine si caractere deosebite, o variabila string poate fi mai mult decât am exemplificat anterior.
Desi tipul STRING prezinta o structura interna comparabila cu cea a masivelor (ARRAY), limbajul (Borland) PASCAL permite programatorului sa-l utilizeze, în multe cazuri, ca pe un tip simplu (vezi Conversatia 4 - operatii de I/E).
Sa analizam putin modul de declarare al variabilelor de tip sir de caractere; ca si în cazul celorlalte declaratii, vom scrie numele identificatorului, caracterul ':' si apoi tipul necesar. În cazul nostru, vom utiliza cuvântul rezervat STRING, urmat (sau nu) de un specificator de format.
Spre deosebire de integer, char, real, care sunt identificatori predefiniti, STRING este cuvânt rezervat!
Real
Doua sunt limitele evidente ale întregilor utilizati în programarea calculatoarelor (în PASCAL):
Datorita acestei limitari, PASCAL-ul prevede alt tip de date, tipul real. Utilizat în PASCAL si în multe alte limbaje de programare, un numar real este numarul caruia îi este permis sa aiba o parte fractionara, chiar daca aceasta fractie se întâmpla sa fie zero. Numarul real 3.0 are o reprezentare interna (în memoria calculatorului) diferita de cea a reprezentarii întregului 3. Numerele reale sunt exprimate în virgula mobila (floating point format). Aceasta nu reprezinta preocuparea dumneavoastra. De notat ca, o data apelate procedurile read/write, au loc conversii zecimal-binar, si invers, a numerelor reale.
TABLOURI UNIDIMENSIONALE
Structura de date este o colecţie de date înzestrată cu informaţii structurale care permit identificarea şi selecţia componentelor.
Componentele unei structuri de date pot fi identificate si selectate fie prin numele, fie prin intermediul relaţiilor structurale. Cea mai simpla relaţie structurala este poziţia fiecărei componente in cadrul structurii.
Asupra unei structuri de date se pot aplica mai multe tipuri de operaţii :vizualizarea elementelor structurii sub diferite forme, actualizarea(adăugarea, modificarea sau ştergerea unei componente), îmbogăţirea structurală(prin adăugarea unor informaţii de legătura) sortare(aranjarea componentelor intr-o anumita ordine stabilita de un anumit criteriu de ordonare.
Din punct de vedere al conţinutului, structurile pot fi:
-omogene(toate componentele structurii sunt de acelaşi tip)
-neomogene(componentele structurii sunt de tipuri diferite)
in funcţie de modul in care sunt memorate structurile de date se împart in doua mari categorii:
-Structuri interne, sunt create in memoria interna RAM a sistemului, şi au un caracter temporar, datorită faptului ca memoria interna este volatila.
-Structuri externe, sunt depozitate pe un suport de memorie externa (hard-disk.floppy-disk), având astfel un caracter permanent.
program ordonare alfabetica;
var x:array[1..20] of string;
i,j,n:integer;aux:string;
begin
write ('cati elevi sunt?=');
readln ;
for i:=1 to n do;
begin
write('nume elev x ',i,':');
readln(x[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if x[i]<x[j] then
begin
aux:=x[i];x[i]:=x[j];x[j]:=aux;
end;
writeln ('ordinea alfabetica este:');
for i:= 1 to n do writeln(i,'',x[i]);
readln;
end.
Tablouri bidimensionale
Declaraţia are următoarea formă generală:
type TipTab=array[ tip_indice 1 , tip_indice 2] of tip_de_bază; var tablou:TipTab;
unde prin tip_indice 1 , tip_indice 2 se înţelege tipul valorilor din care se alimentează indicii (este obligatoriu un tip ordinal), iar tip_de_bază este tipul elementelor tabloului.
Acest tip de bază poate fi orice: putem avea elemente de orice tip numeric, de caractere sau şiruri de caractere, valori booleene, înregistrări (vezi tipul record), tablouri de cele mai diverse tipuri etc.
tip_indice 1 , tip_indice 2 pot fi identificatori de tip predefinit sau definit de utilizator şi, de asemenea, pot fi expresii, cu menţiunea că în acestea pot interveni doar constante şi constante simbolice:
Exemplu
const n=5;
var TipTablou=array[1..2*n,1..n] of Byte;
Numere=array[Boolean,Byte] of Integer;
Dacă structura unui tablou este descrisă în secţiunea var, atunci el va avea un tip anonim. Asociind tipului respectiv un identificator de tip într-o declaraţie type, acesta va putea fi folosit în program, oriunde vrem să referim acest tip.
Exemplu
type TipTablou=array[1..10,1..5] of Byte;
var x,y:TipTablou;
a:array[1..10,1..5] of Byte;
b,c:array[1..10,1..5] of Byte;
În programul care conţine aceste declaraţii, tablourile x şi y vor fi considerate de acelaşi tip (TipTablou), b şi c, de asemenea vor avea un tip comun (anonim), iar a va fi de tip anonim diferit de TipTablou, respectiv de tipul anonim al lui b şi c. Citirea tablourilor bidimensionale
În programe, de regulă, prima operaţie va fi citirea unui astfel de tablou. În limbajele Pascal şi C nu se poate citi o variabilă de tip tablou. Această operaţie se va realiza element cu element.
Subalgoritm Citire(n,x):
citeşte m,n
{ tabloul x are m linii şi n coloane }
pentru i=1,m execută:
pentru j=1,n execută:
citeşte x[i,j]
sfârşit pentru
sfârşit pentru
sfârşit subalgoritm
Afişarea tablourilor bidimensionale
Afişarea tablourilor se realizează asemănător. Dacă dorim să realizăm o afişare linie după linie a tabloului x de tipul tablou, având m linii şi n coloane, în Pascal vom scrie procedura în felul următor:
procedure Afişare(m,n:Byte; x:tablou);
begin
for i:=1 to m do begin
for j:=1 to n do
Write(x[i,j],' ');
WriteLn
end
Record
Alaturi de ARRAY, (Borland) PASCAL accepta alte trei tipuri de date structurate: RECORD, Set si File. Desi nu sunt unice în (Borland) PASCAL, RECORD-urile sunt elemente nepretuite ale limbajului, deoarece ele faciliteaza prelucrarea datelor structurate în fisiere, dar în plus ele ne permit sa cream ARRAY-uri de date agregate de tipuri mixte - un instrument foarte puternic de organizare a datelor.
In cadrul acestei conversatii, la capitolul Array multidimensional(exemplul precedent) am folosit ARRAY-ul bidimensional scoala pentru a retine numarul de fete din cele 7 grupe pe o linie si numarul de baieti pe alta linie.
Structura ARRAY-ului a fost potrivita întrucât toate datele de intrare sunt de acelasi tip: întreg. In continuare, dorim sa extindem facilitatile programului masiv incluzând numele profesorului de informatica din cele 7 grupe. In acest caz, nu am putea extinde structura originala pentru a forma un ARRAY 3*7 întrucât legile PASCAL-ului cer, dupa cum va amintiti, ca ARRAY-urile sa fie omogene; nu putem combina un nume (sir de caractere) cu componente întregi pentru a forma unARRAY. Totusi (Borland) PASCAL-ul ofera o alternativa si anume tipul structurat numit RECORD, care ne permite sa realizam asociatii neomogene. Iata o declaratie corespunzatoare pentru descrierea unei grupe.
Indiferent de limita actuala, constanta maxint este predefinita sa contina pentru fiecare tip de calculator valoarea maxima a întregului ce poate fi reprezentat în memoria calculatorului respectiv. Apoi, în functie de modul de reprezentare (atât în program cât si în calculator) cel mai mic întreg negativ permis este, de regula, - maxint-1.
Remarca:Nu exista o constanta predefinita minint. Exista doar daca o definiti dumneavoastra!
De exemplu, (Turbo) PASCAL 4.0, 5.0, 6.0 si (Borland) PASCAL 7.0 prevad tipurile de date longint care pot manipula întregi pâna la 2147483647. În legatura cu aceasta, versiunile 4, 5, 6 si 7 ale limbajului PASCAL mai prevad tipuri întregi (byte, shortint) mai mici decât tipul de date integer (valoarea maxima 32767). In figurile 3.1 si 3.2 se prezinta diagrama de sintaxa pentru numere întregi si o lista completa a tipurilor de date pentru (Turbo) PASCAL, versiunile 4.0, 5.0 si 6.0 si (Borland) PASCAL 7.0.
Boolean
Variabilele de tip Boolean (Boolean vine de la numele matematicianului George Boole) pot avea una din valorile predefinite: true (adevarat) si false (fals). Modul de reprezentare în calculator este (de regula) 0 pentru false si 1 pentru true(false < true). Expresiile booleene, precum z > y, intervin mult mai des în programele PASCAL decât variabilele booleene declarate în cadrul acestor programe. Nu putine sunt cazurile când o valoare logica, rezultata în urma evaluarii unor expresii booleene urmeaza sa fie folosita pentru diferite teste, ca în programul urmator.
Reguli:
- false < true;
- Operatorii logici, specifici tipului boolean sunt: AND, OR, NOT, XOR (ultimul apare în versiunile de (Borland) PASCAL);
- Pentru a compara doua valori numerice se utilizeaza operatorii de relatie: < (mai mic); <= (mai mic sau egal); > (mai mare); >= (mai mare sau egal); <> (diferit de);
- Pentru a separa expresiile de relatie de operatorii logici se utilizeaza parantezele (Exemplu: 5 £ a £ 8 se codifica (a >= 5) AND (a <= 8));
- Nu este indicat sa se testeze egalitatea valorilor reale;
- Pentru valori de tip boolean putem considera o serie de functii specifice: ord, odd, eof, eoln etc.;
- Procedura readln nu accepta o variabila booleana.
Asa cum abilitatea de a manevra cifre este esentiala pentru ingineri, tehnicieni, oameni de stiinta, tot asa abilitatea de a prelucra caractere, texte este esentiala pentru umanisti, oameni de afaceri etc. O variabila (Borland) PASCAL careia putem sa-i atribuim un caracter (litera, cifra, caracter special etc.) trebuie sa fie declarata de tip char, unde char este abrevierea de la character.
Remarca: Doua sau mai multe caractere pot fi combinate într-un sir... de caractere, dar astfel de siruri nu sunt tipuri de date simple, ele reprezinta tipuri de date structurate, ale caror caracteristici le vom prezenta în continuare.Reprezentarea unei constante de tip char se realizeaza încadrând caracterul respectiv între apostrofuri. Folosim apostroful pentru a distinge un caracter, cum ar fi "c" de un identificator c. În interiorul calculatorului, fiecare caracter trebuie sa fie codificat în mod distinct. Forma uzuala de codificare este un numar binar de opt biti care ocupa un byte (octet) de memorie.
- Multimea caracterelor ce pot fi procesate de un calculator se numeste set de caractere;
- Utilizarea a 8 biti permite reprezentarea în principiu a 28 sau 256 de coduri diferite, neacordându-se coduri pentru toate caracterele;
- Limbajul (Borland) PASCAL foloseste setul de caractere ASCII (extins).
String
Daca programele noastre au de a face cu texte sau documente de orice fel, atunci prelucrarea la nivel de caracter se dovedeste a fi incomoda si insuficienta. (Borland) PASCAL prevede, pentru astfel de situatii, un tip "superior" lui char, si anume STRING (sau sir de caractere).
Sirul de caractere, dupa cum îi spune si numele, reuneste mai multe caractere sub "un nume comun". Putem întelege sirul de caractere ca fiind un cuvânt, o propozitie sau o fraza, adica orice formulare scrisa ce contine semne (litere, cifre, semne de punctuatie, semne speciale etc).
Deoarece tipul char, conform tabelei ASCII, poate contine si caractere deosebite, o variabila string poate fi mai mult decât am exemplificat anterior.
Desi tipul STRING prezinta o structura interna comparabila cu cea a masivelor (ARRAY), limbajul (Borland) PASCAL permite programatorului sa-l utilizeze, în multe cazuri, ca pe un tip simplu (vezi Conversatia 4 - operatii de I/E).
Sa analizam putin modul de declarare al variabilelor de tip sir de caractere; ca si în cazul celorlalte declaratii, vom scrie numele identificatorului, caracterul ':' si apoi tipul necesar. În cazul nostru, vom utiliza cuvântul rezervat STRING, urmat (sau nu) de un specificator de format.
Spre deosebire de integer, char, real, care sunt identificatori predefiniti, STRING este cuvânt rezervat!
Real
Doua sunt limitele evidente ale întregilor utilizati în programarea calculatoarelor (în PASCAL):
- foarte multe valori sunt fractionare, cum ar fi: 0,85 si 3,14159265;
- foarte multe valori sunt mai mici decât 1 si mai mari decât maxint.
Datorita acestei limitari, PASCAL-ul prevede alt tip de date, tipul real. Utilizat în PASCAL si în multe alte limbaje de programare, un numar real este numarul caruia îi este permis sa aiba o parte fractionara, chiar daca aceasta fractie se întâmpla sa fie zero. Numarul real 3.0 are o reprezentare interna (în memoria calculatorului) diferita de cea a reprezentarii întregului 3. Numerele reale sunt exprimate în virgula mobila (floating point format). Aceasta nu reprezinta preocuparea dumneavoastra. De notat ca, o data apelate procedurile read/write, au loc conversii zecimal-binar, si invers, a numerelor reale.
TABLOURI UNIDIMENSIONALE
Structura de date este o colecţie de date înzestrată cu informaţii structurale care permit identificarea şi selecţia componentelor.
Componentele unei structuri de date pot fi identificate si selectate fie prin numele, fie prin intermediul relaţiilor structurale. Cea mai simpla relaţie structurala este poziţia fiecărei componente in cadrul structurii.
Asupra unei structuri de date se pot aplica mai multe tipuri de operaţii :vizualizarea elementelor structurii sub diferite forme, actualizarea(adăugarea, modificarea sau ştergerea unei componente), îmbogăţirea structurală(prin adăugarea unor informaţii de legătura) sortare(aranjarea componentelor intr-o anumita ordine stabilita de un anumit criteriu de ordonare.
Din punct de vedere al conţinutului, structurile pot fi:
-omogene(toate componentele structurii sunt de acelaşi tip)
-neomogene(componentele structurii sunt de tipuri diferite)
in funcţie de modul in care sunt memorate structurile de date se împart in doua mari categorii:
-Structuri interne, sunt create in memoria interna RAM a sistemului, şi au un caracter temporar, datorită faptului ca memoria interna este volatila.
-Structuri externe, sunt depozitate pe un suport de memorie externa (hard-disk.floppy-disk), având astfel un caracter permanent.
program ordonare alfabetica;
var x:array[1..20] of string;
i,j,n:integer;aux:string;
begin
write ('cati elevi sunt?=');
readln ;
for i:=1 to n do;
begin
write('nume elev x ',i,':');
readln(x[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if x[i]<x[j] then
begin
aux:=x[i];x[i]:=x[j];x[j]:=aux;
end;
writeln ('ordinea alfabetica este:');
for i:= 1 to n do writeln(i,'',x[i]);
readln;
end.
Tablouri bidimensionale
Declaraţia are următoarea formă generală:
type TipTab=array[ tip_indice 1 , tip_indice 2] of tip_de_bază; var tablou:TipTab;
unde prin tip_indice 1 , tip_indice 2 se înţelege tipul valorilor din care se alimentează indicii (este obligatoriu un tip ordinal), iar tip_de_bază este tipul elementelor tabloului.
Acest tip de bază poate fi orice: putem avea elemente de orice tip numeric, de caractere sau şiruri de caractere, valori booleene, înregistrări (vezi tipul record), tablouri de cele mai diverse tipuri etc.
tip_indice 1 , tip_indice 2 pot fi identificatori de tip predefinit sau definit de utilizator şi, de asemenea, pot fi expresii, cu menţiunea că în acestea pot interveni doar constante şi constante simbolice:
Exemplu
const n=5;
var TipTablou=array[1..2*n,1..n] of Byte;
Numere=array[Boolean,Byte] of Integer;
Dacă structura unui tablou este descrisă în secţiunea var, atunci el va avea un tip anonim. Asociind tipului respectiv un identificator de tip într-o declaraţie type, acesta va putea fi folosit în program, oriunde vrem să referim acest tip.
Exemplu
type TipTablou=array[1..10,1..5] of Byte;
var x,y:TipTablou;
a:array[1..10,1..5] of Byte;
b,c:array[1..10,1..5] of Byte;
În programul care conţine aceste declaraţii, tablourile x şi y vor fi considerate de acelaşi tip (TipTablou), b şi c, de asemenea vor avea un tip comun (anonim), iar a va fi de tip anonim diferit de TipTablou, respectiv de tipul anonim al lui b şi c. Citirea tablourilor bidimensionale
În programe, de regulă, prima operaţie va fi citirea unui astfel de tablou. În limbajele Pascal şi C nu se poate citi o variabilă de tip tablou. Această operaţie se va realiza element cu element.
Subalgoritm Citire(n,x):
citeşte m,n
{ tabloul x are m linii şi n coloane }
pentru i=1,m execută:
pentru j=1,n execută:
citeşte x[i,j]
sfârşit pentru
sfârşit pentru
sfârşit subalgoritm
Afişarea tablourilor bidimensionale
Afişarea tablourilor se realizează asemănător. Dacă dorim să realizăm o afişare linie după linie a tabloului x de tipul tablou, având m linii şi n coloane, în Pascal vom scrie procedura în felul următor:
procedure Afişare(m,n:Byte; x:tablou);
begin
for i:=1 to m do begin
for j:=1 to n do
Write(x[i,j],' ');
WriteLn
end
Record
Alaturi de ARRAY, (Borland) PASCAL accepta alte trei tipuri de date structurate: RECORD, Set si File. Desi nu sunt unice în (Borland) PASCAL, RECORD-urile sunt elemente nepretuite ale limbajului, deoarece ele faciliteaza prelucrarea datelor structurate în fisiere, dar în plus ele ne permit sa cream ARRAY-uri de date agregate de tipuri mixte - un instrument foarte puternic de organizare a datelor.
In cadrul acestei conversatii, la capitolul Array multidimensional(exemplul precedent) am folosit ARRAY-ul bidimensional scoala pentru a retine numarul de fete din cele 7 grupe pe o linie si numarul de baieti pe alta linie.
Structura ARRAY-ului a fost potrivita întrucât toate datele de intrare sunt de acelasi tip: întreg. In continuare, dorim sa extindem facilitatile programului masiv incluzând numele profesorului de informatica din cele 7 grupe. In acest caz, nu am putea extinde structura originala pentru a forma un ARRAY 3*7 întrucât legile PASCAL-ului cer, dupa cum va amintiti, ca ARRAY-urile sa fie omogene; nu putem combina un nume (sir de caractere) cu componente întregi pentru a forma unARRAY. Totusi (Borland) PASCAL-ul ofera o alternativa si anume tipul structurat numit RECORD, care ne permite sa realizam asociatii neomogene. Iata o declaratie corespunzatoare pentru descrierea unei grupe.