Sunteți pe pagina 1din 21

Clase, obiecte, membri, accesul la membri.

1. Sa se scrie o aplicatie C/C++ care foloseste o structura de date cu numele Ce


rc care contine
raza ca si o variabila de tip întreg. Într-un program C/C++, declarati doua variabil
e c1, c2 de
tip Cerc si calculati aria si circumferinta lor pentru valori ale razei introdus
e de la tastatura cu
doua metode definite. Aceleasi cerinte vor fi implementate într-o aplicatie folosi
nd o clasa
numita Cerc cu atributul raza privat, clasa ce va contine pe lânga metodele de cal
cul ale ariei
si perimetrului un constructor explicit cu parametru, un destructor si o metoda
de afisare raza.
Extindeti aplicatia astfel încât sa definiti mai multe obiecte de tip Cerc la care s
a accesati
metodele specifice folosind obiectele instantiate, pointeri la obiecte, referint
e la obiecte.
R-program 1:
#include<iostream>
#include<stdio.h>
#define pi 3.1415
using namespace std;
float get_aria(int);//functie care va afisa aria cercului
float get_lung(int);//functie care va afisa circumferinta cercului
void set_raza(int);//functie care va seta valoarea razei
struct Cerc//declaram structura
{
int raza;
};
float get_aria(int r)//arie
{
return (float)pi*r*r;
}
float get_lung(int r)//circumferinta
{
return (float)2*pi*r;
}
void main(void)
{
Cerc c1,c2;//variabile care vor deveni raze
cout<<"Dati raza pentru cercul 1:\t";//operatii pe cercul 1
cin>>c1.raza;
cout<<"Aria cercului 1 este :\t"<<get_aria(c1.raza)<<"\n";
cout<<"Circumferinta cercului 1 este :"<<get_lung(c1.raza)<<"\n";
cout<<"Dati raza pentru cercul 2 :\t";//operatii pe cercul 2
cin>>c2.raza;
cout<<"Aria cercului 2 este :\t"<<get_aria(c2.raza)<<"\n";
cout<<"Circumferinta cercului 2 este :"<<get_lung(c2.raza)<<"\n";
}
R- programul 2:
//program care utilizeaza o clasa de tip Cerc definita prin raza si face operati
i pe aceasta
#include<iostream>
#include<stdio.h>
#define pi 3.1415
using namespace std;
class Cerc//declaram clasa
{
int r;
public:
Cerc(int x=1);//constructor cu parametru
float get_aria(void);//functie care va afisa aria cercului
float get_lung(void);//functie care va afisa circumferinta cercului
void set_raza(int);//functie care va seta valoarea razei
~Cerc(void);//destructor
};
Cerc::Cerc(int x)
{
cout<<"Constructor cu valoare implicita (raza =1)\n";
r=x;
}

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";

cout<<"Dati raza pentru cercul 2 :\t";//operatii pe cercul 2


cin>>r2;
c2.set_raza(r2);
cout<<"Aria cercului 2 este :\t"<<c2.get_aria()<<"\n";
cout<<"Circumferinta cercului 2 este :"<<c2.get_lung()<<"\n";

cout<<"Dati raza pentru cercul 1 pentru pointer :\t";//operatii pe cerc


ul 3 definit prin pointer
cin>>r3;
c3=&c1;
c3->set_raza(r3);
cout<<"Aria cercului 3 este :\t"<<c3->get_aria()<<"\n";
cout<<"Circumferinta cercului 3 este :"<<c3->get_lung()<<"\n";
cout<<"Dati raza pentru cercul 2 cu referinta :\t";//operatii pe cercul
2
cin>>r4;
c4.set_raza(r4);
cout<<"Aria cercului 2 este :\t"<<c4.get_aria()<<"\n";
cout<<"Circumferinta cercului 2 este :"<<c4.get_lung()<<"\n";
}
2.Sa se defineasca o clasa numita String (într-un fisier numit strClass.h) care sa
fie compusa din
functiile specifice care efectueaza urmatoarele operatii pe siruri de caractere:
- determina lungimea sirului primit pe intrare;
- determina ultima pozitie de aparitie a unui anumit caracter din sirul de intra
re;
- returneaza sirul primit pe intrare, scris cu caractere majuscule;
- returneaza sirul primit pe intrare, scris cu caractere minuscule;
- returneaza numarul de aparitii ale unui anumit caracter din sirul primit;

#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.

//program care face operatii pe o clasa Suma


#include<iostream>
#include<stdio.h>
using namespace std;
class Suma//declararea clasei
{
int s1;
int s2;
public:
void set_val(int x=0, int y=0);//metode
int get_val(void);
};
void Suma::set_val(int x, int y)
{
s1=x;
s2=y;
}
int Suma::get_val(void)
{
return s1+s2;
}

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.

//program care modeleaza obiectual un sir de numere reale si face operatii cu el


#include<iostream>
using namespace std;
#include<stdio.h>

class Sir //clasa de siruri


