e
e
=
Di x daca TRUE
Di x daca FALSE
i x f ) , ( (2.9)
De exemplu:
f(13, int) =TRUE (2.10)
pentru c 13 e [-32768, 32767] Z, D
int
fiind domeniul ntregilor, n timp ce
f( - 4, bool) = FALSE (2.11)
pentru c 4 nu aparine mulimii {FALSE, TRUE}.
n secvena:
...
int x;
...
x = 20;
...
presupunnd c n compilare i editare de legturi, variabilei x i se asociaz
zona de memorie:
07AA0
00 00 00 14
x
07AA0
14 00 00 00
x
a b
Figura 2.3 Zona de memorie asociat variabilei x
(a microprocesoare MOTOROLA, b microprocesoare INTEL)
adr(x) = 07AA0
cont(x) = (00000014)
16
f(cont(x), int) = TRUE
tip (x) = int
Deci:
f(cont(x), tip(x)) = TRUE (2.12)
Funcia de aliniere:
K: adresa x tip
i
-> TRUE (2.13)
=
i
i
i
k adresa daca FALSE
k adresa daca TRUE
) T K(adresa,
M
(2.14)
unde k
i
este factorul de aliniere cerut prin construcie pentru tipul de date T
i
.
K(07AA0, int) = TRUE (2.15)
pentru c 07AA0M4
K(adr(x), tip (x)) = TRUE (2.16)
Se spune c variabila x este:
- corect alocat;
- corect iniializat;
dac i numai dac:
f (cont(x), tip(x)) AND K(adr(x), tip(x)) = TRUE (2.17)
b) Modelul de generare a constantelor pentru un tip specificat de
date
Folosind convenii i simboluri, se definesc reguli, mecanisme de
generare a constantelor. Astfel, se noteaz:
c
a
b
- cifra
- a sau b
[ ] - construcie opional
Figura 2.4 Notaiile utilizate n generarea constantelor
Constantelor ntregi li se asociaz modelul de generare:
+
-
ccccc. . . c
Figura 2.5 Modelul de generare a constantelor
Putem verifica dac irurile:
0
- 125
. 3
+- 60
44
sunt sau nu constante ntregi. Cu uurin ne dm seama c irurile . 3 + - 60
i 44 - nu ndeplinesc cerinele impuse de ablonul model.
Pentru constantele de tip real se prezint modelul de generare:
] [ ] ... [ [.] ] ... [ cc e c cc c cc
E
(
)
`
+
(
)
`
)
`
+
Figura 2.6 Modelul de generare a constantelor reale
irurile:
+ 1 . 2e-4
- . 3 E2
2 . e-1
1e + 4
sunt constante reale ntruct respect regulile de generare incluse n ablon.
c) Modele de descriere a datelor folosind grafuri.
ntruct grafurile permit punerea n eviden a interdependenelor dintre
elemente omogene sau neomogene, se consider utilizarea lor ca fiind
sugestiv n cazul structurilor de date.
Prin convenie, se stabilesc c nodurile care prezint numai arce
incidente spre interior corespund datelor elementare, iar nodurile care au arce
incidente spre interior i spre exterior corespund datelor de grup.
Astfel, graful:
b
c
d
a
Figura 2.7 Graful de reprezentare a datei compuse a
este interpretat ca: data compus a are n alctuirea ei datele elementare b, c
i d.
Graful:
0 - ->0 - ->0- ->0
a b c d (2.18)
corespunde datelor interdependente, n care b urmeaz lui a, c urmeaz lui b i
d urmeaz lui c. Nodurile a, b, c, d sunt fie date elementare, fie date compuse,
iar pentru stabilirea relaiei de preceden este necesar memorarea unor
adrese.
Pentru realizarea n cadrul programelor a definirii structurilor complexe
de date este necesar reprezentarea acestora folosind grafuri i dup aceea
scrierea n program a unei forme liniarizate neambigue.
De exemplu, pentru structura de tip arborescent, se utilizeaz scrierea
parantetica, ce presupune ca elementele de pe acelai nivel s fie separate prin
virgul, iar pentru trecerea la nivel inferior, utilizarea unei paranteze rotunde
deschise.
Revenirea la nivelul precedent se marcheaz cu o parantez nchis.
Astfel grafului:
a
c
h
j
i
g
f
e
d
b
Figura 2.8 Graful de reprezentare a datei complexe a
i corespunde liniarizarea:
a(b(d,e,f,g), c(h(i,j))) (2.19)
d) Modele care permit implementarea recursivitii n descrierea
datelor
Se face deosebire ntre modelele recursive de descriere a datelor
precum:
<semn> : : = + , -
<cifra> : : = 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
<ntreg fr semn> : : = <cifra> , <ntreg fr semn><cifra> ,
<cifra><ntreg fr semn>
<ntreg> : : = <ntreg fr semn> , <semn><ntreg fr semn>
i modelele care implementeaz, recursivitatea n descrierea datelor. Astfel,
construcia:
tip_de_dat o = | ( _ntreg,o_o) (2.20)
pune n eviden ca dat | conine dou date elementare i anume care are
tipul ntreg i o care are tipul o.
Aceste modele permit descrierea structurilor de date autoreferite: liste,
stive i arbori.
e) Modele grafice
Sunt utilizate reprezentri grafice pentru locaiile de memorie asociate
variabilelor i constantelor unui program. Prin arce se stabilesc legturile
dintre locaii. Acest model de descriere a datelor este sugestiv i fr
ambiguitate.
Construcia:
1 7 10 ni1
Figura 2.9 Modelul locaiilor de memorie asociate variabilelor i constantelor
reprezint o list, fiecare component avnd dou elemente: primul reprezint
informaia util avnd valorile 1, 7 i 10, iar al doilea conine adrese. Arcele
orientate indic locaia a crei adresa este memorat n componenta
precedent.
f) Modelul vectorial
Se consider un vector avnd un numr dat de componente. Fiecare
component are o semnificaie precizat, iar componentele luate n ansamblu
lor descriu complet i corect structurile de date.
Se observ c pentru datele elementare, multe dintre componentele
vectorului sunt nule. Zerourile, arat lipsa dependenelor n aval i n amonte
sau mrimea distanei dintre dou componente.
Funcia distant se definete astfel:
d(x,y) = adr (y) adr (x) (2.21)
Definim lg(x,T
i
), funcia lungime a zonei de memorie asociat
operandului x. De exemplu, pentru secvena de program:
...
x : extended;
y : comp;
z : shortint;
w : word;
...
lg(x, extended) = 10 baii
lg (y, comp) = 8 baii
lg (z, shortint) = 1 baii
lg(w, word) = 4 baii
unde:
lg : I x T -> {1,2,4,6,8,10} (2.22)
Programul care pune n eviden lungimile tipurilor de date ale limbajului
C/C++ este:
//program dimensiune_tip
#include <iostream.h>
#include <malloc.h>
main()
{
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n Reprezentarea datelor de tip ntreg";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n char: "<< sizeof(char)<<" octet";
cout<<"\n unsigned char: "<< sizeof(unsigned char)<<" octet";
cout<<"\n int: "<< sizeof(int)<<" octet";
cout<<"\n unsigned int: "<< sizeof(unsigned int)<<" octet";
cout<<"\n signed int: "<< sizeof(signed int)<<" octeti";
cout<<"\n short int: "<<sizeof(short int)<<" octeti";
cout<<"\n long int: "<< sizeof(long int)<<" octeti";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n Reprezentarea datelor de tip real";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n float: "<< sizeof(float)<<" octeti";
cout<<"\n double: "<<sizeof(double)<<" octeti";
cout<<"\n long double: "<<sizeof(long double)<<" octeti";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n Reprezentarea datelor de tip caracter";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n char: "<<sizeof(char)<<" octet";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n Reprezentarea datelor de tip logic";
cout<<"\n - - - - - - - - - - - - - - - - - - - - - - - - ";
cout<<"\n boolean: "<< sizeof(bool)<<" octet";
}
Dac variabilele x i y sunt contigue:
d(x,y) = lg (x,T
i
) (2.23)
n cazul vectorilor i matricelor, apare posibilitatea punerii n eviden a
contiguitii. Pentru un vector x cu n componente:
d(x[j], x [j+1]) = 1g (x[1],T
i
) (2.24)
oricare j aparine mulimii {1, 2, . . ., n}.
n cazul n care variabilele ocup zone de memorie necontigue:
d(x,y) > lg (x,T
i
) (2.25)
inegalitatea depinznd de modalitatea n care s-a fcut alocarea memoriei.
Redefinirile sau reacoperirile, corespund unor distane fie nule, fie mai
mici dect lungimea cmpului considerat reper.
y
12
x
l1
Figura 2.10 Modelul de reacoperire a locaiilor de memorie
d(x,y) < lg (x) = l1 (2.26)
lg (y) = 12 (2.27)
adr(x) < adr(y) < adr(x) + 11 (2.28)
Uniunile de date apar drept cazuri particulare n acest model de
descriere a datelor.
union a: T
1
, b:T
2
,c :T
3
; (2.29)
dist(a,b) = dist(a,c) = dist(b,c) = 0 (2.30)
Lungimea zonei de memorie ocupat de variabilele union este:
1= max {lg(a,T
1
),lg(b,T
2)
,lg (c,T
3
)) (2.31)
g) Modelul obiectelor generice
Datele aparinnd unui anumit tip apar n expresii precedate sau urmate
de anumii operatori. De asemenea, ele sunt parametrii pentru anumite funcii.
Modelul include:
- forma generic de construire a datei de un tip specificat
- operatorii i funciile care utilizeaz datele definite pentru tipul
respectiv, precum i excepiile de utilizare.
Acest model permite descrierea corect a secvenelor de program, cu
construirea de obiecte acolo unde limbajele de programare implementeaz
cerinele programrii orientate pe obiect.
Exist multe alte modaliti de descriere riguroas a datelor, toate ns
se subordoneaz unor obiecte dintre care cel mai important este crearea
premiselor analizei semantice, pentru punerea n eviden mai nti a
corectitudinii descrierilor de date i mai apoi a corectitudinii programelor.
2.4 Cerine de definire a datelor
n toate programele scrise apar variabile simple. Acestea definesc fie
variabile de control, fie variabile n care se regsesc totaluri sau rezultate
independente de alte evaluri ale programului. Fiecare dat pe care un
programator o specific are caracteristici proprii, care determin tipul i locul n
care este definit, modul de alocare a memoriei, modalitatea de iniializare i
felul n care este folosit n final coninutul su.
Vom considera spre exemplificare un program P n care se utilizeaz
variabilele i de tip ntreg i s de tip real.
Variabila i este o variabil de control folosit n regsirea elementelor
vectorului definit prin:
float x[100];
Variabila s este definit astfel:
float s;
Pentru variabilele independente, definirea n secven este comutativ
fr a influena rezultatul prelucrrii.
Secvenele:
i; int
s; float
variabile
S2.
s; float
i; int
variabile
S1. (2.32)
sunt echivalente, rezultatele prelucrrii unui program care conine una din cele
dou secvene sunt identice.
Dac programului P i se ataeaz o secven S la stnga, se obine
programul P
1
:
P
1
= S || P (2.33)
unde || este operatorul de concatenare.
Dac programului P i se ataeaz o secven S la dreapta, se obine
programul P
2
:
P
2
= P || S (2.34)
Se spune c secvena S de instruciuni este comutativ n raport cu
operatorul || dac:
rez (S || P; d) = rez (P || S; d) (2.35)
unde rez( ) este funcia rezultat definit:
rez: P X C -> C (2.36)
unde:
P mulimea programelor;
C mulimea constantelor elementare, vectoriale, matricele i de alte
structuri.
n cazul secvenelor S
1
, S
2
dac:
rez(S
1
|| P;d) = rez(S
2
|| P; d) (2.37)
se spune c cele dou secvene sunt echivalente, adic:
(S
1
U S
2
) || P (2.38)
Se observ c n programul P, variabila de control i trebuie iniializat cu
valoarea 1 i atinge cel mult valoarea 100, domeniul acesteia fiind:
Dom (i) = [1,100] N (2.39)
Definirea cu tipul integer determin:
Dom(int) = [-37768, 32767] N (2.40)
deci Dom (i) Dm (int) unde Dom este funcia domeniu:
Dom : J -> D (2.41)
Aceast funcie permite tratarea tipurilor fundamentale int, float, bool ca
identificatori cu caracteristici prefixate prin construcia limbajului C/C++.
Dac presupunem c cele 100 de componente ale vectorului x au valori
cuprinse ntre 1 i 200 suma lor nu depete 200 * 100 = 20000. Deci:
Dom (s) = [100,20000] N (2.42)
Dom (float) = [2.9E 39,1.7E38] (2.43)
Dom (s) Dom (float) (2.44)
Faptul c domeniile variabilelor i i s, sunt incluse n domeniile definite
tipurilor, determin excluderea situaiei obinerii de rezultate trunchiate i deci
de pierdere a controlului coninutului lor.
Oportunitatea alegerii tipului ntreg sau real, este pus n eviden de
ponderea funciilor de conversie care se activeaz la execuie.
Pentru un programator care a lucrat ntr-un limbaj de asamblare,
secvenele:
int i; int i;
float s; float s;
. . . . . .
i = 1.; i = 1;
s = 0; s = 0.;
sunt diferite pentru c:
- n prima secven se genereaz constanta 1, ca avnd tip float; deci
ocup o zon de memorie de 4 bytes (constante de maxim 7 - 8
cifre). Zona este structurat pentru caracteristic i mantis.
Constanta 0 se genereaz ntr-o zon de memorie de 2 sau 4 bytes
corespunztoare tipului int;
- n modul obiect generat la compilare, i = 1 i s = 0, se concretizeaz
prin copieri (mutri) ale coninutului zonelor de memorie care
corespund operanzilor din dreapta semnului egal, n alte zone de
memorie care corespund operanzilor din stnga semnului egal;
- instruciunile de copiere (mutare) presupun operanzi omogeni; dac
operandul receptor este de tip ntreg, atunci operandul emitor
trebuie s fie tot de tip ntreg; dac operandul receptor este de tip
real, atunci i operandul emitor trebuie s fie de tip real; n caz de
neomogenitate, compilatorul genereaz secvene de apelare a
funciilor de conversie;
- secvena S
1
necesit 2 apeluri de funcii de conversie i anume:
conversie de la real la ntreg, f13 i conversie de la real la ntreg f31;
rez1 = f13(1.)
copiere rez1 -> i
rez2 = f31 (0)
copiere rez2 -> s
- ntruct n secvena S
2
, exist concordana ntre tipurile constantelor
generate ca operanzi emitori i operanzi receptori, nu mai sunt
necesare apelri ale funciilor de conversie.
Ca o cerin n alegerea tipului, este realizarea unui nivel ct mai redus
al apelurilor funciilor de conversie.
Posibilitatea definirii la utilizare a variabilelor elementare, conduce
uneori la realizarea unei ocupri a memoriei cu operanzi cu grad redus de
folosire.
Exist limbaje, ca de exemplu Fortran i Basic, care nu necesit
definirea explicit a variabilelor, ci acestea se definesc la prima utilizare, tipul
fiind precizat odat cu respectarea unei reguli de construire a identificatorilor.
Gradul de utilizare este marcat prin numrul de instruciuni n care
variabilele apar, sau prin frecvena de modificare a coninutului lor. Un
program devine cu att mai bun cu ct mprtierea variabilelor elementare
este mai redus.
Astfel, dac n secvena S
1
apare variabila i, iar n secvena S
2
apare
variabila j i programul:
P = S
1
|| S
2
(2.45)
se observ c domeniile celor dou variabile care au acelai tip sunt disjuncte,
deci este definit o singur variabil care este utilizat de ambele secvene.
Dac:
rez (S
2
; rez (S
1
; i), j) = rez (S
2
; rez(S
1
;i), i) (2.46)
secvena:
int i;
int j;
...
S (i);
1
...
S
2
(j);
va fi modificat obinndu-se secvena:
int i;
...
S
1
(i);
...
S
2
(i);
Caracterul local sau global, dinamic sau static, este dat de contextul n
care se utilizeaz fiecare variabil. Important este ca programul s realizeze
pentru un exemplu de test din specificaiile de programare, acelai coninut
pentru toate punctele de control.
Dac pentru valorile 1, 2, 3, 4, 5 ale vectorului x de 5 componente, la
iteraia a treia, n specificaiile de programare se indic pentru variabila s
valoarea 6 i dac prin:
rez (S
1
S
1
S
1
; s, i) (2.47)
cont(s) este 6, nseamn c definirea s este corect. Dac ns n locul asociat
structurii repetitive, este definit s i este iniializat:
rez (S
1
S
1
S
1
; s, i) (2.48)
conduce la cont (s) cu valoarea 3, pentru c celelalte valori se pierd la fiecare
activare a blocului, se conchide c definirea local determin erori asupra
rezultatului.
2.5 Cerine de iniializare i utilizare
Variabilele elementare se iniializeaz sub control de ctre programator.
Ele au semnificaii precum:
- definesc dimensiunile problemei de rezolvat;
- definesc precizia rezultatelor;
- definesc opiuni ale utilizatorului care determin funcii care se
activeaz;
- conin rezultate cu grad de cuprindere difereniat;
- controleaz execuia repetitiv a secvenelor;
- specific limite de valori pe care le iau unele variabile;
- conin niveluri puse n coresponden cu tipuri de erori, tipuri de
rezultate sau evenimente n prelucrare.
Compilatoarele moderne pun n eviden situaiile n care se definesc i
se utilizeaz variabile elementare, fr ca n prealabil s fie iniializate.
Iniializarea unei variabile elementare se efectueaz:
- la definire; exist limbaje care permit definirea i iniializarea
variabilei (de exemplu, n limbajul C, construciile int s = 0, i = 0;
sunt frecvente);
- printr-o funcie de citire;
- prin atribuire, variabila elementar aflndu-se n membrul stng.
O variabil elementar se definete pentru a i se utiliza coninutul cel
puin o singur dat ntr-o expresie, ca parametru ntr-o funcie sau ntr-o
expresie indicial.
Afiarea rezultatului coninut de o variabil elementar apare ca o
utilizare a acesteia sub form de parametru n funcii precum writeln( ),
println().
Se spune c variabila elementar i este corect definit i corect utilizat
dac:
cont_spcf (i,n) = = cont_prg (i,m) (2.49)
unde:
cont_spcf ( ) funcia de coninut a variabilei i dup efectuarea pasului n al
algoritmului precizat n specificaiile de programare;
cont_prg ( ) funcia de coninut a variabilei i dup executarea
instruciunii m din program, instruciune care delimiteaz
sfritul pasului n al algoritmului descris n specificaii.
Dac:
cont_prg (i, m) = = cont_prg(i, m+1) (2.50)
oricare ar fi m [1, M] N, unde M este numrul de instruciuni executabile
care formeaz programul, se spune c i nu i modific coninutul, este deci o
constant i ori este defectuos utilizat, ori trebuia definit nu ca variabil ci ca
o constant simbolic.
Urma programului se obine prin:
cout<<m<< <<cont_prg(i, m);
unde m = 1, 2, . . . , M sau numai pentru valori modificate:
if (cont_prg (i,m) != cont_prg(i,m+1))
cout<<M+1<< <<cont_prg(i,m+1);
n cazul n care datele elementare se definesc numai pentru seturi de
valori dintr-o mulime, se utilizeaz funcia de apartenen, care pune n
eviden corectitudinea reiniializrii unei variabile sau a rezultatelor din
calcule.
Dac:
f (cont_prg (x, m), T
i
) = = FALSE (2.51)
nseamn c la instruciunea a m a a programului, valoarea variabilei
elementare x nu corespunde setului de valori T ataat acesteia.
De exemplu, dac pentru marcarea erorilor de execuie se atribuie
codurile:
- 0, dac execuia s-a desfurat normal;
- 1, dac exist tentativa mpririi prin zero;
- 2, dac matricea este singular;
- 3, dac valorile unei expresii indiciale depesc limitele pentru care
este definit operandul de tip masiv:
T
i
= {0, 1, 2, 3} (2.52)
Dac ntr-o funcie de inversare a matricei, variabila ierr este definit pe
mulimea T
i
i dac ntr-un punct k al funciei i se atribuie valoarea 7, atunci:
f (cont_prg (ierr, k), T
i
) = = FALSE (2.53)
nseamn c s-a nregistrat o eroare, o ndeprtare de specificaiile de
programare. Este posibil ca uneori specificaiile de programare s suporte
modificri, care reflect cerine de finee realizate n program. Mulimea
tipurilor de erori este diversificat i atunci se obine:
T
i
= T
i
U {4, 5, 6, 7} (2.54)
unde codurile 4, 5, 6, 7 corespund unor noi situaii care conduc la ntreruperea
execuiei. n acest caz:
f(cont_prg(ierr, k), T
i
) = = TRUE (2.55)
Cerinele de iniializare pentru date de acelai tip, conduc la trecerea de
la variabile elementare, la variabile de tip masiv.
Construciei:
int a, b, c, d, e, f;
...
a = 0;
b = 0;
c = 0;
d = 0;
e = 0;
f = 0;
...
i corespunde secvena compact:
int x[6];
int i;
. . .
for (i=0; i<6; i++)
x[i] = 0;
sau secvena:
int x[6] = {0, 0, 0, 0, 0, 0};
Alegerea dintre date elementare i date compuse, este legat n primul
rnd de modul de calcul a adreselor i de obiectivul urmrit prin prelucrare iar
n al doilea rnd, de compactitatea programului.
Datele elementare, se constituie ca o mulime de noduri ale unui graf n
care mulimea arcelor este vid. Adresele variabilelor elementare au caracter
aleator. n general, nu se stabilete o relaie de calcul a adreselor unor
elemente din mulimea de date elementare, avnd ca reper un element
aparinnd de asemenea acestei mulimi.
2.6 Cerine de lizibilitate a programului
Datele elementare sunt puse n coresponden cu identificatori sugestivi.
Astfel, pentru calculul volumului unei prisme paralelipipedice se definesc:
. . .
int lungime, latime, inaltime, volum;
cin>>lungime>>inaltime>>latime;
volum=lungime*latime*inaltime;
cout<<volum = << volum;
. . .
n cazul definirii unei variabile compuse omogene, secvena echivalent
este:
. . .
int x[4];
cin>>x[0]>>x[1]>>x[2];
x[3]=x[0]*x[1]*x[2];
cout<< volum = <<x[3];
. . .
Lizibilitatea programului n acest caz, este crescut numai ca posibilitate
de urmrire a sintaxei acestuia. n prima form se nelege exact semnificaia
prelucrrii. n plus, dac se accept utilizarea variabilelor de stare globale, care
sunt n totalitate variabile elementare, dup apelarea funciilor, se fac teste i
se continu prelucrarea numai dac acestea au nivelul pus n coresponden cu
execuia cerut.
Aceasta este de fapt cauza necesitii standardizrii rspunsului pe care
l ofer funciile n domeniul valorilor de stare pe care le returneaz.
Secvena:
. . .
int stare;
. . .
stare = f (p . . . p
n
);
1 1
if (stare != 0)
return(stare);
stare=f (p . . . . .p
n
);
2 1
if (stare != 0)
return(stare);
. . .
ilustreaz controlul permanent al programatorului asupra rezultatelor
prelucrrii folosind variabila elementar stare.