Lucrarea 6
Supraancarcarea operatorilor
Scopul lucrarii: Familiarizarea cu
operatiile de supraancarcare a principalilor operatori.
Desfasurarea lucrarii: Se vor scrie programe
in cadrul carora se vor supraancarca operatori adecvati pentru efectuarea
anumitor operatii specifice modulelor proiectate.
Se va utiliza paradigma abstractizarii datelor, aplicatiile avand fisiere header
de interfata si fisiere sursa de implementare pentru modulele dezvoltate, precum
si un fisier sursa de utilizare.
Se pot folosi ca model clasele complex si
polinom din capitolul 6 (exemplele 6.3,
respectiv 6.5 si 6.8).
Teme propuse:
1. Sa se proiecteze si sa se implementeze o clasa asociata numerelor complexe.
Clasa va contine supraancarcarea operatorului de atribuire, a principalilor
operatori aritmetici, precum si a operatorului ~ pentru operatia de calcul a
modulului unui numar complex. De asemenea, se va supraancarca operatorul ^
pentru operatia de ridicre a unui numar complex la o putere intreaga. In plus,
clasa trebuie sa posede o functie de afisare, precum si constructori care sa
permita urmatoarea secventa:
complex z1; // z1 = 0+0i
complex z2(5); // z2 = 5+0i
complex z3(2, 3); // z3 = 2+3i
complex z4 = z2;
Functia de test va utiliza un tablou de numere complexe v = (z1, z2,
..., z2*n) pentru calculul expresiei:
z = (z13
+ z33 + ... z2*n-13) / (z24
+ z44 + ... z2*n4)
2. Sa se proiecteze si sa se implementeze o clasa asociata numerelor frationare.
Clasa va contine supraancarcarea operatorului de atribuire, a principalilor
operatori aritmetici, precum si a operatorului ! pentru operatia de simplificare
a unui numar rational. De asemenea, clasa trebuie sa posede o functie de afisare,
precum si constructori adecvati. Functia de test va utiliza un tablou de numere
intregi v = (a0, a1, ..., an) pentru
determinarea solutiilor rationale ale ecuatiei:
a0
+ a1*x1 + ... + an*xn = 0
Indicatie: Daca ecuatia precedenta are o radacina rationala x0 = p/q,
pentru care cmmdc(p,q) = 1, atunci p il divide a0, iar q il divide pe
an.
Observatie: Operatorii aritmetici trebuie supraancarcati de doua ori,
pentru a putea lucra si cu numere intregi. De exemplu, expresia a + b trebuie sa
poata fi evaluata, atat in cazul in care a si b sunt numere rationale, dar si in
cazul in care a este rational, iar b este intreg;
3. Sa se proiecteze si sa se implementeze o clasa asociata fractiilor continue.
O fractie continua este o expresie de forma:
r = a0
+ (a1 + 1 / (a2 + (1 / (a3 + 1 / (...)))))
unde coeficientii a0, a1, ..., an sunt numere
intregi. O notatie formala pentru fracria continua r este: [a0, a1,
a2, a3, ...].
Importanta acestor fractii consta in faptul ca pentru orice numar real x, exista
o unica fractie continua egala cu x. In cazul numerelor rationale, a0,
a1, ..., anse pot determina in mod unic, printr-un proces
asemanator algoritmului lui Euclid:
r0
= r
ai
= [ri], i = 0, 1, 2, ...
ri+1
= 1 / (ri – ai), i = 0, 1, 2, ...
Pentru o fractie continua r = [a0, a1, a2, a3,
...], al k-lea termen convergent se noteaza ck si reprezinta fractia
continua: ckr = [a0, a1, a2,
..., ak].
Se vor utiliza urmatorii constructori: