Sunteți pe pagina 1din 11

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

TIPURI COMPLEXE DE DATE STRUCTURI

O structur este o colecie de una sau mai multe variabile (de acelai 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 acelai tip de structur structuri autoreferite).

1. Declaraia i definiia unei structuri


1.1. Declaraia unei structuri
Forma general a declaraiei unei structuri este:
struct NUME_STRUCTUR {
declaraii 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;

tip nume[dim1][dim2][dimn];

sau

Prin aceast descriere se indic "prototipul" (modelul) structurii respective, nu se


rezerv zon de memorie i aceast declaraie poate apare ntr-un fiier header.
O structur se poate declara i fr indicarea componenei sale, adic putem scrie:
struct NUME_STRUCTUR;
urmnd ca descrierea s se fac ulterior, nainte de prima definire a unei variabile al crui
tip este structura respectiv.
Declaraia unei structuri va apare n fiierul header nainte oricror referiri la tipul de
structur respectiv (de exemplu, naintea specificrii prototipurilor funciilor care folosesc
ca parametru sau ca valoare de retur o structur de tipul specificat).

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

1.2. Definiia unei structuri


Are rolul de a rezerva zon de memorie pentru variabilele de tip structur forma
general este:
struct [NUME_STRUCTUR] {
declaraii de date;
} v1, v2[10], , vn;
unde v1, v2, , vn sunt variabile de tipul NUME_STRUCTUR. Aici [] indic faptul c
partea respectiv din definiie poate s lipseasc.
n cazul n care structura a fost declarat anterior (n fiierul header), definirea unor
variabile de tip structur se face n forma:
struct NUME_STRUCTUR v1, v2[10], , vn;
Definiia unei structuri nu poate apare ntr-un fiier header.
2. Operaii cu structuri
2.1. Iniializarea
Forma general pentru iniializarea unei structuri este:
struct NUME_STRUCTUR variabila_structura = {val1, , valn};
dac structura a fost declarat anterior sau
struct NUME_STRUCTUR {
declaraii de date;
} variabila_structura = {val1, , valn};
dac se face i definirea variabilei de tip structur o dat cu declararea ei. val1, , valn
reprezint valorile de iniializare ale membrilor structurii respective i trebuie s coincid
cu tipul membrului structurii la care se refer.
Exemplu:
Fiind dat o declaraie de structur care descrie o dat calendaristic de forma:
struct DATA {
int zi;
char luna[15];
int an;
};
Definirea cu iniializare a unei variabile ziDeNastere de tip DATA se face prin:
struct DATA ziDeNastere = {11, "iunie", 1970};

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

2.2. Accesarea membrilor


Un membru al unei structuri se acceseaz folosind operatorul de selecie . (punct).
Forma general este:
variabila_structura.membru_structura
Lund exemplul de mai sus, afiarea coninutului variabilei de tip structur
ziDeNatere se face astfel:
printf("%d %s %d\n", ziDeNastere.zi, ziDeNastere.luna, ziDeNastere.an);
Observaie:
Atunci cnd un membru al unei structuri este de un tip real (float, double
sau long double) iniializarea prin citire de la tastatur a valorii membrului
respectiv se face folosind o variabil auxiliar, ca n exemplul urmtor:
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 secvena de cod de mai sus, membrii structurii zi2 vor avea aceleai valori ca i
membrii structurii zi1, iar membrul zi al structurii zi3 va avea aceeai valoare cu membrul
zi al structurii zi1, ceilali doi membri rmnnd cu valori nedeterminate.
2.4. Structuri i funcii
O structur poate fi folosit ca parametru de intrare pentru o funcie i o funcie poate
returna o structur. Modificrile fcute asupra valorii membrilor unei structuri ntr-o funcie
nu se pstreaz i dup ieirea din funcie. O structur se transmite ctre o funcie prin
valoare, prin intermediul stivei.

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Exemplu:
Fiind declarat structura urmtoare asociat unui punct din plan
struct _PUNCT {
double x, y;
};
typedef struct _PUNCT PUNCT;
a) s se scrie o funcie care returneaz distana dintre dou puncte;
b) s se scrie o funcie 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;
}

Considernd urmtoarele definiii:


double d;
PUNCT A, B, X, Y;
i c variabilele structur de tip PUNCT A, B, Y sunt iniializate pe parcursul programului,
apelul celor dou funcii se face astfel:
d = distanta(A, B);
/*
*
*
*/

Calculeaz distana dintre punctele ale cror coordonate


sunt n structurile A i B de tip PUNCT

X = simetric(Y);
/*
*
*
*
*/

Membrii variabilei structur X, de tip PUNCT, va conine valorile simetrice


fa de originea axelor de coordonate ale membrilor variabilei structur Y,
de asemenea de tip PUNCT.

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

TEMA
Pentru fiecare problem se va construi un proiect cu fiierul header
corespunztor.
Problema nr. 1
Se consider urmtoarea structur asociat unui punct din spaiul bidimensional:
struct _PUNCT {
double x;

// abscisa

double y;

// ordonata

};
i declaraia de tip
typedef struct _PUNCT PUNCT;
Folosind aceste dou declaraii s se rezolve urmtoarea problem:
Se citete dintr-un fiier un numr ntreg n i apoi coordonatele a n puncte din spaiul
bidimensional (fiecare linie conine coordonatele unui punct separate printr-un spaiu).
Exemplu: Fiierul de intrare este poligon.in i are urmtorul coninut:
3
11
-2 4
-4 -3
S se calculeze aria i perimetrul poligonului determinat de cele n puncte,
presupunnd c poligonul este convex. Valorile pentru arie i perimetru se vor afia dup
afiarea coordonatelor vrfurilor poligonului cu 3 zecimale.
Se vor scrie i folosi funcii pentru:
Calculul distanei dintre dou puncte;
Calculul ariei unui triunghi folosind formula lui Heron;
Calculul semiperimetrului unui triunghi;
Calculul ariei totale;
Calculul perimetrului poligonului
Citirea unui vector de structuri dintr-un fiier.

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Afiarea 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, 1)

B(2.75, 3.14)

Pentru coordonate de tip real se vor indica dou zecimale i se vor afia cte 5
puncte pe o linie, puncte separate printr-un TAB.
Exemplu:

F
Perimetrul = lungimilor laturilor AB, BC, CD, DE, EF, FA

B
C

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
Problema nr. 2
n pdurea cu alune aveau case mai muli pitici. Unii dintre ei purtau scufii roii, alii
purtau scufii albastre. Regele lor era singurul care purta scufie galben.
Din nefericire au aprut conflicte ntre piticii cu scufii roii i piticii cu scufii albastre.
Pentru a-i putea pstra scufia galben, regele trebuie s gseasc o soluie pentru a aplana
acest conflict. El plnuiete s construiasc o potec prin pdure care s separeu casele
piticilor cu scufii roii de casele piticilor cu scufii albastre. Pentru aceasta toi sfetnicii trebuie
s propun poziii ale potecii. Se cunosc coordonatele tuturor csuelor piticilor i fiecare
sfetnic va propune coordonatele a dou puncte care se vor afla pe dreapta care reprezint
poteca.
O potec este valid dac i numai dac toate casele piticilor cu scufii roii se vor afla de
o parte a potecii i toate casele piticilor cu scufii albastre se vor afla de cealalt parte. O potec

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

nu va fi valid dac va trece exact prin casa unui pitic.(indiferent de culoarea scufiei acestuia.
Trebuie s stabilii care din potecile propuse de sfetnici sunt valide.
Date de intrare
Prima linie a fiierului de intrare PITICI.IN conine numrul M al piticilor cu scufii roii.
Urmtoarele M linii conin perechi de numere reale, separate printr-un spaiu, reprezentnd
coordonatele csuei unui pitic cu scufie roie.
Urmtoarea linie conine numrul N al piticilor cu scufii albastre. Urmtoarele N linii
conin perechi de numere reale, separate printr-un spaiu, reprezentnd coordonatele csuei
unui pitic cu scufie albastr.
Urmtoarea linie va conine numrul K al sfetnicilor, iar pe urmtoarele K linii se vor afla
cte patru numere reale, separate printr-un spaiu, reprezentnd coordonatele celor dou
puncte care vor determina dreapta propus de sfetnic.
Date de ieire
Fiierul de ieire PITICI.OUT va conine K linii fiecare corespunznd unei poteci propuse
de un sfetnic. n cazul n care poteca este valid linia va conine mesajul DA Sfetnicul i a dat
o soluie valida, iar n cazul n care poteca nu este valid linia va conine mesajul NU
Sfetnicul i a dat o soluie invalida. n ambele cazuri i reprezint numrul de ordine al
sfetnicului care a dat soluia respectiv.
Exemplu:
PITICI.IN
2
00
02
2
20
22
4
0121
1012
0012
1220

NU
DA
NU
NU

PITICI.OUT
Sfetnicul 1 a
Sfetnicul 2 a
Sfetnicul 3 a
Sfetnicul 4 a

dat
dat
dat
dat

o
o
o
o

solutie
solutie
solutie
solutie

invalida
valida
invalida
invalida

Indicaie de rezolvare:
Problema se reduce la a verifica pentru fiecare dintre poteci (drepte) dac punctele
corespunztoare csuelor tuturor piticilor cu scufii roii se afl de o parte a dreptei i punctele
corespunztoare csuelor tuturor piticilor cu scufii albastre se afl de cealalt parte a dreptei.
Pentru aceasta trebuie determinat ecuaia dreptei corespunztoare unei poteci. Ecuaia
unei drepte este:

ax + by + c = 0

(1)

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Fie (x1 , y1 ) i (x2 , y 2 ) coordonatele a dou puncte care determin o dreapt. Coeficienii
din formula (1) se determin cu relaiile:

a = y1 y 2

b = x2 x1

c = x1y 2 x2 y1

(2)

Pentru a determina de care parte a dreptei (potecii) se afl csua unui pitic trebuie s
nlocuim n formula (1) variabilele x i y cu coordonatele csuei respective. Pentru o csu
care se afl chiar pe potec rezultatul va fi nul, iar pentru csuele piticilor cu scufii roii
rezultatul trebuie s aib un semn, iar pentru csuele piticilor cu scufii albastre rezultatul
trebuie s aib semn opus.
Trebuie s determinm semnul pentru csua primului pitic cu scufie roie. Apoi vom
determina semnele pentru csuele tuturor celorlali pitici cu scufii roii. Dac apare un semn
diferit putem trage imediat concluzia c poteca nu este valid. Dac obinem o valoare nul
dreapta corespunztoare va trece prin csua unui pitic, deci nici n aceast situaie poteca nu
este valid.
Dac nu am identificat nici o situaie care s conduc la concluzia c poteca nu este
valid, putem fi siguri c toi piticii cu scufii roii au csuele de aceeai parte a potecii.
n continuare vom determina semnele pentru csuele piticilor cu scufii albastre. Dac
apare valoarea 0 sau acelai semn ca pentru piticii cu scufii roii rezult imediat c poteca nu
este valid.
Dac nu am identificat nici acum o situaie care s conduc la concluzia c poteca nu este
valid, putem fi siguri c toi piticii cu scufii albastre au csuele de cealalt parte a potecii.
n acest moment putem concluziona c poteca respectiv este valid.
Pentru rezolvarea problemei trebuie definite tipurile de date:
PUNCT ca sinonim pentru o structur asociat unui punct din plan care conine ca
membri dou date de tip real;
PITICI ca sinonim pentru o structur asociat piticilor cu scufii de aceeai culoare.
Structura cuprinde ca membri un ntreg fr semn (reprezentnd numrul piticilor) i un tablou
de structuri PUNCT prin intermediul cruia se vor stoca coordonatele csuelor piticilor din
grupul respectiv.
Dup citirea coordonatelor csuelor celor dou grupuri de pitici aceste se vor afia pe
ecran respectnd urmtorul model (dat pentru exemplul din problem):
Casutele piticilor cu scufii rosii se gasesc la urmatoarele coordonate:
(0.0, 0.0) (0.0, 2.0)
Casutele piticilor cu scufii albastre se gasesc la urmatoarele coordonate:
(2.0, 0.0) (2.0, 0.2)
Coordonatele unui punct se vor afia cu o singur zecimal.

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Problema nr. 3
Se consider polinomul cu coeficieni compleci:
P (x ) = a0 x n + a1 x n 1 + K + an 1 x + an

(2.1)

S se calculeze, folosind schema lui Horner, valoarea polinomului n punctul z din


planul complex, z fiind definit cu expresia
z = x + j y

unde j =

-1

(2.2)

Relaia de recuren pentru calculul valorii unui polinom ntr-un punct z este:

Pn (z ) = Pn 1 (z ) z + an cu P1 (z ) = 0

(2.3)

(nu se vor folosi funcii recursive).


Se asociaz unui numr complex structura:
struct COMPLEX {
double re;

// partea real

double im;

// partea imaginar

};
i unui polinom structura:
struct POLINOM {
int n;

// gradul polinomului

struct COMPLEX c[20];

// coeficienii polinomului

};
Se vor scrie i folosi funcii pentru:
Citirea unui vector de numere complexe dintr-un fiier (polinom.in);
Adunarea a dou numere complexe;
nmulirea a dou numere complexe;
Calculul valorii unui polinom de variabil complex cu coeficieni compleci
(varianta iterativ i nu recursiv) ntr-un punct.

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Problema nr. 4
Fie tipul de dat PUNCT declarat astfel:
typedef struct _PUNCT {
double x;

// abscisa

double y;

// ordonata

} PUNCT;
asociat unui punct din plan i un tip de dat declarat:
typedef struct _LINIE {
double m;

// panta

double n;

// tietura

} LINIE;
asociat unei drepte a crei ecuaie este:

y = mx +n

(3.1)

Se citete, de la tastatur, un numr ntreg n i apoi coordonatele a n puncte din


plan.
a) S se verifice dac toate punctele se gsesc pe dreapta determinat de primele
dou puncte introduse. Pentru aceasta se determin ecuaia unei drepte lund n
considerare coordonatele primelor dou puncte din cele introduse i apoi se verific dac
celelalte puncte aparin dreptei.
Ecuaia dreptei care trece prin dou puncte este:

