Sunteți pe pagina 1din 8

PROGRAMARE 1 Lucrarea nr.

9
1





TIPURI COMPLEXE DE DATE STRUCTURI

O structur! este o colec"ie de una sau mai multe variabile (de acela#i tip sau de tipuri
diferite) grupate sub un singur nume. Variabilele care fac parte din structur! se numesc
membrii structurii respective. Membrii unei structuri pot fi tipuri de date simple (int, float,
etc), tipuri de date agregate (tablouri, alte tipuri de structuri) sau pointeri (la diverse tipuri
de date, inclusiv pointer la acela#i tip de structur! structuri autoreferite).

1. Declara!ia "i defini!ia unei structuri
1.1. Declara"ia unei structuri
Forma general! a declara"iei unei structuri este:
struct NUME_STRUCTUR$ {
declara"ii de date;
};
#i cuprinde:
! Cuvntul cheie struct
! Numele modelului (prototipului) structurii NUME_STRUCTUR#
! Descrierea membrilor structurii respective. Forma general! a membrilor unei
structuri este
" tip nume;
sau
" tip nume[dim
1
][dim
2
]%[dim
n
];

Prin aceast! descriere se indic! "prototipul" (modelul) structurii respective, nu se
rezerv! zon! de memorie #i aceast! declara"ie poate apare ntr-un fi#ier header.
O structur! se poate declara #i f!r! indicarea componen"ei sale, adic! putem scrie:
struct NUME_STRUCTUR$;
urmnd ca descrierea s! se fac! ulterior.
Declara"ia unei structuri va apare n fi#ierul header nainte oric!ror referiri la tipul de
structur! respectiv (de exemplu, naintea specific!rii prototipurilor func"iilor care folosesc
ca parametru sau ca valoare de retur o structur! de tipul specificat).

PROGRAMARE 1 Lucrarea nr. 9
2
1.2. Defini"ia unei structuri
Are rolul de a rezerva zon! de memorie pentru variabilele de tip structur! forma
general! este:
n cazul n care structura a fost declarat! anterior (n fi#ierul header), definirea unor
variabile de tip structur! se face n forma:
struct NUME_STRUCTUR$ v1, v2[10], %, vn;
unde v1, v2[10], %, vn sunt variabile de tip structur! al c!rui model este
NUME_STRUCTUR$. v2[10] este un tablou unidimensional n care fiecare element este o
structur! cu modelul NUME_STRUCTUR$.
Defini"ia unei structuri nu poate apare ntr-un fi#ier header.

2. Opera!ii cu structuri
2.1. Ini"ializarea
Forma general! pentru ini"ializarea unei structuri este:
struct NUME_STRUCTUR$ variabila_structura = {val
1
, %, val
n
};
val
1
, %, val
n
reprezint! valorile de ini"ializare ale membrilor structurii respective #i trebuie
s! coincid! cu tipul membrului structurii la care se refer!.
Exemplu:
Fiind dat! o declara"ie de structur! care descrie o dat! calendaristic! de forma:
struct DATA {
int zi;
char luna[15];
int an;
};

Definirea cu ini"ializare a unei variabile ziDeNastere de tip DATA se face prin:
struct DATA ziDeNastere = {11, "iunie", 1970};

2.2. Accesarea membrilor
Un membru al unei structuri se acceseaz! folosind operatorul de selec"ie . (punct).
Forma general! este:
variabila_structura.membru_structura
Lund exemplul de mai sus, afi#area con"inutului variabilei de tip structur!
ziDeNastere se face astfel:
printf("%d %s %d\n", ziDeNastere.zi, ziDeNastere.luna, ziDeNastere.an);
PROGRAMARE 1 Lucrarea nr. 9
3

Observa"ie:
Atunci cnd un membru al unei structuri este de un tip real (float, double
sau long double) ini"ializarea prin citire de la tastatur! a valorii membrului
respectiv se face folosind o variabil! auxiliar!, ca n exemplul urm!tor:
PUNCT a;
double aux;
scanf("%lf", &aux);
a.x = aux;

2.3. Copierea unei structuri
Este permis! copierea unei structuri n alt! structur! fie membru cu membru (prin
atribuiri aplicate unor variabile simple), fie lund structura ca un ntreg.
Exemplu:
struct DATA zi1 = {25, "martie", 2004};
struct DATA zi2, zi3;
zi2 = zi1;
zi3.zi = zi1.zi;
dup! secven"a de cod de mai sus, membrii structurii zi2 vor avea acelea#i valori ca #i
membrii structurii zi1, iar membrul zi al structurii zi3 va avea aceea#i valoare cu membrul
zi al structurii zi1, ceilal"i doi membri r!mnnd cu valori nedeterminate.

2.4. Structuri #i func"ii
O structur! poate fi folosit! ca parametru de intrare pentru o func"ie #i o func"ie poate
returna o structur!. Modific!rile f!cute asupra valorii membrilor unei structuri ntr-o func"ie
nu se p!streaz! #i dup! ie#irea din func"ie. O structur! se transmite c!tre o func"ie prin
valoare, prin intermediul stivei.

Exemplu:
Fiind declarat! structura urm!toare asociat! unui punct din plan
struct _PUNCT {
double x, y;
};
typedef struct _PUNCT PUNCT;
a) s! se scrie o func"ie care returneaz! distan"a dintre dou! puncte;
PROGRAMARE 1 Lucrarea nr. 9
4
b) s! se scrie o func"ie care returneaz! punctul simetric fa"! de origine al unui punct
dat.

a) double distanta(PUNCT a, PUNCT b)
{
double d;
d = sqrt((a.x b.x) * (a.x b.x) + (a.y b.y) * (a.y b.y));
return d;
}

b) PUNCT simetric(PUNCT a)
{
PUNCT b;
b.x = -a.x;
b.y = -a.y;
return b;
}

Consider!nd urm!toarele defini"ii:
double d;
PUNCT A, B, X, Y;
#i c! variabilele structur! de tip PUNCT A, B, Y sunt ini"ializate pe parcursul programului,
apelul celor dou! func"ii se face astfel:
d = distanta(A, B);
/*
* Calculeaz! distan"a dintre punctele ale c!ror coordonate
* sunt n structurile A #i B de tip PUNCT
*/

X = simetric(Y);
/*
* Membrii structurii X vor avea ca valori
* valorile simetrice fa"! de origine ale membrilor structurii Y.
*/
PROGRAMARE 1 Lucrarea nr. 9
5

Pentru fiecare problem$ se va construi un proiect cu fi"ierul header
corespunz$tor.


TEMA 1

Problema nr. 1.1
a) S! se declare tipul de dat! structur! avnd numele modelului structurii _FRACTIE
asociat unei frac"ii care are ca membri dou! numere ntregi corespunz!toare
num!r!torului #i numitorului unei frac"ii. S! se construiasc! apoi un sinonim pentru
aceast! structur!, sinonim avnd numele FRACTIE.
b) S! se scrie func"ii pentru determinarea inversei unei frac"ii #i calculul sumei,
diferen"ei #i produsului a dou! frac"ii. Rezultatul va fi sub forma unei frac"ii ireductibile
(care nu se poate simplifica). Pentru aceasta se va scrie o func"ii care determin! cel mai
mare divizor comun conform algoritmului lui Euclid descris n Laboratorul nr. 2.
c) S! se scrie un program care cite#te dintr-un fi#ier num!r!torul #i numitorul a dou!
frac"ii p #i q #i calculeaz! #i afi#eaz! forma ireductibil! a frac"iilor p+q, p-q, p*q #i p/q n
func"ie de o op"iune dat! de utilizator.

Problema nr. 1.2
a) S! se defineasc! tipul TIMP ca o structur! care con"ine ca membri trei ntregi
reprezentnd ora (cu valori ntre 0 #i 24), minutul (cu valori ntre 0 #i 60) #i secunda (cu
valori ntre 0 #i 60).
b) S! se scrie o func"ie care primind ca parametri de intrare dou! date de tipul TIMP
calculeaz! suma lor ntr-o dat! de tipul TIMP.
c) S! se scrie o func"ie care primind ca parametri de intrare dou! date de tipul TIMP
calculeaz! diferen"a lor ntr-o dat! de tipul TIMP.
d) S! se scrie un program care rezolv! urm!toare problem!: un angajat al unei firme
ajunge la lucru la ora t1 #i lucreaz! pn! la ora t2. Pleac! apoi la mas! #i revine la ora t3
#i mai lucreaz! pn! la ora t4. &tiind c! momentele t1, t2, t3, t4 sunt memorate ca date de
tipul TIMP, s! se calculeze #i s! se afi#eze (sub forma hh:mm:ss) timpul lucrat de angajat
n ziua respectiv!.

