float Cerc::get_aria(void)//arie
{
return (float)pi*r*r;
}
float Cerc::get_lung(void)//circumferinta
{
return (float)2*pi*r;
}
void Cerc::set_raza(int a)//setarea razei
{
r=a;
cout<<"Raza a fost setata la valoarea\t"<<a<<"\n";
}
Cerc::~Cerc(void)
{
cout<<"Apelare destructor\n";
}
void main(void)
{
int r1,r2,r3,r4;//variabile care vor deveni raze
Cerc c1,c2,*c3,&c4=c2;//variabile de tip Cerc
cout<<"Afisarea ariei si circumferintei cu valoarea implicita (raza=1)\n
";
cout<<"Aria:\t"<<c1.get_aria()<<"\n";
cout<<"Circumferinta\t"<<c1.get_lung()<<"\n";
cout<<"Dati raza pentru cercul 1:\t";//operatii pe cercul 1
cin>>r1;
c1.set_raza(r1);
cout<<"Aria cercului 1 este :\t"<<c1.get_aria()<<"\n";
cout<<"Circumferinta cercului 1 este :"<<c1.get_lung()<<"\n";
#include<string.h>
#include<ctype.h>//pentru majuscule si minuscule
class String
{
char v[10];
public:
void setare(char *);//metode
int lung(void);
int poz_ultim(char );
char* maj(void);
char* min(void);
int nr_rep(char );
};
void String::setare(char *m)//seteaza sirul de tip String
{
strcpy(v,m);
}
int String::lung(void)//determina lungimea sirului
{
return strlen(v);
}
int String::poz_ultim(char c)//determina ultima pozitie a unui caracter din sir
{
int poz;
for(int i=0; i<10;i++)
if(v[i]==c)
poz=i;
return poz;
}
char* String::maj(void)//returneaza sirul scris cu majuscule
{
char m[10];
for(int i=0; i<10;i++)
m[i]=toupper(v[i]);
return m;
}
char* String::min(void)//returneaza sirul scris cu minuscule
{
char m[10];
for(int i=0;i<10;i++)
m[i]=tolower(v[i]);
return m;
}
int String::nr_rep(char c)//returneaza numarul de repetitie in sir a unui caract
er
{
int m=0;
for(int i=0;i<10;i++)
if(v[i]==c)
m++;
return m;
}
3.Sa se scrie programul care citeste de la tastatura un sir de maxim 10 caracter
e si care, pe baza
clasei implementate anterior, efectueaza asupra sirului de intrare operatiile de
finite în cadrul
clasei.
//program care face operatii pe un sir de caractere dintr-o clasa definita intr-
un
#include<stdio.h>
#include<iostream>
#include<strClass.h>//headerul unde avem clasa String
using namespace std;
void main(void)
{
char *p,*q;//pointeri
int a, b;//variabile
char c,d;
String sir;//variabila de tipul String(din clasa)
char v[10];
cout<<"Dati sirul de caractere:\t";//initierea vectorului
cin>>v;
cout<<v;
sir.setare(v);//setarea variabilei sir de tipul String
cout<<"\nLungimea sirului este:"<<sir.lung();//operatii
p=sir.maj();
cout<<"\nSirul cu majuscule este:"<<*p;
q=sir.min();
cout<<"\nSirul cu minuscule este:"<<*q;
cout<<"\n\nDati caracterul pentru a afla ultima pozitie a sa:";
cin>>c;
a=sir.poz_ultim(c);
cout<<"\n Ultima pozitie este :"<<a+1;
cout<<"\n Dati caracterul pentru a afla numarul de repetare";
cin>>d;
b=sir.nr_rep(d);
cout<<"Numarul de repetitii este:"<<b;
}
4. Sa se scrie programul care implementeaza clasa Suma si care, în cadrul functiei
main, declara
un obiect de tipul clasei si apoi un pointer la acesta, prin intermediul carora
se va afisa pe
ecran rezultatul adunarii a doua numere preluate de la tastatura. Încercati implem
entarea
functiei suma în cadrul clasei si în exteriorul acesteia.
void main(void)
{
int n,m;
Suma a, *pa;
cout<<"Dati numerele pentru adunare:\n";
cout<<"Dati primul numar:\t";
cin>>n;
cout<<"\n Dati al doilea numar:\t";
cin>>m;
a.set_val(n,m);
cout<<"\nSuma este:\t"<<a.get_val();
cout<<"\n\n-------------------------\n\n";
cout<<"Pentru pointer:";
cout<<"Dati numerele(pentru verificare)\n";
cout<<"Dati primul numar:\t";
cin>>n;
cout<<"\n Dati al doilea numar:\t";
cin>>m;
pa=&a;
pa->set_val(n,m);
cout<<"\nSuma este:\t"<<pa->get_val();
}
5.Sa se defineasca o clasa care implementeaza functiile:
- int plus(int x, int y), care returneaza suma valorilor primite la apelul metod
ei;
- int minus(int x, int y), care returneaza suma valorilor primite la apelul meto
dei;
- int inmultit(int x, int y), care returneaza suma valorilor primite la apelul m
etodei;
- int impartit(int x, int y), care returneaza suma valorilor primite la apelul m
etodei;
si apoi sa se scrie aplicatia care utilizeaza aceasta clasa.
Observatie: În cazul împartirii, trebuie verificata validitatea operatiei (împartitor
diferit de
zero). În cazul în care operatia este imposibila, trebuie afisat un mesaj de eroare.
//program care face operatii matematice elementare pe clasa
#include<stdio.h>
#include<iostream>
using namespace std;
class Mate//definirea clasei
{
int x;
int y;
public:
int plus(int , int);//metoda pentru adunare
int minus(int , int);//matoda pentru scadere
int inmultire(int , int);//metoda pentru inmultire
int impartire(int , int);//metoda pentru impartire
};
int Mate::plus(int m, int n)
{
x=m;y=n;
return x+y;
}
int Mate::minus(int m, int n)
{
x=m;y=n;
return x-y;
}
int Mate::inmultire(int m, int n)
{
x=m;y=n;
return x*y;
}
int Mate::impartire(int m, int n)
{
x=m;y=n;
return x/y;
}
void main(void)
{
int a,b;
Mate nr;
cout<<"Dati numerele:\n";
cout<<"Dati primul numar:\t";
cin>>a;
cout<<"\nDati al doilea numar:\t";
cin>>b;
cout<<"\nSuma numerelor este:\t"<<nr.plus(a,b);
cout<<"\nDiferenta numerelor este:\t"<<nr.minus(a,b);
cout<<"\nProdusul numerelor este:\t"<<nr.inmultire(a,b);
if(b==0)//conditie pentru ca numitorul sa fie diferit de 0
cout<<"\nEROARE\n"<<"impartirea co 0 nu este valida\n";
else
cout<<"\nCatul numerelor este:\t"<<nr.impartire(a,b);
}
6.Sa se creeze o clasa care sa modeleze numerele complexe. Scrieti un program ca
re utilizeaza
aceasta clasa.
//program care modeleaza numere complexe
#include<iostream>
#include<stdio.h>
using namespace std;
class Complex//clasa de numere complexe
{
int a;
int b;
public:
void set_value(int x=0 , int y=0);//setarea valorii
int get_real(void);//afisarea partii reale
int get_imag(void);//afisarea partii imaginar
};
void Complex::set_value(int x, int y)
{
a=x; b=y;
}
int Complex::get_real(void)
{
return a;
}
int Complex::get_imag(void)
{
return b;
}
void main(void)
{
int n1, n2, m1, m2;
Complex nr1, nr2;
cout<<"\nDati numarul complex:";
cout<<"\nDati partea reala:";
cin>>m1;
cout<<"\nDati partea imafinara:";
cin>>n1;
cout<<"\nPentru al doilea numar complex:";
cout<<"\nDati partea reala:";
cin>>m2;
cout<<"\nDati partea imafinara:";
cin>>n2;
nr1.set_value(m1, n1);
nr2.set_value(m2, n2);
cout<<"\nPrimul nr este:"<<nr1.get_real()<<"+"<<nr1.get_imag()<<"i";//af
isare
cout<<"\nPrimul nr este:"<<nr2.get_real()<<"+"<<nr2.get_imag()<<"i\n";
}
Constructori, Destructori, Tablouri de obiecte.
Teme:
1. Modificati exemplul 3 astfel încât sa permita adunarea a doua astfel de puncte. N
umele noului
punct va fi rezultat prin concatenarea numelor celor doua puncte.
//program care face operatii cu obiectele unei clase
//adunarea a doua obiecte din clasa prin adunarea coordonatelor si concatenarea
numelor obiectelor
#include<iostream>
using namespace std;
#include<string.h>
#include<stdio.h>
class CPunctText
{
private:
int x;
int y;
int lungime_sir;
char *sNume;
public:
CPunctText();//constructori
CPunctText(int ix, int iy, char *sText="Punct");
CPunctText(CPunctText &pct);//constructor de copiere
~CPunctText();//destructor
public:
void Afis()
{
cout<<"\nObiectul are x="<<x;
cout<<"\nObiectul are y="<<y;
cout<<"\nObiectul are sirul="<<sNume;
}
CPunctText Suma(CPunctText c2)//metoda de adunare
{
CPunctText c3;
c3.x=x+c2.x;//adunare pentru variabila x
c3.y=y+c2.y;//adunare pentru variabila y
c3.sNume=strcat(sNume,c2.sNume);//concatenare pentru variabila s
Nume
return c3;
}
};
CPunctText::CPunctText()
{
cout<<"\n constructor standard";
lungime_sir=20;
sNume=new char[2*lungime_sir];
}
CPunctText::CPunctText(int ix, int iy, char *sText)
{
cout<<"\n constructor de initiere";
lungime_sir=strlen(sText)+1;
sNume=new char[2*lungime_sir];
x=ix;
y=iy;
strcpy(sNume,sText);
}
CPunctText::CPunctText(CPunctText &pct)//constructor de copiere
{
cout<<"\n constructor de copiere";
sNume=new char[pct.lungime_sir+1];
x=pct.x;
y=pct.y;
lungime_sir=pct.lungime_sir+1;
strcpy(sNume, pct.sNume);
}
CPunctText::~CPunctText()
{
cout<<"\n destructor";
}
void main(void)
{
CPunctText cpt1(1,2,"Punct1");
CPunctText cpt2(cpt1);
CPunctText cpt3=cpt1;
CPunctText cpt4(4,5);
CPunctText cpt5(cpt1.Suma(cpt4));//obiectul obtinut din adunarea obiectu
lui cpt1 cu cpt4
cpt1.Afis();//afisarea obiectelor
cpt2.Afis();
cpt3.Afis();
cpt4.Afis();
cpt5.Afis();//afisarea obiectului obtinut prin adunarea cpt1 si cpt4
}
2. Sa se scrie o aplicatie C/C++ în care modeleze obiectual un sir de numere reale
. Creati doua
instante ale clasei create având aceeasi lungime n si notati rezultatul adunarii e
lement cu
element într-un al treilea sir.
void main(void)
{
int n,i,c[3];
char a[10],b[10];
cout<<"Dati numarul de studenti:\t";
cin>>n;
Student* sirStud=new Student[n];
for(i=0;i<n;i++)
{
cout<<"\nDati numele studentului\t";
cin>>a;
cout<<"\nDati prenumele studentului\t";
cin>>b;
cout<<"\nDati notele studentului(3):\t";
for(int j=0;j<3;j++)
{
cout<<"\nDati nota "<<j<<" : \t";
cin>>c[j];
}
sirStud[i]=Student(a,b,c[0],c[1],c[2]);//construirea obiectului
cu ajutorul constructorului cu parametrii
}
cout<<sirStud[0].getNume()<<" "<<sirStud[1].getNume();
for(i=0; i<n; i++)//afisarea sirului de studenti nesortat
cout<<sirStud[i].getNume()<<" "<<sirStud[i].getMedia()<<"\n";
Sort(sirStud,n);//apelarea functiei de sortare
cout<<"dupa sort\n";
for(i=0; i<n; i++)
cout<<sirStud[i].getNume()<<" "<<sirStud[i].getMedia()<<"\n";
cout<<"Primii trei studenti:\n";//afisarea primilor trei studenti
for(int j=0;j<3;j++)
cout<<sirStud[j].getNume()<<" "<<sirStud[j].getMedia()<<"\n";
}
}
Mostenirea simpla.Mostenirea multipla.
Teme:
1. În cazul exemplului 4 care exemplifica mostenirea simpla, cu clasa de baza Pozi
tie si derivata
Punct, se cer urmatoarele:
a. urmariti si verificati ordinea de apel pentru constructori/destructori
b. extindeti functia main() pentru a utiliza toate metodele din clasa de baza si
din clasa
derivata
c. introduceti o noua clasa "cerc" (date si metode), derivata din clasa "pozitie
"
d. scrieti un program ce utilizeaza aceste clase.
#include<stdio.h>
#include<iostream>
using namespace std;
class Pozitie
{
protected:
int x,y;
public:
Pozitie(int =0, int =0);
Pozitie(Pozitie &);
void afisare();
void deplasare(int , int);
};
Pozitie::Pozitie(int abs, int ord)
{
x=abs;y=ord;
cout<<"Construct \"Pozitie\",";
afisare();
}
Pozitie::Pozitie(Pozitie &p)
{
x=p.x;
y=p.y;
cout<<"construct copy\"Pozitie\",";
afisare();
}
void Pozitie::afisare()
{
cout<<"coordonate::x="<<x<<",y-grec egal"<<y<<"\n";
}
void Pozitie::deplasare(int dx, int dy)
{
x+=dx;
y+=dy;
}
class Punct:public Pozitie
{
int vizibil;
char culoare;
public:
Punct(int=0,int=0,char='A');
Punct(Punct &);
~Punct();
void arata()
{
vizibil=1;}
void ascunde()
{
vizibil=0;}
void coloreaza(char c)
{
culoare=c;}
void deplasare(int , int);
void afisare();
};
Punct::Punct(int abs, int ord, char c):Pozitie(abs, ord)
{
vizibil=0;
culoare=c;
cout<<"constructor\"Punct\",";afisare();}
Punct::Punct(Punct &p):Pozitie(p.x, p.y)
{ vizibil=p.vizibil;
culoare=p.culoare;
cout<<"Construtor de copiere\"Punct\",";
afisare();
}
Punct::~Punct()
{
cout<<"Destructor\"Punct\",";
afisare();
}
void Punct::afisare()
{cout<<"Pozitie: x="<<x<<",y="<<y;
cout<<",culoare:"<<culoare;
if (vizibil)
cout<<",vizibil\n";
else cout<<",invizibil\n";
}
void Punct::deplasare(int dx , int dy)
{
if (vizibil){
cout<<"Deplasare:";
afisare();
}
x+=dx;
y+=dy;
if(vizibil)
{
cout<<"ia coordonatele:";
Pozitie::afisare();
}
}
//-----------------------------
class Cerc:public Pozitie //clasa mostenitoare
{
int raza;
public:
Cerc(int x, int y, int r):Pozitie(x,y)//metoda proprie clasei
{
cout<<"constructor din Cerc";
raza=r;
}
void afisarec()
{
cout<<"\n\ncercul cu centrul in (x,y) si raza r este : \n";
cout<<x<<" "<<y<<" "<<raza;
}
void aria()
{
cout<<"\naria cercului creat este "<<(float)(3.1416*raza*raza)<<"\n";
}
void lungimea_cercului()
{
cout<<"lungimea cercului este "<<(float)(2*3.1416*raza);
}
};
4. Definiti o clasa numita Triangle care are o functie care calculeaza perimetru
l unui triunghi ale
carui laturi sunt trimise ca parametri si apoi o clasa Triangle_extended, care, în
plus,
calculeaza si aria triunghiului.
5. Adaugati în clasa derivata din exemplul anterior o metoda care calculeaza înaltim
ea
triunghiului.
R:(pr.4,5):
//program care calculeaza aria si perimetrul unui triunghi
//folosind mostenirea
#include<iostream>
#include<math.h>
using namespace std;
class Triangle//clasa baza in care se calculeaza perimetru
{
protected:
int a,b,c;
public:
Triangle()
{
a=0;b=0;c=0;
}
void Set(int x, int y, int z)
{
a=x;b=y,c=z;
}
void Perimetru()
{
cout<<"\n Perimetrul triunghiului este:\t"<<a+b+c;
}
};
class Triangle_extended : public Triangle//clasa derivata in care se calculeaza
aria si inaltimea
{
double rez;
public:
void Aria()//calculez aria cu formula lui Heron
{
rez=((a+b+c)/2) * (((a+b+c)/2)-a) * (((a+b+c)/2)-b) * (((a+b+c)/
2)-c);
cout<<"\n Aria triunghiului este:\t"<<sqrt((double)rez);
}
void Inaltime()//calculez inaltimea din arie
{
float h;
h=(sqrt(rez) * 2) /a;
cout<<"\n Inaltimea triunghiului perpendiculara pe a este:\t"<<h
;
}
};
void main(void)
{
Triangle t1;
t1.Set(3,4,5);
t1.Perimetru();
Triangle_extended t2;
t2.Set(3,4,5);
t2.Aria();
t2.Inaltime();
cout<<endl;
}
6. Definiti o clasa numita Aria care calculeaza aria unei figuri geometrice (la
alegere) si o alta
clasa Perimetru care calculeaza perimetrul aceluiasi tip de figura geometrica. S
e defineste apoi
o alta clasa care le mosteneste pe primele doua clase create, si prin intermediu
l unei functii
proprii de preluare a variabilelor necesare, calculeaza aria si perimetrul figur
ii date.