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:

Se vor supraancarca urmatorii operatori: Functia de test va utiliza un tablou de fractii continue f = (f1, f2, ..., fn) pentru calculul expresiilor:
        v = f1 + f2 + ... fn, (valoarea reala a sumei fractiilor)
        ck = c1f[k] + c2f[k] + ... cnf[k], (valoarea reala a sumei termenilor k-convergenti, pentru un intreg dat k)

4. Sa se modifice clasele de la problemele 3 si 4, astfel incat sa permita conversia tipurilor intre fractii si fractii continue.

5. Sa se proiecteze si sa se implementeze o clasa pentru polinoamele cu coeficinti reali. Clasa va contine supraancarcarea operatorului de atribuire, a principalilor operatori aritmetici, precum si a operatorului () pentru evaluarea polinomului intr-un punct data. De asemenea, se va supraancarca operatorul [] pentru accesul la coeficientii polinomului. In plus, clasa trebuie sa posede o functie de afisare a polinomului, precum si constructori adecvati. Functia de test trebuie sa verifice egalitatea a doua expresii:
        v1 = P12(x) - P2(x) * P3(x)
        v2 = (P12 - P2 * P3)(x)
pentru trei polinoame date si o valoare reala x data.