PROGRAMARE 1 Lucrarea nr. 9
6
Problema nr. 1.3
a) S! se defineasc! tipurile punct, cerc #i dreptunghi ca structuri. Tipul punct va
avea ca membri dou! numere reale reprezentnd abscisa x, respectiv ordonata y a
punctului c!reia i este asociat! structura. Tipul cerc va avea ca membri un punct (centrul
cercului) #i un num!r real (raza cercului), iar tipul dreptunghi va avea ca membri dou!
puncte corespunz!toare col"ului din stnga sus #i col"ului din dreapta jos.
b) S! se defineasc! func"ii avnd ca parametri un punct #i un dreptunghi (respectiv
un cerc) care stabilesc dac! punctul se g!se#te n interiorul dreptunghiului (respectiv
cercului). Func"iile vor returna 1 dac! punctul este interior #i 0 n caz contrar.
c) S! se scrie un program care cite#te informa"ii referitoare la un dreptunghi #i la un
cerc #i stabile#te dac! un punct ale c!ror coordonate sunt citite de la tastatur! este interior
sau nu acestor figuri geometrice. Programul va citi coordonatele unui punct, afi#eaz!
rezultatul #i apoi printr-un dialog cu utilizatorul stabile#te dac! cite#te coordonatele unui alt
punct sau se termin!.

TEMA 2

Problema nr. 2.1
Se consider! urm!toarea structur! asociat! unui punct din spa"iul bidimensional:
struct _PUNCT {
double x; // abscisa
double y; // ordonata
};
#i declara"ia de tip
typedef struct _PUNCT PUNCT;
Folosind aceste dou! declara"ii s! se rezolve urm!toarea problem!:

Se cite#te dintr-un fi#ier un num!r ntreg n #i apoi coordonatele a n puncte din spa"iul
bidimensional (fiecare linie con"ine coordonatele unui punct separate printr-un spa"iu).
Exemplu:
Fi#ierul de intrare este poligon.in #i are urm!torul con"inut:
3
1 1
-2 4
-4 -3
PROGRAMARE 1 Lucrarea nr. 9
7
S! se calculeze aria #i perimetrul poligonului determinat de cele n puncte,
presupunnd c! poligonul este convex. Valorile pentru arie #i perimetru se vor afi#a dup!
afi#area coordonatelor vrfurilor poligonului cu 3 zecimale.

Se vor scrie #i folosi func"ii pentru:
! Calculul distan"ei dintre dou! puncte;
! Calculul ariei unui triunghi folosind formula lui Heron (dat! n primul curs);
! Calculul semiperimetrului unui triunghi;
! Calculul ariei totale;
! Calculul perimetrului poligonului
! Citirea unui vector de structuri dintr-un fi#ier.
! Afi#area coordonatelor vrfurilor poligonului #tiind c! primul vrf este notat cu
A, iar coordonatele unui vrf se indic! ntre paranteze dup! "numele" vrfului.
Exemplu:
A(1.00, 1.00) B(2.75, 3.14)
Pentru coordonate de tip real se vor indica dou! zecimale #i se vor afi#a cte 5
puncte pe o linie, puncte separate printr-un TAB.

Exemplu:


Perimetrul = ! lungimilor laturilor AB, BC, CD, DE, EF, FA
Aria = ! ariilor triunghiurilor ABC, ACD, ADE, AEF



Date de test:
a). pentru poligonul A(1,1), B(-2,4), C(-4,-3)
Aria = 13,500
Perimetrul = 17,926

b) pentru poligonul A(2,98; 8,88), B(9,02; 5,98), C(13,16; 10,12), D(11,02; 14,00),
E(6,04; 18,08)
Aria = 68,732
Perimetrul = 33,119
A
B
C D
E
F
PROGRAMARE 1 Lucrarea nr. 9
8

Problema nr. 2.2
Se consider! polinomul cu coeficien"i reali:
( )
n n
n n
a x a x a x a x P + ! + + ! + ! =
"
"
1
1
1 0
(2.1)
S! se calculeze, folosind schema lui Horner, valoarea polinomului n punctul z (de pe
axa real!)
Rela"ia de recuren"! pentru calculul valorii unui polinom ntr-un punct z este:
( ) ( )
n n n
a z z P z P + ! =
"1
cu ( ) 0
1
=
!
z P (2.2)
(nu se vor folosi func"ii recursive).
Se asociaz! unui polinom structura:
struct POLINOM {
int n; // gradul polinomului
double c[20]; // coeficien"ii polinomului
};

Se vor scrie #i folosi func"ii pentru:
! Citirea unui vector de numere reale dintr-un fi#ier (polinom.in);
! Afi#area polinomului luat n considerare
! Calculul valorii unui polinom de variabil! complex! cu coeficien"i reali (varianta
iterativ! #i nu recursiv!) ntr-un punct.

S-ar putea să vă placă și