Raport
Lucrarea de laborator nr. 2
la disciplina “Programarea orientată pe obiecte”
CHIŞINĂU 2021
LUCRARE DE LABORATOR NR. 2
Scopul lucrării:
• Studierea necesităţii supraîncărcării operatorilor;
• Studierea sintaxei de definire a operatorilor;
• Studierea tipurilor de operatori;
• Studierea formelor de supraîncărcare;
Sarcina lucrari:
Sa se creeze clasa stack – vector, utilizînd memoria dinamică. Să se defineasca urmatorii
operatori ca metode ale clasei: ” + ”- de adunare a doi vectori, ” - ” – de scadere a doi
vectori, ” * ” – de imultirea a doi vectori, ” () ” – de returnare a unui vector nou care conşine
ultimele N elemente ale vectorului, ” + ” – cu un numar. Să se definească operatorii de
comparare: ”==”, ”!=”, ”<”, ”>” ca funcţii prietene.
Să se definească operatorii ”<<” şi ”>>” pentru ieşiri/intrări de obiecte. Clasa trebuie să fie
absolut funcţională, adică să conţină toţi constructorii necesari şi destructorul.
Realizarea sarcinii:
Programul dat a fost compus din două fişiere cu numele „File2.h”,(vezi fig.1) şi
„File1.cpp”(vezi anexa A) în care se conţine funcţia „pause()” care este folosită pentru
vizualizarea programului mai comod şi original, şi definirea unor culori.
Conţinutul fisierului “File2.h”:
Fig. 1
Să incepem sa discutam despre clasa Stack.
class stack{
int *elem;
int dim;
public: stack():elem(NULL),dim(0){};
// constructor implicit
stack(int d):dim(d){elem = new int[d];}
//constr. explicit
~stack(){delete []elem; elem=NULL; dim=0;};
// destructor
aloc(int d){elem = new int[d]; dim=d;}
// alocare de memorie
stack(stack &);
// construct de copiere
ret(int i){return elem[i];};
// return elem[ i ]
friend istream & operator>>(istream &in, stack &obj);
friend ostream & operator<<(ostream &out,stack &obj);
friend int operator>( stack &, stack & );
friend int operator<( stack &, stack & );
friend int operator==(stack &, stack & );
friend int operator!=(stack &, stack & );
stack operator()(int);
stack operator+(stack);
stack operator-(stack);
stack operator+(int);
stack operator*(stack); };
3.1 Constructorul de copiere:
Fig. 2
3.3 supraincarcarea operatorului „<<” (ieşire):
Fig. 3
3.4 supraincarcarea operatorului „+ ” (adunare a doi vectori):
Conditia de baza pentu efectuarea acestei operaţi este ca trebuie să aibă acelaşi numar de
elemente, în cazul meu trebuie sa fie adevarata condiţia: if (dim==v.dim) dacă va fi adevărată
se va efectua adunarea,
Daca nu va fi adevărată se va afişa un mesaj de eroare:
else {del; blue; cout<<"Eroarea nu se poate de efectuat operatia de adunare! (dim1!
=dim2)";}
Exemplu de execuţia cazului cînd nu coincide dimensiunile vectorilor: (da, culoarea nu e
cea mai potrivita )
Fig. 4
stack stack ::operator ()(int n){
if (n<=this->dim) { //daca vectorul „venit” contine cel mult „n” elemente
atunci
stack v; // se crează un vector suplimentar „v” în care se vor scrii
ultimele „n” elemente
int k=0; // creez o variabilă de tip intreg, si îi atribui „0”
v.aloc(n); // aloc memorie pentru vectorul suplimentar „v”
for (int i = 0; i<=this->dim; i++) //pornesc un ciclu de la 0 pînă la (cîte
elemente are vectorul „venit”)
if (i>=(this->dim-n)) { // daca „i” va ajunge în intervalul (dim-n) atunci se
înscrie acest element de pe
v.elem[k]=this->ret(i); // pozitia „i” în vectorul „v” suplimentar pe poziţia „k”
unde „k” de prima dată este 0,
k++; } // după aceasta se incrementează k cu 1;
return v; // se returnează vectorul suplimentar „v”
} //daca vectorul „venit” conţine mai puţine elemente ca „n”
introdus atunci se
//afişează mesajul ca am introdus un N mai mare decit numarul de elemente
ale vectorului.
else {del; blue; cout<<"Eroare N este mai mare da dimensiunea vectorului !"; getch(); }};
Fig. 5
Codul sursă fucţiei operatia_M();
void operatia_M(){
char com;
sus: del;
white; cout<<"1 "; yellow; cout<<"-Suma: V1 + V2"<<endl;
white; cout<<"2 "; yellow;cout<<"-Scaderea: V1 - V2"<<endl;
white; cout<<"3 "; yellow; cout<<"-Produsul: V1 * V2"<<endl;
white; cout<<"4 "; yellow; cout<<"-V1 + N (N - Numar
dat)"<<endl;
white; cout<<"5 "; yellow; cout<<"-Compararea V1 si V2"<<endl;
blue; cout<<"Backspace "; white; cout<<"-Inapoi"<<endl;
com=getch();
switch (com) {
case '1':{ del;
cyan; //
del; - curaţă ecranul, cyan; - culoare;
cout<<"Suma: V1 +
V2"<<endl;
stack vs;
// Vector Suma
vs=v1+v2;
yellow;
cout<<"["<<v1<<"]";
white; cout<<" + ";
cyan;
cout<<"["<<v2<<"]";
yellow; cout<<" = ";
white;
cout<<"["<<vs<<"]";
break;};
case '2':{ del; cyan;
cout<<"Scaderea: V1 -
V2"<<endl;
stack vsc;
//Vector SCcadere
vsc=v1-v2;
yellow;
cout<<"["<<v1<<"]";
white; cout<<" - ";
cyan;
cout<<"["<<v2<<"]";
yellow; cout<<" = ";
white;
cout<<"["<<vsc<<"]";
break;};
case '3':{ del; cyan;
cout<<"Produsul: V1 *
V2"<<endl;
stack
vp; //Vector Produs
vp=v1*v2;
yellow;
cout<<"["<<v1<<"]";
white; cout<<" * ";
cyan;
cout<<"["<<v2<<"]";
yellow; cout<<" = ";
white;
cout<<"["<<vp<<"]";
break;};
case '4':{ del; cyan;
int n;
cout<<"N= "; cin>>n;
stack vn;
//Vector Numar
vn=v1+n;
yellow;
cout<<"["<<v1<<"]";
white; cout<<" + ";
cyan; cout<<n;
yellow; cout<<" = ";
white;
cout<<"["<<vn<<"]";
break;};
Fig. 6
Codul sursă funcţiei de returnare a unui vector nou cu ultimele N elemente
Introducerea vectorului v1 cît şi a v2 sunt la fel (vezi Fig. 7)
Fig. 7
Fig. 8
Ieşirea din program se efectuiază tastînd tasta Esc (vezi Fig. 9)
Fig. 9
Concluzi:
In urma efectuarii lucrarii date am determinat ca mediul de prgramare C++ este cu
mult flexibil ca C, care ne permite sa manipulam cu informatia intr-un mod rapid si
eficient fara a induce erori grosolane, si am aflat ca utilizarea claselor este cu mult mai
comod si mai rapid in eleborarea unui program.
Am înţeles importanta supraîncarcari operatorilor de adunare, scadere, înmulţire şi
anume pentru a permite utilizarea acestora in efectuarea operatiilor cu careva date
create de utilizator, în cazul meu a fost vectori, adunarea unor vectori de exemplu
(vectorul1+vectorul2) fară supraîncarcarea operatorului de adunare este inmposibilă, şi
altor operatori la fel.
Este foarte comod citirea si afişarea unui vector datorita supraîncărcări operatorilor de
intrare/ieşire.
Bibliografie
1. TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN C
SI C++)[RO][Kris Jamsa][Lars Kland]
2. PROGRAMARE IN C_C++ CULEGERE DE PROBLEME Valiriu Iorga
3. Initiere in C++, Programarea orientata pe obiecte (Editie Prevazuta) Cluj-Napoca
1993
Anexa A
Fişierul „File1.cpp”
#include <conio.h>
#include <iostream.h>
#include <windows.h>
#include "File2.h"
class stack{
int *elem;
int dim;
public: stack():elem(NULL),dim(0){};
// canstructor implicit
stack(int d):dim(d){elem = new int[d];} //c.
explicit
~stack(){delete []elem; elem=NULL; dim=0;}; //
destructor
aloc(int d){elem = new int[d]; dim=d;} //
alocare
stack(stack &); //
construct de copiere
ret(int i){return elem[i];}; //
return
friend istream & operator>>(istream &in, stack &obj);
friend ostream & operator<<(ostream &out,stack &obj);
friend int operator>( stack &, stack & );
friend int operator<( stack &, stack & );
friend int operator==(stack &, stack & );
friend int operator!=(stack &, stack & );
stack operator()(int);
stack operator+(stack);
stack operator-(stack);
stack operator+(int);
stack operator*(stack);};
stack v1,v2;
//**************************OPERATOR () {returnara a n elem}
stack stack ::operator ()(int n){
if (n<=this->dim) {
stack v;
int k=0;
v.aloc(n);
for (int i = 0; i<=this->dim; i++)
if (i>=(this->dim-n)) {
v.elem[k]=this->ret(i);
k++; }
return v; }
//******************MAIN-ul
void main(){
stack s1;
char com;
sus:del;
white;
yellow; cout<<"1 "; white; cout<<"- Introdu vectorul
V1"<<endl;
yellow; cout<<"2 "; white; cout<<"- Introdu vectorul V2"<<endl;
yellow; cout<<"3 "; white; cout<<"- Operati matematice asupra V1
si V2"<<endl;
yellow; cout<<"4 "; white; cout<<"- Returneaza un Vect. nou cu
ultimile N elemente"<<endl;
yellow; cout<<"Esc "; white; cout<<"- Iesire din program"<<endl;
com=getch();
switch (com) {
case '1':{ int nv1;
white; del;
cout<<"Numarul de elemente= ";
cin>>nv1;
v1.aloc(nv1);
cin>>v1;
pause(); break;};
case '2':{ int nv2;
white; del;
cout<<"Numarul de elemente= ";
cin>>nv2;
v2.aloc(nv2);
cin>>v2;
pause(); break;};
case '3':{ operatia_M();
break;};
case '4':{ del;
int n;
blue;
cout<<"Atentie V1 trebuie sa contina cel putin un
element"<<endl;
cyan;cout<<"Introdu N= "; cin>>n;
stack
vnew(n);
vnew=v1(n);
white;
cout<<"Ultemul(-ele) "; cyan; cout<<n; white; cout<<" element(-
e) din V1= ";
yellow;
cout<<"["<<v1<<"]";
white;cout<<"
este: ";
yellow; cout<<"["<<vnew<<"]";
getch();
break;};
case 27:{pause(); exit(1);}
default: goto sus;
}
goto sus;
getch();}
Fişierul „File2.h”
# define white
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11) //
alb
# define yellow
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10)
//galben
# define blue
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9) /
/albastru
# define cyan
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8) /
/cyan
# define del clrscr(); //curata ecranul
//*************MENU PAUZA
void pause(){
yellow;
cout<<endl<<endl<<"Apasati orice tasta...";
getch();
white;
};