Sunteți pe pagina 1din 8

PROGRAMARE 1

Lucrarea nr. 9

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:

Ø Cuvântul cheie struct

Ø Numele modelului (prototipului) structurii NUME_STRUCTUR Ă

Ø Descrierea membrilor structurii respective. Forma general ă a membrilor unei structuri este

sau

§ tip nume;

§ 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 Ă ; urmând 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).

1

PROGRAMARE 1

Lucrarea nr. 9

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 Luând 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);

2

PROGRAMARE 1

Lucrarea nr. 9

Observa ţie:

Atunci când 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 luând 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 ă mânând 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;

3

PROGRAMARE 1

Lucrarea nr. 9

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.

*/

4

PROGRAMARE 1

Lucrarea nr. 9

Pentru

fiecare

corespunz ă tor.

TEMA 1

problem ă

se

va

construi

un

proiect

cu

fiş ierul

header

Problema nr. 1.1

a) S ă se declare tipul de dată structură având 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 având 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

reprezentând 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 ă pân ă la ora t2. Pleac ă apoi la mas ă ş i revine la ora t3

ş i mai lucreaz ă pân ă 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 ă .

5

PROGRAMARE 1

Lucrarea nr. 9

Problema nr. 1.3

a) S ă se defineasc ă tipurile punct, cerc ş i dreptunghi ca structuri. Tipul punct va

avea ca membri dou ă numere reale reprezentând 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 stânga sus ş i col ţului din dreapta jos.

b) S ă se defineasc ă func ţii având 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

-2 4

-4 -3

1

6

PROGRAMARE 1

Lucrarea nr. 9

S ă se calculeze aria ş i perimetrul poligonului determinat de cele n puncte,

presupunând c ă poligonul este convex. Valorile pentru arie ş i perimetru se vor afi ş a dup ă

afi şarea coordonatelor vârfurilor 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 vârfurilor poligonului ş tiind că primul vârf este notat cu A, iar coordonatele unui vârf se indic ă între paranteze dup ă "numele" vârfului. 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 câte 5

puncte pe o linie, puncte separate printr-un TAB.

Exemplu:

A F B C D
A
F
B
C
D

E

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

7

PROGRAMARE 1

Lucrarea nr. 9

Problema nr. 2.2 Se consider ă polinomul cu coeficien ţi reali:

(2.1)

S ă se calculeze, folosind schema lui Horner, valoarea polinomului în punctul z (de pe

P

(

)

x = a x

0

n

+ a x

1

n 1

+

+ a

n

1

x + a

n

axa real ă ) Rela ţia de recuren ţă pentru calculul valorii unui polinom într-un punct z este:

P

n

(

)

z = P

n

1

(

)

z z + a

n

cu

(

P z

1

)

= 0

(nu se vor folosi func ţii recursive). Se asociaz ă unui polinom structura:

struct POLINOM { int n; double c[20];

};

// gradul polinomului // coeficien ţii polinomului

Se vor scrie ş i folosi func ţii pentru:

(2.2)

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

8