y y1
x x1
=
y 2 y 1 x 2 x1

(3.2)

unde (x1 , y 1 ) i (x 2 , y 2 ) sunt coordonatele punctelor care determin dreapta.


b) S se afieze ecuaia dreptei dat de ecuaia (3.1).
c) S se afieze coordonatele punctelor care nu sunt pe dreapta care trece prin
primele dou puncte din plan ale cror coordonate au fost introduse. Afiarea
coordonatelor punctelor care nu sunt pe dreapt se face sub forma (x, y).
Se vor scrie i folosi funcii pentru:
Citirea unui vector de structuri

10

PROGRAMAREA CALCULATOARELOR

Lucrarea nr. 7

Determinarea ecuaiei unei dreptei (determinarea pantei i tieturii dreptei


respective)
Verificarea coliniaritii punctelor introduse
Afiare ecuaie dreapt
Determinare puncte care nu sunt pe dreapt
Afiare puncte care nu sunt pe dreapt
Observaie:
Trei puncte sunt coliniare dac

x1

y1 1

x2

y2 1 = 0

x3

y3 1

unde (xi, yi) cu i = 1, 2, 3 sunt coordonatele celor trei puncte. Relaia de mai sus
poate fi folosit (cu adaptrile necesare) i pentru determinarea ecuaiei unei
drepte care trece prin dou puncte.

11

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