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: