Documente Academic
Documente Profesional
Documente Cultură
Clasa in OOP
O clasă defineşte un tip abstract de date, asta însemnând faptul că un astfel de tip deţine atât mulţimea
de date, cât şi setul de operaţii ce se efectuează cu acele date. Mulţimea de date poartă numele de date
membru, iar, mulţimea de operaţii, poartă numele de funcţii membru sau metode.
Acestea, în construcţia unei clase, sunt supuse influenţei a 3 specificatori de protecţie, şi anume:
private – care este cel implicit, şi inhibă vizibilitatea datelor şi metodelor ce se află sub incidenţa
sa în afara clasei de definire
public – vizibilitate date şi metode de oriunde din interiorul clasei şi din afara sa
protected – vizibilitate date şi metode în clasa respectivă şi ierarhii din clasa respectivă.
class nume_clasa
{
[private:]
date_membru;
funcţii_membru (metode);
protected:
date_membru;
funcţii_membru (metode);
public:
date_membru;
funcţii_membru (metode);
};
Definirea unei metode se poate face în interiorul clasei, în acest caz, funcţia fiind catalogată ca una in-
line (asta înseamnă că compilatorul înlocuieşte automat apelul prin codul efectiv al funcţiei, realizare
virtuală), sau, în afara clasei, după următoarea sintaxă:
tip_rezultat_functie nume_clasa::nume_metoda(linie_parametri_formali)
{
corp_propriu_funcţie;
[return …;]
}
In afara metodelor, intr-o clasa pot fi definite si funcţii prieten. Acestea au proprietatea că vor fi definite
şi apelate precum funcţiile obişnuite, dar, prin faptul că îşi găsesc antetul în interiorul unei clase,
înseamnă că pot utiliza toate datele acesteia, indiferent de forma de protecţie.
Marea diferenţă între o metodă şi o funcţie prieten constă în apel, şi anume, metoda se apelează printr-
un obiect, iar, funcţia prieten, nu, asemeni unei funcţii obişnuite, astfel încât, dacă avem nevoie de un
obiect, acesta trebuie transmis prin linia de parametri.
#include<iostream>
using namespace std;
class complex
{
private:
double a,b;
public:
void atribuire(int i=0, int j=1) /*functie de atribuire, definita fiind ca functie
in-line, ptr. simplul motiv ca ea a fost scrisa in interiorul clasei*/
{
a=i; b=j;
}
double& ret_re(); /*functie care va returna partea reala din numarul complex,
functia alegem sa intoarca o referinta, pentru a putea fi apelata si din partea stanga,
ea nu este definita in interiorul clasei, ci va fi definita in afara acesteia*/
double& ret_im(); //functie ce returneaza partea imaginara
void citire(); //functie pentru citirea unui numar complex
friend void afisare(complex, char*); /*functie pentru afisarea unui numar
complex, functia de fata este una prieten*/
};
inline double& complex::ret_re() /*prin faptul ca pus cuvantul inline, functia, chiar
daca e definita in afara clasei, este prelucrata ca fiind functie in-line*/
{
return a;
}
void complex::citire()
{
cout<<"\tpartea reala: ";
cin>>a;
cout<<"\tpartea imaginara: ";
cin>>b;
}
int main()
{
complex z1,z2,z3;
system("pause");
return (0);
}
class nume_clasa
{
[private:]
Date membru;
Functii membru;
[public:]
Date membru;
Functii membru;
[protected:]
Date membru;
Functii membru;
};
Datele şi metodele sunt definite sub incidenţa a 3 posibili specificatori de protecţie (private,
public şi protected). Elementele ce se găsesc sub private nu sunt vizibile decât în clasa respectivă, acest
specificator fiind şi cel implicit. Componentele ce se găsesc sub influenţa lui public pot fi accesate de
oriunde din clasă, respectiv, din afara acesteia. Cele care se găsesc sub incidenţa lui protected pot fi
accesate doar într-o ierarhie de clase, adică, clasa respectivă şi alte clase ce derivă din aceasta.
Obiectul
Obiectul este o instanţă de clasă, o referire a clasei, o dată a clasei. Declararea unui obiect se
face prin două metode:
1) Declaraţie automatică:
nume_clasa nume_obiect;
2) Declaraţie dinamică:
nume_clasa* nume_obiect;
nume_obiect = new nume_clasa;
O astfel de declaraţie de obiect are o durată de viaţă determinată de utilizator, adică, în momentul
în care acesta utilizează comanda delete nume_obiect; va curăţa zona de memorie ocupată de
respectivul obiect.
#include<iostream>
using namespace std;
class complex
{
float a,b; //a - p. reala, b - p. imaginara, presetate de private
public:
void citire(char* s)
{
cout<<"Introduceti nr. complex "<<s<<":\n";
cout<<"\tpartea reala= ";
cin>>a;
cout<<"\tpartea imaginara= ";
cin>>b;
}
void afisare(char* s)
{
cout<<"Nr. complex "<<s<<": ("<<a<<','<<b<<")\n";
}
complex aduna(complex z) //varianta 1 (transfer prin rezultat)
{
complex t;
t.a=a+z.a;
t.b=b+z.b;
return t;
}
void aduna(complex z, complex* t) //varianta 2 (transfer prin parametru adresa)
{
t->a=a+z.a;
t->b=b+z.b;
}
void aduna(complex z, complex& t) //varianta 3 (transfer prin parametru referinta)
{
t.a=a+z.a;
t.b=b+z.b;
}
};
int main()
{
//nr. complex z1 il vom declara ca si obiect automatic, iar z2 ca unul dinamic
complex z1, *z2;
system("pause");
return (0);
}
Obiectul curent este obiectul care apelează funcţia, spre exemplu, în cazul z2->citire("z2"); obiect
curent este z2, în cazul s4.afisare("z1+z2"); obiect curent este s4.
Un obiect este o instanţiere a unei clase, adică, o dată de clasă, adică, o definire a unei clase.
Obiectul curent este cel care apelează o dată sau o metodă, fiind cel care îşi ia în sarcina data sau
metoda respectivă, se numeşte obiectul this, iar orice referire la datele sale se face prin declaraţia:
Constructorul este o metodă a unei clase, ce permite iniţializare la declarare a unui obiect. Orice clasă
are un constructor definit, el nu se vede, fiind implicit, doar se apelează, de asemenea, tot implicit. Orice
scriere proprie de constructor, îl va suprascrie pe cel implicit, aşa că, dacă avem nevoie în declaraţii de
acesta, ele trebuie rescris. Constructorii sunt de mai multe feluri:
Orice funcţie constructor are numele acelaşi cu numele clasei din care provine şi nu are tip rezultat scris.
Destructorul este cel care ajută la dealocarea unui obiect, dacă nu se defineşte nici unul, atunci intră în
acţiune cel implicit, nu are tip rezultat, nu are corp de funcţie, iar numele coincide cu numele clasei,
precedat fiind însă de semnul “~”.
#include<iostream>
using namespace std;
class vb
{
int e1,e2;
public:
//constructor de initializare prin parametri
vb(int,int); //(1)
//constructor de initializare fara parametri, de forma celui implicit
vb(){} //(2)
//constructor de initializare prin copiere
vb(const vb&); //(3)
//functii pentru extragerea intr-o forma publica a elementelor vectorului
int& element1(); //(4)
int& element2(); //(5)
//destructor propriu
~vb(); //(6)
//functie de afisare continut
void afisare(char*); //(7)
};
int& vb::element1()
{
return e1;
}
int& vb::element2()
{
return e2;
}
vb::~vb()
{
cout<<"dealocare de memorie obiect\n";
}
void vb::afisare(char* s)
{
cout<<"Vectorul binar "<<s<<" este: ("<<e1<<','<<e2<<")\n";
}
int main()
{
vb v1(9,0); //apel al lui (1) - declaratie statica
vb* v2=new vb(4,5); //apel al lui (1) - declaratie dinamica
vb v3; //apel al lui (2)
v3.element1()=10; //apel al lui (4)
v3.element2()=-1; //apel al lui (5)
vb v4(v3); //apel al lui (3)
//afisarea:
v1.afisare("v1");
v2->afisare("v2");
v3.afisare("v3");
v4.afisare("v4");
system("pause");
return (0);
}
Subiectul 3 Fisiere text
Fisiere text
Aplicatia 1. Se citeste un fisier text, Numere.txt, fisier ce contine numere intregi, despartite prin spatiu
si Enter. Sa se determine valorile extreme din acel fisier si suma tuturor elementelor.
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
//P1: deschiderea fisierului
//varianta 1: prin constructor si clasa dedicata fisierelor de citire
ifstream f("d:\\numere.txt");
/*varianta 2: prin constructor si clasa pentru modul general de lucru cu fisiere
fstream f("d:\\numere.txt",ios::in);*/
/*varianta 3: prin functie de deschidere si obiect al unei clase pentru citire din
fisier
ifstream f;
f.open("d:\\numere.txt");*/
/*varianta 4: prin functie de deschidere si obiect al unei clase pentru modul
general de lucru cu fisiere
fstream f;
f.open("d:\\numere.txt",ios::in);*/
Aplicatia 2. Se citeste un fisier text, Litere1.txt, ce contine un mesaj textual. Sa se contorizeze aparitia
fiecarei vocale, precum si numarului tuturor consoanelor din fisier. Rezultatul nu se va transmite la
consola, ci, intr-un alt fisier text, Litere2.txt.
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ifstream f("d:\\litere1.txt");
if(!f)
throw new exception("Eroare la deschiderea fisierului de intrare\n");
int a,e,i,o,u,c; //numarul de aparitii a fiecarei vocale si a consoanelor
a=e=i=o=u=c=0;
char x;
while(!f.eof())
{
f>>x;
switch(x)
{
case 'a':
case 'A':{a++;break;}
case 'e':
case 'E':{e++;break;}
case 'i':
case 'I':{i++;break;}
case 'o':
case 'O':{o++;break;}
case 'u':
case 'U':{u++;break;}
default:
if((x>'a'&&x<='z')||(x>'A'&&x<='Z'))
c++;
};
}
f.close();
ofstream g("d:\\litere2.txt");
if(!g)
throw new exception("Eroare la deschiderea fisierului de iesire\n");
g<<"Nr. de aparitii a lui a|A: "<<a<<'\n';
g<<"Nr. de aparitii a lui e|E: "<<e<<'\n';
g<<"Nr. de aparitii a lui i|I: "<<i<<'\n';
g<<"Nr. de aparitii a lui o|O: "<<o<<'\n';
g<<"Nr. de aparitii a lui u|U: "<<u<<'\n';
g<<"Nr. de consoane: "<<c<<'\n';
system("pause");
return (0);
}
Subiectul 4 Fisiere binare
Fisiere binare
1. Se citeste de la tastatura o lista de produse, in ceea ce inseamna denumire si pret, informatia fiind
scrisa intr-un fisier binar. Se va scrie, apoi, un alt program, ce va prelua lista de produse din fisierul binar,
si o va transmite la consola.
//Fisier_binar.h
#include <iostream>
#include <fstream>
using namespace std;
struct produs
{
char denumire[30];
float pret;
};
//Aplicatia1.cpp – este aplicatia prin intermediul careia se inscriu date in fisierul binar Produse.dat
#include"fisier_binar.h"
int main()
{
//P1: deschiderea fisierului
ofstream f("d:\\produse.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception("Eroare la deschiderea fisierului");
int i=0;
char c;
system("pause");
return (0);
}
//Aplicatia2.cpp – este aplicatia prin intermediul careia se preiau date din fisierul binar Produse.dat, se
scriu la consola, putandu-se realiza diverse aplicatii pe acestea
#include"fisier_binar.h"
int main()
{
//P1: deschiderea fisierului binar, spre citire din el
ifstream f("d:\\produse.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception ("Eroare la deschiderea fisierului");
int i=0;
system("pause");
return (0);
}
2. Se citesc un număr de maxim 20 de numere complexe, într-un fişier binar, urmând ca apoi să se
deschidă respectivul fişier, să se afişeze la consolă respectivele numere, şi să se efectueze produsul lor.
#include <iostream>
#include <fstream>
using namespace std;
struct complex
{
float a,b; //a-partea reala, b-partea imaginara
char nume[3];
};
#include"Complex.h"
int main()
{
//P1: deschiderea fisierului spre scriere in el
ofstream f("d:\\complexe.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception("Eroare la deschiderea fisierului");
int i=0;
char c;
system("pause");
return (0);
}
#include"Complex.h"
int main()
{
//P1: deschiderea fisierului binar, spre citire din el
ifstream f("d:\\complexe.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception ("Eroare la deschiderea fisierului");
//P3: citirea listei din fisier
f.read((char*)vector, dim*sizeof(complex));
int i=0;
complex t;
t.a=t.b=0;
for(int j=0;j<i;j++)
t.a+=vector[j].a;
for(int j=0;j<i;j++)
t.b+=vector[j].b;
cout<<"\nNr. complex suma: ("<<t.a<<','<<t.b<<")\n";
system("pause");
return (0);
}
3. Se citesc un număr de maxim 20 de numere rationale, într-un fişier binar, urmând ca apoi să se
deschidă respectivul fişier, să se afişeze la consolă respectivele numere, şi să se efectueze suma lor.
//Rational.h
#include <iostream>
#include <fstream>
using namespace std;
struct rational
{
char nume; //numele numarului rational (R, Q, P, ...)
int a,b; //a-numaratorul, b-numitorul
int cmmdc(int x, int y)
{
while(x!=y)
{
if(x>y)
x=x-y;
else
y=y-x;
}
return x;
}
void ireductibil()
{
if(a==0)
{
b=1;
return;
}
if(b<0)
{
a=-a;
b=-b;
}
if(abs(a)!=1 && b!=1)
{
int d=cmmdc(abs(a),b);
a/=d;
b/=d;
}
}
};
#include"Rational.h"
int main()
{
//P1: deschiderea fisierului spre scriere in el
ofstream f("d:\\rationale.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception("Eroare la deschiderea fisierului");
int i=0;
char c;
system("pause");
return (0);
}
#include"Complex.h"
int main()
{
//P1: deschiderea fisierului binar, spre citire din el
ifstream f("d:\\rationale.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception ("Eroare la deschiderea fisierului");
int i=0;
#include"Complex.h"
int main()
{
//P1: deschiderea fisierului binar, spre citire din el
ifstream f("d:\\rationale.dat",ios::binary);
//P2: testarea deschiderii
if(!f)
throw new exception ("Eroare la deschiderea fisierului");
int i=0;
system("pause");
return (0);
}
-daca intr-o clasa derivate declaram un obiect al unei clase de baza urmand ca acesta sa apeleze
elemente protejate in ierarhie definite in clasa de baza,acestea nu vor fi accesibile
-nu se pot transfera informatii dinspre clasa de baza inspre clasa derivata decat in urma supraincarcarii
explicite a operatorului =(operatorul de atribuire)
-constructorii si destructorii sunt metode care nu se mostenesc,astfel incat constructorul unei clase
derivate apeleaza intai constructorul clasei de baza,in cazul destructorilor,operatiunea facandu-se invers
-daca in intermediul unei ierarhii de clasa denumirile unei date sau antetele unor metode
coincid,prioritare vor fi cele din clasa derivata, cele din clasa de baza fiind accesate prin:
nume_clasa_baza::data/metoda;
class baza
{
private:
date|metode
protected:
date|metode
public:
date|metode
};
Explicatii:
Dupa cum se vede apare un nou specificator de protectie(protected) utilizabil pentru accesibilitatea
datelor intr-o ierarhie de clase.
In linia de mostenire apare private/public, utilizarea lor se poate observa in tabelul de mai jos cu
controlul accesului la membrii mosteniti:
Se considera o clasa Pereche, ce contine date despre o pereche de numere intregi si un constructor ce
va permite initierea la declaratie a informatiei. Din clasa Pereche, deriva o clasa Complex, care, preia
informatia din Pereche, ataseaza un nume, si prelucreaza numerele complexe, prin afisarea si suma
acestora. De asemenea, se cere supraîncarcarea operatorului “=” pentru realizarea operaţiilor de
conversie dinspre Pereche spre Complex.
#include<iostream>
using namespace std;
class pereche
{
protected:
int a,b;
public:
pereche(int x, int y)
{
a=x;
b=y;
}
};
int main()
{
complex z1(3,4,"z1"), z2(-6,2,"z2");
system("pause");
return (0);
}
#include<iostream>
using namespace std;
class pereche
{
protected:
int a,b;
public:
pereche(int x, int y)
{
a=x;
b=y;
}
int& parte_re()
{
return a;
}
int& parte_im()
{
return b;
}
};
};
int main()
{
complex z1(3,4,"z1"), z2(-6,2,"z2");
pereche t(5,-9);
complex z3(0,0,"z3");
z3=t;
cout<<z3;
system("pause");
return (0);
}
Avantajul utilizării claselor prieten este acela de a a vea pobilitatea accesului datelor ce se găsesc sub
influenţa specificatorului private.
Sintaxa unei clase prieten este următoarea:
class clasa2;
class clasa1
{
//elemente specifice clasei initiale
friend class clasa2; /*clasa2 va fi clasa priten clasei clasa1, adica, va avea
acces la toate elementele, de orice natura, ale clasa1*/
};
class clasa2
{
//elemente specifice clasei prieten
};
Exemplu:
Se consideră o clasă Pereche, cu două elemente, numere întregi, să se construiască o altă clasă,
Complex, care să acceseze elementele clasei Pereche, şi să realizeze operaţii de bază pe numere
complexe, adică, introducerea şi afişarea acestora.
#include<iostream>
class complex;
class pereche
{
int a,b;
friend class complex;
};
class complex
{
pereche p;
char* n;
public:
complex(int x, int y, char s[])
{
p.a=x;
p.b=y;
n=s;
}
void afis()
{
cout<<"Nr. complex "<<n<<" este: ("<<p.a<<','<<p.b<<")\n";
}
};
int main()
{
complex z1(2,3,"z1");
complex z2(-1,8,"z2");
z1.afis();
z2.afis();
system("pause");
return (0);
}
#include<iostream>
class complex;
class pereche
{
int a,b;
friend class complex;
public:
pereche(int x, int y)
{
a=x;
b=y;
}
};
class complex
{
char* n;
public:
complex(char s[]=NULL, int x=0, int y=1)
{
pereche p(x,y);
n=s;
}
void afis(pereche p)
{
cout<<"Nr. complex "<<n<<" este: ("<<p.a<<','<<p.b<<")\n";
}
};
int main()
{
pereche p1(2,3);
complex z1("z1");
pereche p2(-9,7);
complex z2("z2");
z1.afis(p1);
z2.afis(p2);
system("pause");
return (0);
}
Subiectul 7 Polimorfisul
Polimorfismul. Clase abstracte
Polimorfismul: capacitatea unui obiect de a lua forme multiple. Are la bază procesul de moştenire şi
existenţa funcţiilor virtuale.
Principiul de functionare este urmatorului: intr-o ierarhie de clase, se declara un obiect dinamic la clasa
cea mai de bază şi se face apoi pointarea la toate celelalte clase derivate din clasa de bază.
Polimorfismul are la bază utilizarea funcţiilor virtuale.
O clasă abstractă este o clasă definită în vârful unei ierarhii, de următoarea formă:
class clasa_abstracta
{
virtual tip_rez functia1(linie_parametri)=0;
virtual tip_rez functia2(linie_parametri)=0;
virtual tip_rez functia3(linie_parametri)=0;
.....................
};
unde functia1, functia2, …, sunt funcţii virtual pure (sunt precedate de cuvântul virtual, nu au corp
definit de funcţie, antetul este egalat cu 0 şi se incheie cu “;”).
Exemplu:
Să se scrie o ierarhie de clase, pornind de la o clasă virtuală, pentru citirea, calculul ariei şi al
perimetrului, pentru cazul cercului, al tringhiului si al dreptunghiului.
#include<iostream>
#define pi 3.14
double aria()
{
return l*L;
}
double perimetru()
{
return 2*l+2*L;
}
};
int main()
{
home* x; //aplicarea polimorfismului
//cazul cercului
x=new cerc;
x->citire();
cout<<"Aria cercului: "<<x->aria()<<'\n';
cout<<"Perimetrul cercului: "<<x->perimetru()<<'\n';
cout<<'\n';
//cazul triunghiului
x=new triunghi;
x->citire();
cout<<"Aria triunghiului: "<<x->aria()<<'\n';
cout<<"Perimetrul triunghiului: "<<x->perimetru()<<'\n';
//cazul dreptunghiului
x=new dreptunghi;
x->citire();
cout<<"Aria dreptunghiului: "<<x->aria()<<'\n';
cout<<"Perimetrul dreptunghiului: "<<x->perimetru()<<'\n';
system("pause");
return (0);
}
#include<iostream>
#define dim 50
using namespace std;
int main()
{
int a[dim];
double b[dim];
int n,m;
cout<<'\n';
system("pause");
return (0);
}
int main()
{
int m,n; // m - nr de linii, n - nr de coloane
system("pause");
return (0);
}
Subiectul 9B Supraincarcarea opertorilor speciali
Operatorul indexare si atribuire
#include<iostream>
using namespace std;
#define dim 512
typedef int sir[dim]; //am definit un tip de date, cu numele 'sir', elementele fiind
intregi, iar dimensiunea rezervata a sirului tinuta in constanta dim
class vector
{
sir a; //vectorul
int n; //dimensiunea citita a vectorului
public:
vector(const vector&); //constructor de copiere, pentru transfer la declaratie a
datelor intr-un alt vector
vector(){} //pentru faptul ca exista un alt vector definit, cel implicit va fi
suprascris, iar prin aceasta declaratie il vom rescrie
int& operator[](int); //operatorul special '[]' (indexare|matrice) supraincarcat
//citirea vectorului n-dimensional
friend istream& operator>>(istream&,vector&); //cin>>v; v(vector)
//afisarea vectorului
friend ostream& operator<<(ostream&,vector); //cout<<v;
//operatorul de atribuire '=' supraincarcat
vector operator=(vector);
};
int& vector::operator[](int i)
{
return a[i];
}
vector vector::operator=(vector v)
{
n=v.n;
for(int i=0;i<n;i++)
a[i]=v[i];
return *this;
}
int main()
{
vector v;
//citirea si afisarea
cin>>v;
cout<<"V: "<<v;
vector w;
w=v;
cout<<"W: "<<w;
system("pause");
return (0);
}
#include<iostream>
using namespace std;
class vector
{
int n; //numarul de elemente
int *a; //tabela de coeficienti
public:
vector(int = -1); //constructor de initializare cu parametri mpliciti
vector(vector&); //constructor de initializare prin transfer
int& operator[](int); //operatorul 'indexare' supraincarcat (returneaza un anumit
element de pepozitia indicataprinparametru)
friend istream&operator>>(istream&, vector&); //citirea unui vector
friend ostream&operator<<(ostream&, vector); //afisarea unui vector
int operator==(vector&); //verificarea dc. doi vectori coincid
vector& operator=(vector&); //operatorul 'atribuire' supraincarcat pentru
transferul intre doi vectori
};
inline vector::vector(int x) : n(x)
{
a = new int[n]; //rezervarea spatiului de memorie in Heap
}
ostream&operator<<(ostream& x, vector v)
{
x<<"Vectorul este: ";
for(int i=0;i<v.n;i++)
x<<v[i];
x<<'\n';
return x;
}
int vector::operator==(vector& v)
{
int e = 1;
if (n != v.n)
e = 0;
else
for (int i = 0; i<= v.n && e == 1; i++)
if (a[i] != v[i])
e = 0;
return e;
}
vector& vector::operator=(vector& v)
{
if(!(*this==v))
{
delete a; /*se elibereazaspatiulocupat de pointerulpentrusirul
reprezentatfiindprinobiectul curent*/
a = new int[v.n]; /*se aloca spatiu extins nou pentru pointerul sirului
reprezentatprinobiectul current*/
n = v.n; /*se copiaza noua dimensiune, cu preluare din obiectultransmis
ca parametru*/
//se copiaza continutul sirului din celtransmis ca parametru
for (int i = 0; i< n; i++)
a[i] = v[i]; //copiere element cu element pepozitii
}
return *this;
}
int main()
{
vector v1(3), v2;
cin>>v1;
v2=v1;
cout<<v2;
system("pause");
return (0);
}
struct extrem
{
int m,M;
};
class vector
{
sir a; //vectorul
int n; //dimensiunea citita a vectorului
bool prim(int); //verificarea daca un numar este prim
int cmmdc(int,int); //cmmdc-ul a doua numere intregi
public:
vector(const vector&); //constructor de copiere, pentru transfer la declaratie a
datelor intr-un alt vector
vector(){} //pentru faptul ca exista un alt vector definit, cel implicit va fi
suprascris, iar prin aceasta declaratie il vom rescrie
int& operator[](int); //operatorul special '[]' (indexare|matrice) supraincarcat
//citirea vectorului n-dimensional
friend istream& operator>>(istream&,vector&); //cin>>v; v(vector)
//afisarea vectorului
friend ostream& operator<<(ostream&,vector); //cout<<v;
bool vector::prim(int e)
{
bool i=true;
if(e==1||e==2)
return i;
if(e%2==0)
{
i=false;
return i;
}
for(int i=3;i*i<=e;i++)
if(e%i==0)
{
i=false;
return i;
}
return i;
}
int& vector::operator[](int i)
{
return a[i];
}
#include"Vector.h"
int main()
{
vector v;
//citirea si afisarea
cin>>v;
cout<<v;
system("pause");
return (0);
}
2. Polinomul
#include<iostream>
using namespace std;
class polinom
{
int gr; //gardulpolinomului
int *cf; //tabela de coeficienti
public:
polinom(int = -1); //constructor de initializare cu parametriimpliciti
polinom(polinom&); //constructor de initializareprin transfer
~polinom(); //destructor
int& operator[](int); //operatorul 'indexare' supraincarcat (returneaza un anumit
element de pepozitiaindicataprinparametru)
friend istream&operator>>(istream&, polinom&); //citirea unui polinom
friend ostream&operator<<(ostream&, polinom); //afisarea unui polinom
polinom operator+(polinom&); //adunarea a douapolinoame
polinom operator*(polinom&); //inmultirea a douapolinoame
polinom& operator=(polinom&); //operatorul 'atribuire'
supraincarcatpentrutransferulcoeficientilordintr‐un polinomintr‐altul
int operator==(polinom&); //verificarea dc. doua siruri polinomiale coincid
double operator|(int); //valoarea unui polinom intr‐un punct
(punctulesteindicatprinparametru)
};
inline polinom::~polinom()
{
delete[]cf; //curatacontinutuldintr‐un polinom
}
istream&operator>>(istream&x, polinom&p)
{
cout<<"\tintroduceti coenficientii:\n";
for (int i = p.gr; i>= 0; i--)
{
cout<<"\t\tcoeficient ["<<i<<"]= ";
x>>p[i]; //apel al operatorul '[]', altfel, ar fi trebuitscris 'p.cf[i]'
}
return x;
}
ostream&operator<<(ostream& x, polinom p)
{
x<<p[p.gr]<<"*x^"<<p.gr;
for (int i = p.gr - 1; i>= 1; i--)
if (p[i]>= 0)
x<<'+'<<p[i]<<"*x^"<<i;
else
x<<p[i]<<"*x^"<<i;
if (p[0]>= 0)
x<<'+'<<p[0];
else
x<<p[0];
cout<<'\n';
return x;
}
polinom&polinom::operator=(polinom&p)
{
if(!(*this==p))
{
delete cf; /*se elibereazaspatiulocupat de pointerulpentrusirul
reprezentatfiindprinobiectul current*/
cf = new int[p.gr + 1]; /*se alocaspatiuextinsnoupentrupointerulsirului
reprezentatprinobiectul current*/
gr = p.gr; /*se copiazanouadimensiune, cu preluare din obiectultransmis
ca parametru*/
//se copiazacontinutulsirului din celtransmis ca parametru
for (int i = 0; i<= gr; i++)
cf[i] = p[i]; //copiere element cu element pepozitii
}
return *this;
}
polinom polinom::operator+(polinom& p)
{
int x, y;
(gr >= p.gr) ? (x = gr, y = p.gr) : (x = p.gr, y = gr); /* se foloseste operatorul
conditional: expr_test?expr_adv:expr_fals */
polinom r(x);
for (int i = 0; i<= y; i++)
r[i] = (*this)[i] + p[i];
if (x == y)
return r;
if (x == gr)
for (int i = y + 1; i<= x; i++)
r[i] = (*this)[i];
else
for (int i = y + 1; i<= x; i++)
r[i] = p[i];
return r;
}
polinom polinom::operator *(polinom&r)
{
polinom g(gr+r.gr);
for (int i = 0; i<= gr; i++)
for (int j = 0; j <= r.gr; j++)
g[i + j] += cf[i] * r[j];
return g;
}
int polinom::operator==(polinom&p)
{
int a = 1;
if (gr != p.gr)
a = 0;
else
for (int i = 0; i<= p.gr && a == 1; i++)
if (cf[i] != p[i])
a = 0;
return a;
}
double polinom::operator|(int x)
{
double r = 0;
for (int i = 0; i<= gr; i++)
r += cf[i] * (pow((float)x, i));
return r;
}
int main()
{
//citimpolinomul P
cout<<"Dati datele polinomului P\n";
cout<<"\tintroduceti gradul: ";
int x; //dimensiuneareala a polinomului
cin>> x;
polinom p(x);
cin>> p;
//citimpolinomul Q
cout<<"Dati datele polinomului Q\n";
cout<<"\tintroduceti gradul: ";
int y;
cin>> y;
polinom q(y);
cin>> q;
//afisareapolinoamelor
cout<<"Polinomul P: "<< p;
cout<<"Polinomul Q: "<< q;
//verificareadacadouapolinoamecoincid
cout<<"1 = polinoame identite | 0 = polinoame diferite: "<< (p == q) <<'\n';
//tranferul datelor dinspre un polinom spre un altul
polinom r;
r = p;
cout<<"Polinomul R: "<< r;
//valoareaunuipolinomintr‐un punct
cout<<"Dati punctul in care se dorestevaloareapolinomului P: ";
int z;
cin>> z;
cout<<"Valoarea lui P in "<< z <<"= "<< (p | z) <<'\n';
//adunarea a douapolinoame
polinom s;
s = p + q;
cout<<"Polinomul P+Q: "<<s ;
//inmultirea a douapolinoame
polinom k;
k = p*q;
cout<<"Polinomul P*Q: "<< k <<'\n';
system("pause");
return (0);
}
3. Matricea bidimensionala
//Matrice.h
#include<iostream>
#include<iomanip>
using namespace std;
class matrice
{
int m,n; // m - numarul de linii, n - numarul de coloane
int* mat; // matricea, pentru se va aloca memorie in zona de memorare HEAP
public:
matrice(int=1,int=1); // constructor de initializare cu parametri
int* operator()(int,int); /* supraincarcarea operatorului special 'apel de
functie' pentru determinarea unui element al
matricei dintr-o anumita pozitie, pozitie data ca parametru*/
friend istream& operator>>(istream&,matrice&); /*supraincarcarea operatorului
'extragere din flux' pentru citirea elementelor unei matrice */
friend ostream& operator<<(ostream&,matrice); /*supraincarcarea operatorului
'insertie in flux' pentru afisarea elementelor unei matrice */
matrice operator+(matrice&); /* supraincarcarea operatorului '+' pentru
adunarea a doua matrice */
matrice operator-(); /* supraincarcarea operatorului '-' pentru
determinarea opusei unei matrice */
matrice operator-(matrice&); /* supraincarcarea operatorului '-' pentru
diferenta a doua matrice */
matrice operator~(); // transpusa unei matrice
};
//Exemplu.cpp
#include"Matrice.h"
int main()
{
int m,n; // m - nr de linii, n - nr de coloane
cout<<"Afisam A+B:\n";
cout<<a+b; // apel al functiilor ce supraincarca operatorii '+' si '<<'
cout<<"Afisam expresia A - B:\n";
cout<<a-b;
system("pause");
return (0);
}
4. Multimile
#include<iostream>
using namespace std;
class multime
{
int n;
int *m;
public:
multime(int x=0);
int apartenenta(int, int);
void citire(char*);
void afisare(char *);
multime operator-(multime); //diferenta
multime operator*(multime); //intersectia
multime operator+(multime); //reuniunea
};
multime multime::operator-(multime t)
{
multime d(n);
int dim = 0;
for (int i = 0; i< n; i++)
if(!t.apartenenta(m[i], t.n))
d.m[dim++] = m[i];
d.n = dim;
return d;
}
multime multime::operator*(multime t)
{
multime i(n <t.n ? n : t.n);
int dim = 0;
for (int j = 0; j < n; j++)
if (t.apartenenta(m[j], t.n))
i.m[dim++] = m[j];
i.n = dim;
return i;
}
multime multime::operator+(multime t)
{
multime r(n + t.n);
int dim = 0;
for (int i = 0; i< n; i++)
r.m[dim++] = m[i];
for (int j = 0; j <t.n; j++)
if(!(*this).apartenenta(t.m[j], n))
r.m[dim++] =t. m[j];
r.n = dim;
return r;
}
int main()
{
int x;
cout<<"Introduceti date pentrumultimea A\n";
cout<<"\tdati dimensiunea: ";
cin>> x;
multime a(x);
a.citire("A");
a.afisare("A");
multime d;
d = a-b;
d.afisare("A-B");
multime i;
i= a*b;
i.afisare("A intersectat cu B");
multime r;
r = a + b;
r.afisare("A reunit cu B");
system("pause");
return 0;
}
5. Numarul complex
#include<iostream>
#include<iomanip> /*biblioteca folosita pentru manipulatorii cu parametru, in
cazul acestei aplicatii: functia setprecision*/
complex complex::operator+(complex& z)
{
complex r;
r.a=a+z.a;
r.b=b+z.b;
return r;
}
complex complex::operator-()
{
complex r;
r.a=-a;
r.b=-b;
return r;
}
complex complex::operator-(complex& z)
{
return (*this)+(-z); /*relatie intre obiectul curent si cel transmis ca
parametru, operatorii din relatie fiind cei supraincarcati
prin functiile anterioare*/
}
complex complex::operator~()
{
complex r;
r.a=a;
r.b=-b;
return r;
}
complex complex::operator*(complex& z)
{
complex r;
r.a=a*z.a-b*z.b;
r.b=a*z.b+b*z.a;
return r;
}
float complex::operator!()
{
return sqrt(pow(a,2)+pow(b,2));
}
complex complex::operator*(float x)
{
complex r;
r.a=x*a;
r.b=x*b;
return r;
}
int main()
{
complex z1,z2;
cout<<'\n';
cout<<'\n';
system("pause");
return (0);
}
6. Numarul rational
#include<iostream>
using namespace std;
class rational
{
int a,b; //a=numaratorul, b=numitorul
int cmmdc(int,int); //cmmdc-ul a doua numere intregi
void ireductibil(); //aducerea unei fractii intr-o forma ireductibila
public:
rational(int=0,int=1); //constructor prin parametri
rational(const rational&); //constructor prin copiere
int& numarator(); //extragerea numaratorului
int& numitor(); //extragerea numitorului
//citirea unui numar rational
friend istream& operator>>(istream&,rational&); //cin>>r;
//afisarea unui numar rational
friend ostream& operator<<(ostream&,rational); //cout<<r;
rational operator+(rational&); //r1+r2
rational operator-(rational&); //r1-r2
rational operator*(rational&); //r1*r2
rational operator*(int); //r*7 (amplificarea unei fractii)
friend rational operator*(int,rational&); //(-3)*r
rational operator/(rational&); //r1/r2
private:
rational operator-(); //-r1 (opusul)
rational operator!(); //1/r (inversul)
};
int& rational::numarator()
{
return a;
}
int& rational::numitor()
{
return b;
}
rational rational::operator+(rational& r)
{
rational t;
t.a=a*r.b+b*r.a;
t.b=b*r.b;
t.ireductibil();
return t;
}
rational rational::operator-()
{
rational t;
t.a=-a;
t.b=b;
return t;
}
rational rational::operator-(rational& r)
{
rational t;
t=(*this)+(-r);
t.ireductibil();
return t;
}
rational rational::operator*(rational& r)
{
rational t;
t.a=a*r.a;
t.b=b*r.b;
t.ireductibil();
return t;
}
rational rational::operator*(int x)
{
rational t;
t.a=a*x;
t.b=b*x;
return t;
}
rational rational::operator!()
{
rational t;
t.a=b;
t.b=a;
return t;
}
rational rational::operator/(rational& r)
{
rational t;
t=(*this)*(!r);
t.ireductibil();
return t;
}
int main()
{
rational r1,r2;
system("pause");
return (0);
}