Sunteți pe pagina 1din 9

#include<iostream>

#include<string>
#include<fstream>

using namespace std;

class ReviziiAuto
{
const int codRep;
string model;
int pieseSchimbate;
float* pretPiese;
static int nrReparatii;

public:
ReviziiAuto() :codRep(100)
{
this->model = "Ford";
this->pieseSchimbate = 0;
this->pretPiese = NULL;
this->nrReparatii = 0;
}

~ReviziiAuto()
{
if (this->pretPiese != NULL)
{
delete[]this->pretPiese;
}
this->nrReparatii--;
}

ReviziiAuto(int piese, float*pret, string model, int cod) : codRep(cod)


{
this->pieseSchimbate = piese;
if (this->pretPiese != NULL)
{
delete[]this->pretPiese;
}
this->pretPiese = new float[this->pieseSchimbate];
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i] = pret[i];
}
if (model.length() > 0)
{
this->model = model;
}
else this->model = "BMW";
this->nrReparatii++;
}

ReviziiAuto(const ReviziiAuto & r) : codRep(r.codRep)


{
this->pieseSchimbate = r.pieseSchimbate;
this->pretPiese = new float[this->pieseSchimbate];
for (int i = 0; i < r.pieseSchimbate; i++)
{
this->pretPiese[i] = r.pretPiese[i];
}
this->model = r.model;
this->nrReparatii++;
}
ReviziiAuto& operator=(const ReviziiAuto & r)
{
this->pieseSchimbate = r.pieseSchimbate;
if (this->pretPiese != NULL)
{
delete[]this->pretPiese;
}
this->pretPiese = new float[r.pieseSchimbate];
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i] = r.pretPiese[i];
}
this->model = r.model;
this->nrReparatii++;
return *this;
}
//getteri
string getModel()
{
return this->model;
}
int getPieseSchimbate()
{
return this->pieseSchimbate;
}
float* getPretPiese()
{
return this->pretPiese;
}
//setteri
void setModel(string model)
{
if (model.length() > 0)
{
this->model = model;
}
}
void setPieseSchimbate(int pieseSchimbate)
{
this->pieseSchimbate = pieseSchimbate;
}
void setPret(float*pretPiese)
{
if (this->pretPiese != NULL)
{
delete[]this->pretPiese;
}
this->pretPiese = new float[this->pieseSchimbate];
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i] = pretPiese[i];
}
}

//operatori
//operator++ preincrementare
/*ReviziiAuto operator++()
{
this->pieseSchimbate++;
}*/
ReviziiAuto operator++()
{
ReviziiAuto temporar = *this;
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i]++;
}
return *this;
}
//operator++ postincrementare
ReviziiAuto operator++(int)
{
float* temp = new float[this->pieseSchimbate]; //creez un nou obiect
for (int i = 0; i < this->pieseSchimbate; i++)
{
temp[i] = this->pretPiese[i]; //adaug in el elementele obiectului
vechi
}
if (this->pretPiese != NULL)
{
delete[]this->pretPiese; //sterg obiectul vechi
}
this->pieseSchimbate++; //cresc marimea vectorului temporar cu un
spatiu
this->pretPiese = new float[this->pieseSchimbate]; //realoc spatiu
pentru vectorul nou, cu un spatiu in plus
for (int i = 0; i < pieseSchimbate - 1; i++)
{
this->pretPiese[i] = temp[i]; //adaug elementele din obiectul
temporar
}
this->pretPiese[this->pieseSchimbate-1] = 50; //adaug un pret pe noul
spatiu format
return *this; //pentru ca l-am supraincarcat
}

//operator+ //adun 2 obiecte


ReviziiAuto operator+(const ReviziiAuto& r)
{
ReviziiAuto temp = *this;
temp.pieseSchimbate += r.pieseSchimbate;
delete[]temp.pretPiese;
temp.pretPiese = new float[temp.pieseSchimbate];
for (int i = 0; i < temp.pieseSchimbate; i++)
{
temp.pretPiese[i] = r.pretPiese[i];
}
for (int i = this->pieseSchimbate; i < temp.pieseSchimbate; i++)
{
temp.pretPiese[i] = r.pretPiese[i - this->pieseSchimbate];
}
return temp;
}
//operator+= //adaug o valoare la fiecare pret in parte
ReviziiAuto operator+=(float val)
{
ReviziiAuto temporar = *this;
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i] +=val;
}
return temporar;