{
int lung;
float* s;
public:
Sir()//constructor
{
lung=20; s=new float[lung];
}
Sir(int lungime) //constructor cu parametrii
{ lung=lungime;
s=new float[lung];
}
Sir(Sir &ss) //constructor de copiere
{ lung=ss.lung;
s=new float[ss.lung];
for(int i=0; i<lung; i++)
s[i]=ss.s[i];
}
Sir& Suma(Sir t) //constructor pentru suma sirurilor
{
for(int i=0; i<lung; i++)
s[i]=s[i]+t.s[i];
return *this;//rezulat=s.Suma(t)
}
void Cit()//metoda de citire
{ for(int i=0; i<lung; i++){
cout<<"elementul "<<i<<"= ";
cin>>s[i];
}
}
void Afis()//metoda de afisare
{ for(int j=0; j<lung; j++)
cout<<s[j]<<" ";
cout<<"\n";
}
};
void main(void)
{
int n;
cout<<"Dati lungimea sirurilor: "; cin>>n;
cout<<"Se citeste primul sir:\n";
Sir s1(n); s1.Cit();
cout<<"Primul sir este:\n"; s1.Afis();
cout<<"Se citeste al doilea sir:\n";
Sir s2(n); s2.Cit();
cout<<"AL doilea sir este: \n"; s2.Afis();
cout<<"Se formeaza sirul suma\n";
Sir s3(n);
s3=s1.Suma(s2);
cout<<"Suma celor doua siruri este: \n"; s3.Afis();
}

3. Sa se scrie o aplicatie înare se modeleaza clasa Student cu nume, prenume si no


tele din
sesiunea din iarna. Sa se afiseze numele primilor trei studenti din grupa în ordin
ea mediilor.

//program care modeleaza o clasa de studenti si afisaza primii trei studenti


//in ordinea mediilor
#include <iostream>
using namespace std;
#include <string>
class Student //clasa studenti
{
char* nume;
char* prenume;
int nota1,nota2,nota3;
public:
Student()//constructor implicit
{
nume="0"; prenume="0"; nota1=0; nota2=0; nota3=0;
}
Student(char* n, char * p, int n1, int n2, int n3)//constructor explicit
{
nume=n; prenume=p; nota1=n1; nota2=n2; nota3=n3;
}
char* getNume() //metoda de citire a numelui
{
return nume;
}
float getMedia()//metada care calculeaza media
{
return (float)(nota1+nota2+nota3)/3;
}
};
void Sort(Student* s,int n)//functie de sortare
{
Student aux;
int sortat;
do{
sortat=1;
for(int i=0; i<n-1; i++)
if (s[i].getMedia()<s[i+1].getMedia())//va sorta in ord
ine descrescatoare
{ aux=s[i]; s[i]=s[i+1]; s[i+1]=aux; sortat=0;
}
}
while(sortat==0);
}

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";
}

4. Sa se scrie o aplicatie C/C++ în care se citeste de la tastatura un punct prin


coordonatele x,y,z.
Sa se scrie o metoda prin care sa se faca translatia punctului cu o anumita dist
anta pe fiecare
dintre cele trei axe. Sa se verifice daca dreapta care uneste primul punct si ce
l rezultat în urma
translatiei trec printr-un al treilea punct dat de la consola.
//program care modeleaza o clasa de puncte si face operatii de translatie
#include <iostream>
using namespace std;
class Punct{//clasa
int x,y,z;
public:
Punct() //constructor
{ x=0; y=0; z=0; }
Punct(int x0, int y0, int z0)//constructor cu parametrii
{ x=x0; y=y0; z=z0; }
Punct& Translat(int d)//metoda de translatare
{ x=x+d; y=y+d; z=z+d;
return *this;
}
void Afis()//metada de afisare
{
cout<<x<<" "<<y<<" "<<z<<"\n";
}
int Apart(Punct A, Punct B)//metoda de verificare
{
if ((x-A.x)*(B.y-A.y)==(y-A.y)*(B.x-A.x)&&(x-A.x)*(B.z-A.z)==(z-
A.z)*(B.x-A.x)) return 1;
return 0;
}
};
void main()
{
int d,x,y,z;
cout<<"Pentru primul punct:\n";
cout<<"Dati prima coordonata:\t";
cin>>x;
cout<<"Dati a doua coordonata:\t";
cin>>y;
cout<<"Dati a treia coordonata:\t";
cin>>z;
Punct A(x,y,z);
cout<<"Pentru punct al doilea:\n";
cout<<"Dati prima coordonata:\t";
cin>>x;
cout<<"Dati a doua coordonata:\t";
cin>>y;
cout<<"Dati a treia coordonata:\t";
cin>>z;
Punct B(x,y,z);
cout<<"Dati distanta de translatare\n";
cin>>d;
Punct O=B.Translat(d);
cout<<"Pentru punctul translatat ";
cout<<"O="; O.Afis();
if (O.Apart(A,B)==1) cout<<"O apartine!\n";
cout<<"Dati coordonatele celui de al treilea punct\n";
cout<<"Dati prima coordonata:\t";
cin>>x;
cout<<"Dati a doua coordonata:\t";
cin>>y;
cout<<"Dati a treia coordonata:\t";
cin>>z;
Punct C(x,y,z);
if (C.Apart(A,B)==1) cout<<"C apartine!\n";
else cout<<"C nu apartine!\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);
}
};

