concepte fundamentale ale limbajelor de...
TRANSCRIPT
Concepte
fundamentale ale
limbajelor de
programareTipuri de date
Curs 07
conf. dr. ing. Ciprian-Bogdan Chirila
Cuprins
tipuri predefinite
tipuri definite de programator
tipuri scalare
tipuri de date structurate
produs cartezian
proiectie finita
secventa
recurenta
reuniuni variabile
multimi
tipul pointer
compatibilitati de tip
Tipuri de date
un set de obiecte si
un set de operatii pentru a
crea
distruge
modifica
tipuri predefinte
un anumit set de obiecte specificat la definirea limbajului
constructie unitara a obiectelor in limbajele de
programare avansate
structuri
operatii
Tipuri predefinite
este baza sistemului de tipuri intr-un limbaj
reflecta functionarea sistemului la nivel hardware
valorile si operatiile sunt in relatiie cu datele de nivel scazut
si cu operatiile executate de masina
Tipuri predefinite
tipuri de baza numerice
int in Algol 68
integer in Pascal
real in Algol 68 and Pascal
float in Ada
short int, long int, double
operatii matematice
+,-,*,/
pentru valori intregi si reale
operatori polimorfici – prin supraincarcare
Tipuri predefinite
tip enumerare booleana cu valorile
true
false
bool in Algol 68
boolean in Pascal, Java, Ada
char in Algol 68, Java, Pascal
character in Ada
ASCII
EBCDIC
Extended Binary Coded Decimal Interchange Code
Tipuri definite de
programatori
cea mai puternica caracteristica a unui sistem de tipuri
este sa poti crea tipuri noi
cu nume
type tab=array[1..10] of integer;
anonime
var t:array[1..10] of integer;
Tipuri scalare
obiectele de tip scalar sunt simple constante ce nu mai
pot fi descompuse
intregii, valorile reale, caracterele, valorile booleene sunt
de tip scalar
programatorul poate sa isi defineasca propriile tipuri
scalare
Tipul enumerare
utilizatorul specifica intr-o lista valorile tipului
type days=(Sunday, Monday, Tuesday, Wednesday,
Thursday, Friday, Saturday);
a inceput in limbajul Pascal
este prezent in majoritatea limbajelor de programare
Alte tipuri scalare
sunt importante din punct de vedere al portabilitatii
in Ada
type eps is digits 10;
un numar in virgula flotanta cu un numar de minimum 10 cifre
zecimale semnificative
precizia va fi mentinuta/asigurata indiferent de platforma
Subdomenii
In Pascal
type working_day=Monday..Friday;
small_caps=’a’..’z’;
index=0..90;
In Ada
type eps_1 is new eps range -1.0 .. 1.0;
Tipuri de date structurate
limbajele de programare ofera mecanisme pentru
descrierea si manipularea structurilor de date ce contin
scalari
alte structuri
mecanismul de structurare
permit crearea de structuri pornind de la componente
mecanismul de selectie
permite accesul la o componenta a structurii
Produsul Cartezian
obiecte structurate
compuse din numar fix de componente
componentele au tipuri diferite
tipul obiectului structurat este produsul Cartezian al
multimilor tipurilor corespunzatoare componentelor
daca tipurile componentelor sunt reprezentate de
multimile C1, C2, C3,…, Cn
fiecare element al structurii va fi
T=C1 x C2 x … x Cn
Produsul cartezian
e numit si
articol
structuta
In Pascal and Ada - record
In Algol 68 and C – structura
se descrie tipul fiecarei componente
a selecta o componenta inseamna a specifica obiectul si
numele campului selectat
Exemplu de produs
cartezian
Ada
type complex is
record
re,im:real;
end record;
-----------------------------
c:complex;
-----------------------------
c.re:=1;
c.im:=0;
-----------------------------
c:=(1,0);
Proiectia finita
este o functie definita pe TI cu valori in multimea TE
TI – tip index
TE – tip element
var a:array[1..100] of char;
este o proiectie a multimii {1,2,3,…,100} pe multimea
caracterelor
componentele tabloului numite elemente sunt selectate
prin mecanismul de indexare
la adresa de inceput a tabloului reprezentate de nume se
aduna un index pentru a selecta un anumit element
Proiectia finita
a[k]
selecteaza elementul cu indexul k din tabloul a
poate fi vazut ca o aplicare a functiei a cu argumentul k
rezultand valoarea elementului
In Algol, Ada
selectia poate fi facuta pe un subinterval nu doar pe un
singur element
a[10..19]=(0,1,2,3,4,5,6,7,8,9);
Momentul cheie de legare a
multimii de indecsi
legarea la momentul compilarii
se scrie codul ce stabileste multimea index
nu poate fi modificat in timpul executiei
este cazul limbajelor Fortran, C, Pascal
legarea la momentul rularii
in momentul creerii obiectului tablou
dimensiunea poate fi necunoscuta la compilare
poate depinde de alte variabile de program
este cazul limbajelor Algol 60, Basic sau Ada
in limbajele cu alocare dinamica a memoriei cum ar fi C-ul
pointerii sunt folositi pentru accesul tablourilor dinamice
Momentul cheie de legare a
multimii de indecsi
Flexibil la rulare
multimea indecsilor poate fi modificata
dimensiunea tabloului poate fi modificata
este cazul limbajelor Snobol4 si Algol68
Secventa
este o structura formata dintr-un numar aleator de
componente de acelasi tip
o componenta poate fi adaugata oricand
nelimitata virtual
in limbajele de programare
siruri de caractere
fisiere secventiale
Secventa
pentru sirurile de caractere
In PL/I, Ada, Basic, Pascal
cand se declara un sir de caractere lungimea sa maxima
trebuie sa fie cunoscuta
Operatiii
independente de limbajul de programare
Catenarea
selectia primului caracter
selectia ultimului caracter
selectia unui subsir
etc.
Recursivitatea
un tip T este recursiv daca unul din componentele sale
este de tip T
exemple tipice sunt
Listele
Arborii
obiectele pot avea forme si marimi arbitrare
Recursivitetea
in pseudocod
type node=record
info : info_type;
left, right : node;
end;
Recursivitatea
in practica
se utilizeaza pointerii
un obiect recursiv de tipul T trebuie sa aiba o referinta la alt
obiect de tip T
nu obiectul in sine
C, Pascal, Ada, Algol 68
in Lisp listele si arborii nu an nevoie de pointeri
type node=record
info : info_type;
left, right : ^node;
end;
Reuniuni variabile
permit specificarea de structuri ce pot avea mai multe
alternative
multimea tuturor structurilor posibile reprezinta reuniunea
multimilor alternative
Reuniuni variabile
In C
union {
float radius;
float rectangle_sides[2];
float triangle_sides[3];
} shape;
Reuniuni variabile
la un moment dat o variabila de tip shape poate avea
doar
float radius sau
two float array sau
three float array
intr-un articol toate campurile coexista
intr-o reuniune va fi doar un camp din multimea de
campuri alternative
Reuniuni variabile
uniuni mai evoluate sunt in limbajele Pascal si Ada
uniunea este parta a unui articol cu variante
type figure=(circle, triangle, rectangle);
shape=record
length, area : real;
case shape : figure of
circle : (radius : real);
rectangle : (rectangle_sides:array[1..2] of real);
triangle : (triangle_sides:array[1..3] of real);
end
Reuniuni variabile
sunt periculoase
trebuie utilizata doar varianta corecta
toata responsabilitatea este lasata pe umerii
programatorului
in cazul limbajului C
nu sunt posibile varificari la compilare
nu sunt posibile verificari la rulare
cazurile limbajelor Ada and Pascal vor fi detaliate mai
tarziu
Multimi
T este tipul de baza
variabilele de tip set(T) pot avea ca valoare orice
submultime generata de valorile lui T inclusiv multimea
vida
operatii
reuniune
intersectie
diferenta
teste de incluziune
teste de apartenenta
Multimi
Pascal
are un tip multime
cand un astfel de mecanism nu exista
poate fi implementat de programator prin
tablouri de valori Booleene
tablouri de biti
liste
arbori
Tipul pointer
un pointer este o referinta la un obiect
este mijlocul uzual de a implemeta structuri de date
recursive
in C este singurul mod de a transmite parametrii prin
adresa
Problemele cu pointerii
violari de compatibilitati de tip
pseudonime
referinte false
Violari de compatibilitati de
tip
in PL/I o variabila pointer poate referi orice obiect
la compilare este imposibil de stiut tipul obiectului si de a
face verificarile de tip corespunzatoare
verificarea de tip la rulare este posibila dar este scumpa
in Pascal si Ada pointerii au asignat tipurile de obiecte pe
care ii poate referi
in C avem pointeri generici void*
Pseudonime
un acelasi obiect este referit prin mai multe nume
prezenta loc in cod afecteaza lizibilitatea
var a,b:^t;
a:=new(t);
b:=a;
a si b sunt pseudonime
Referintele false
sunt acelea care refera un obiect ce nu mai este in viata
este o eroare de acces
var a,b:^t;
a:=new(t);
b:=a;
dispose(a);
b este o referinta false chiar daca a este atribuit cu
valoarea nil
Referintele false
in C
int *p;
void f()
{
int x;
p=&x;
}
f();
Compatibilitati de tipuri
T1 si T2 sunt compatibile daca:
o valoare de tipul T1 poate fi asignata la o variabila de
tipul T2
si viceversa
un parametru de tip T1 corespunde la un parametru
actual de tip T2
si viceversa
Exemplu
type
t=array[1..100] of integer;
t1=array[1..100] of integer;
t2=t1;
var
a,b:array[1..100] of integer;
c:t;
d:t;
e,f:t1;
g:t2;
Compatibilitati teoretice de
tipuri
echivalenta de nume
echivalenta structurala
Echivalenta de nume
cand doua variabile
sunt declarate impreuna sau
utilizeaza acelasi nume pentru tip
in exemplu
a si b sunt compatibile
c si d sunt compatibile
e si f sunt compatibile
a sau b cu c sau d nu sunt compatibile
Echivalenta structurala
doua variabile au tipuri compatibile daca au aceeasi
structura
verificarea de tipuri presupune inlocuirea numelui tipului
cu definita acestuia
este un proces recursiv
se termine cand toate tipurile definite de utilizator sunt
inlocuite
doua tipuri sunt compatibile daca au aceeasi descriere
in exemplul nostru
a, b, c, d, e, f, g sunt toate compatibile
Comparatii
echivalenta structurala
simpla la implementare
echivalenta de nume
presupune operatii complexe pentru a determina
compatibilitatea de tip
permite redefinirea abstractiunilor
type
price=integer;
students_no=integer;
cost:price;
effective:student_no;
Comparatii
Variabilele cost si effective
sunt echivalente structural
atribuirea de valori de la cost la effective sau invers reprezintao eroare semantica
echivalenta structurala
Algol 68
C - structurile si uniunile
sunt tipuri diferite desi au structuri identice
echivalenta de nume
Ada
Pascal
echivalenta de tip nu este specificata,
depinde de implementare