//operator/=
ReviziiAuto operator/=(float val)
{
ReviziiAuto temporar = *this;
if (val != NULL && val != 0)
{
for (int i = 0; i < this->pieseSchimbate; i++)
{
this->pretPiese[i] /= val;
}
}
return temporar;
}

//operator -- postincrementare
ReviziiAuto operator--(int)
{
float*temp = new float[this->pieseSchimbate];
for (int i = 0; i < pieseSchimbate; i++)
{
temp[i] = this->pretPiese[i];
}
if (this->pretPiese != NULL)
{
delete[] this->pretPiese;
}
this->pieseSchimbate--;
this->pretPiese = new float[this->pieseSchimbate];
for (int i = 0; i <this->pieseSchimbate; i++)
{
this->pretPiese[i] = temp[i];
}
delete[]temp;
return *this;
}

//operator>
bool operator>(ReviziiAuto &r)
{
if (this->pieseSchimbate > r.pieseSchimbate)
return true;
else
return false;
}
//operator !
bool operator ! ()
{
if (this->pretPiese != NULL)
return true;
else
return false;
}

//operator ==
bool operator==(ReviziiAuto &r)
{
if (this->pieseSchimbate == r.pieseSchimbate)
return true;
else
return false;
}

friend ostream& operator<<(ostream& out, ReviziiAuto&r)


{
out << "Piese schimbate: " << r.pieseSchimbate << endl;
for (int i = 0; i < r.pieseSchimbate; i++)
{
out << "Pret piese: " << r.pretPiese[i] << endl;
}
out << "Model: " << r.model << endl;
out << "Numar de reparatii: " << r.nrReparatii << endl;
out << "Cod reparatie: " << r.codRep << endl;
return out;
}

/*friend istream& operator>>(istream&in, ReviziiAuto &r)


{
cout << "Piese schimbate: " ;
in >> r.pieseSchimbate;
if (r.pretPiese != NULL)
{
delete[]r.pretPiese;
}
r.pretPiese = new float[r.pieseSchimbate];
for (int i = 0; i < r.pieseSchimbate; i++)
{
cout << "Pret piese: ";
in>> r.pretPiese[i] ;
}
cout << "Model: ";
in >> r.model;
cout << "Numar de reparatii: ";
in>> r.nrReparatii ;
return in;
}*/

//fisiere
friend ofstream& operator<<(ofstream& out, ReviziiAuto&r)
{
out << r.pieseSchimbate << endl;
for (int i = 0; i < r.pieseSchimbate; i++)
{
out << r.pretPiese[i] << endl;
}
out << r.model << endl;
out << r.nrReparatii << endl;
return out;
}

friend ifstream& operator>>(ifstream& in, ReviziiAuto &r)


{
in >> r.pieseSchimbate;
r.pretPiese = new float[r.pieseSchimbate];
for (int i = 0; i < r.pieseSchimbate; i++)
{
in >> r.pretPiese[i];
}
in >> r.model;
in >> r.nrReparatii;
return in;
}

float calcularePretTotal()
{
float s = 0;
for (int i = 0; i < this->pieseSchimbate; i++)
{
s = s + this->pretPiese[i];
}
return s;
}

//cast
explicit operator float()
{
return calcularePretTotal();
}

explicit operator int()


{
return this->pieseSchimbate;
}

//index
float& operator[](int index)
{
if (index >= 0 && index <= this->pieseSchimbate)
return this->pretPiese[index];
else
throw "Index incorect.";
}
//operator()
float operator()()
{
return pretMediu();
}

float pretMediu()
{
float m = 0;
for (int i = 0; i < this->pieseSchimbate; i++)
{
m = this->pretPiese[i] / i;
}
return m;
}

float pretMax()
{
float max = 0;
if (this->pretPiese != NULL)
{
for (int i = 0; i < this->pieseSchimbate; i++)
{
if (pretPiese[i] > max)
max = pretPiese[i];
}
}
return max;
}

