Documente Academic
Documente Profesional
Documente Cultură
Lucrarea nr. 7
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).
tip nume;
tip nume[dim1][dim2][dimn];
sau
PROGRAMAREA CALCULATOARELOR
Lucrarea nr. 7
PROGRAMAREA CALCULATOARELOR
Lucrarea nr. 7
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)
b)
PUNCT simetric(PUNCT a)
{
PUNCT b;
b.x = -a.x;
b.y = -a.y;
return b;
}
X = simetric(Y);
/*
*
*
*
*/
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
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
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)
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)
// partea real
double im;
// partea imaginar
};
i unui polinom structura:
struct POLINOM {
int n;
// gradul polinomului
// 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)
y y1
x x1
=
y 2 y 1 x 2 x1
(3.2)
10
PROGRAMAREA CALCULATOARELOR
Lucrarea nr. 7
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