void main (void)


{
Cerc ob7(2,3,4);
ob7.afisarec();
ob7.aria();
ob7.lungimea_cercului();
ob7.deplasare(10,10);
ob7.afisarec();
}

2. Implementati programul prezentat în exemplul 1 si examinati erorile date la com


pilare.
Modificati programul astfel încât sa se poata accesa din functia main, prin intermed
iul
obiectului obiect_derivat, si functiile aduna si scade.

//program care opereaza pe clase derivate


#include <iostream>
using namespace std;
class Baza{//clasa de baza
int i, j;
public:
void aduna(int a, int b)
{
i = a+ b;
}
void scade(int a, int b)
{
j = a - b;
}
void afiseaza_baza()
{
cout << i << " " << j << "\n";
}
};
class Derivata : public Baza//clasa derivata (mosteneste clasa baza)
{
int m;
public:
void inmulteste(int a,int b)
{
m = a * b;
}
void afiseaza_derivat()
{
cout << m << "\n";
}
};
void main(void)
{
Derivata obiect_derivat;
obiect_derivat.inmulteste(5, 6); // nici o problema
obiect_derivat.afiseaza_derivat(); // afisarea rezultatului inmultirii
obiect_derivat.aduna(100, 200);//metodele sunt publice deci este permis
obiect_derivat.scade(200, 100);
obiect_derivat.afiseaza_baza();
}

3. Sa se implementeze o clasa de baza cu doua variabile de tip întreg care contine


o functie care
preia de la tastatura doua numere întregi si o functie care afiseaza pe ecran un înt
reg trimis ca
parametru. Sa se scrie o prima clasa derivata din aceasta care implementeaza ope
ratiile
matematice elementare: +, -, *, / asupra variabilelor din clasa. Sa se scrie o a
III-a clasa,
derivata din cea de-a doua, care implementeaza în plus functiile de extragere a ra
dacinii
patrate dintr-un numar trimis ca parametru si de ridicare la putere (atât baza cât s
i puterea sunt
trimisi ca parametri).

//program care face operatii cu clase derivate(mostenite)


#include<iostream>
#include<math.h>
using namespace std;
class Baza//clasa baza in care se definesc parapetrii
{
protected:
int x,y;
public:
Baza()//constructor
{
cout<<"\n Dati primul numar\t";
cin>>x;
cout<<"\n Dati al doilea numar\t";
cin>>y;
}
void afis_baza(void)//metoda de afisare a unui parametru
{
cout<<"\n Primul parametru este:\t"<<x;
}
};
class Derivat1 : public Baza//prima clasa derivata
{
public:
void adunare(void)//metode
{
cout<<"\n Suma celor doua elemente este:\t"<<x+y;
}
void scade(void)
{
cout<<"\n Diferenta celor doua elemente este:\t"<<x-y;
}
void inmultire(void)
{
cout<<"\n Produsul celor doua elemente este:\t"<<x*y;
}
void impartire(void)
{
cout<<"\n Catul celor doua elemente este:\t"<<x/y;
}
};
class Derivat2 : public Derivat1//a doua clasa derivata
{
public:
void radacina(void)
{
cout<<"\n Radacina patrata a primului element este:\t"<<sqrt((do
uble)x);
}
void putere(void)
{
int rez=1;
for(int i=0;i<y;i++)
rez*=x;
cout<<"\n Primul element la puterea celui de al doilea este:\t"<
<rez;
}
};
void main(void)
{
Derivat1 ob1;//obiect din prima clasa derivata
ob1.afis_baza();
ob1.adunare();
ob1.scade();
ob1.inmultire();
ob1.impartire();
Derivat2 ob2;//obiect din a doua clasa derivata
ob2.radacina();
ob2.putere();
}

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.

//program care foloseste doua clase mostenite in a treia


#include<iostream>
#include<math.h>
using namespace std;
class Aria//prima clasa
{
public:
int a;
void aria(int x, int y)//calculul ariei unui dreptunghi
{
a=x * y;
}
};
class Perimetru//a doua clasa
{
public:
int p;
void perimetru(int x, int y)//calculul perimetrului unui dreptunghi
{
p= 2*x+2*y;
}
};
class Date : public Aria,public Perimetru//clasa mostenitoare
{
int m,n;
public:
Date(int a, int b)
{
m=a;n=b;
}
void arata(void)
{
cout<<"\nAria dreptunghiului este:"<<a;
cout<<"\nPerimetrul dreptunghiului este:"<<p;
}
};
void main(void)
{
int m,n;
cout<<"\n Dati lungimea dreptunghiului:\t";
cin>>m;
cout<<"\n Dati latimea dreptungiului:\t";
cin>>n;
Date ob1(m,n);
ob1.aria(m,m);
ob1.perimetru(m,n);
ob1.arata();
}

S-ar putea să vă placă și