float pretMin()
{
float min=pretPiese[0];
if (this->pretPiese != NULL)
{
for (int i = 0; i < this->pieseSchimbate; i++)
{
if (pretPiese[i] < min)
min = pretPiese[i];
}
}
return min;
}

float* sortare()
{
float sort;
if (this->pretPiese != NULL)
{
for (int i = 0; i < this->pieseSchimbate - 1; i++)
for (int j = 1; j < this->pieseSchimbate; j++)
{
if (pretPiese[i] > pretPiese[j])
{
sort = pretPiese[i];
pretPiese[i] = pretPiese[j];
pretPiese[j] = sort;
}
}
}
return this->pretPiese;
}
};

int ReviziiAuto::nrReparatii = 0;

void main()
{
ReviziiAuto r1;
float preturi1[] = { 10.5, 25.5, 20.5 };
ReviziiAuto r2(3, preturi1, "Mercedes", 100);
ReviziiAuto r3 = r2;
ReviziiAuto r4;
r4 = r2;
cout << "Revizia 1: \n " << r1 << endl;
cout << "Reviziza 2:\n " << r2 << endl;
cout << "Reviziza 3: \n" << r3 << endl;
cout << "Revizia 4: \n" << r4 << endl;

/*ReviziiAuto p5;
cin >> p5;
cout << p5;*/

//fisiere text
ofstream f;
f.open("Fisier.txt", ios::out);
ReviziiAuto r6(3, preturi1, "Lexus", 200);
f << r6 << endl;
f.close();

ifstream g;
g.open("Fisier.txt", ios::in);
ReviziiAuto r7;
g >> r7;
g.close();
cout << "Preluare din fisier text: \n" << r7;

//fisiere binare
ofstream fBin;
fBin.open("Fisier1.dat", ios::binary | ios::out);
fBin.write((char*)&r6, sizeof(ReviziiAuto));
fBin.close();

ifstream fBin1;
fBin1.open("Fisier1.dat", ios::binary | ios::in);
fBin1.read((char*)&r6, sizeof(ReviziiAuto));
fBin1.close();
cout << "\nPreluare din fisier binar: \n" << r6;

//operatori
ReviziiAuto r8=r6++;
cout << "Revizia 8 postincrementare: " << r8;
ReviziiAuto r9 = ++r6;
cout << "\n\nRevizia 9 preincrementare: " << r9;
ReviziiAuto r10 = r6--;
cout << "\n\nRevizia 10 postincrrementare --: " << r10;

ReviziiAuto r11;
r11 = r6 + r2;
cout << "\n\nRevizia 11: " << r11 << endl;

if (r1 > r6)


cout << "\nRevizia 1 are mai multe piese schimbate.\n";
else
cout << "\nRevizia 6 are mai multe piese schimbate.\n";
if (!r6)
cout << "\nExista preturi.";
else
cout << "\nNu exista preturi.";

if (r1 == r6)
cout << "\n Au numar egal de piese schimbate.";
else
cout << "\nNu au numar egal de piese schimbate;";

//cast
cout <<"\nPret total: "<< (float)r6 << endl;
cout << "\nPiese schimbate: " << (int)r6 << endl;

//index
try
{
cout << "Pretul de pe pozitia index este: " << r6[5];
cout << "Pretul de pe pozitia index este: " << r6[2];
}
catch (exception *ex)
{
cout << ex->what() << "Am prin eroarea." << endl;
}
catch (...)
{
cout << "Am prins eroarea din a 2-a incercare." << endl;
}

//operator() ->functie
cout << "\nPret mediu: " << r6.pretMediu() << endl;

//metode generice
cout << "\nPretul maxim este: " << r6.pretMax() << endl;
cout << "\nPretul minim este: " << r6.pretMin() << endl;
r6.sortare();
cout << "\nRevizia 6 sortata: " << r6 << endl;

//operatori
r6 += 20;
cout << "\nRevizia 6 marita: " << r6 << endl;

r6 /= 2;
cout << "\nRevizia 6 impartita: " << r6 << endl;
}

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