Cod Final - CPP
Cod Final - CPP
#include<iostream>
#include<string>
using namespace std;
//ce este o clasa? --- este o structura de date ce incorporeaza date si functii(metode)
//ce inseamna const? --- un atribut de tip constant(Const) nu-si modifica valoarea pe parcursul
rularii programului
//ce inseamna static? --- un atribut de tip static apartine intregii clasei(adica va avea aceeasi
valoare pentru orice obiect creat)
//exemplu pentru static --- TVA
public:
//getteri --- functii accesor care permit citirea unei valori dintr-un atribut
//cum se construieste un getter:
//sablon getter
/*
tipVariabila getNumeVariabila()
{
return this->variabila;
}
*/
const int getIdExamen()
{
return this->idExamen;
}
char* getMaterie()
{
return this->materie;
}
string getProfesor()
{
return this->profesor;
int* getData()
{
return this->data;
}
int getNota()
{
return this->nota;
}
int getNrSubiecte()
{
return this->nrSubiecte;
}
float* getPunctajeSubiecte()
{
return this->punctajeSubiecte;
}
}
void setProfesor(string profesor)
{
if ([Link]() > 2)
{
this->profesor = profesor;
}
else throw exception();
}
void setNota(int nota)
{
if (nota > 0 && nota <= 10)
{
this->nota = nota;
}
void setData(int data[3])
{
if (data[0] >= 1 && data[0] <= 31 && data[1]>=1 && data[1]<=12 &&
data[2]>=2010&&data[2]<=2021)
{
this->data[0] = data[0];
this->data[1] = data[1];
this->data[2] = data[2];
}
}
//ASA NU!
//void setNrSubiecte(int nrSubiecte)
//ASA DA!
void setPunctajeSubiecte(int nrSubiecte, float*punctajeSubiecte)
{
if (nrSubiecte > 0 && punctajeSubiecte != NULL)
{
if (this->punctajeSubiecte != NULL)
{
delete[]this->punctajeSubiecte;
}
this->nrSubiecte = nrSubiecte;
this->punctajeSubiecte = new float[this->nrSubiecte];
for (int i = 0; i < this->nrSubiecte; i++)
{
if (punctajeSubiecte[i] > 0)
{
this->punctajeSubiecte[i] = punctajeSubiecte[i];
}
else
{
this->punctajeSubiecte[i] = 0;
}
}
}
//constructor de copiere --- se apeleaza atunci cand dorim/vrem sa cream un obiect nou
pe baza altuia deja existent
//constructorul de copiere seamana cu constructorul cu toti parametrii
Examen(const Examen& e):idExamen([Link])
{
//pentru char* si string dam un mesaj
this->materie = new char[strlen([Link]) + 1];//+1 vine de la terminatorul '\0'
strcpy(this->materie, [Link]);
this->profesor = [Link];
this->nota = [Link];
this->data[0] = [Link][0];
this->data[1] = [Link][1];
this->data[2] = [Link][2];
this->nrSubiecte = [Link];
this->punctajeSubiecte = new float[this->nrSubiecte];
for (int i = 0; i < this->nrSubiecte; i++)
{
this->punctajeSubiecte[i] = [Link][i];
}
}
//destructorul -- rolul lui este sa dezaloce memoria din zona HEAP(zona de memorie
artibuita programatorului)
~Examen()
{
if (this->materie != NULL)
{
delete[]this->materie;
}
if (this->punctajeSubiecte != NULL)
{
delete[]this->punctajeSubiecte;
}
}
//operator = ---- se apeleaza atunci cand avem doua obiecte deja existente si vrem sa ii
atribuim unui obiect valorile celuilalt
Examen& operator=(const Examen& e)
// op = se compune din destructor(ce scrie in el) + constructor de copiere + return *this;
{
//evitarea auto-asignarii(nu putem sa facem un obiect egal cu el insusi ---
ex:e1=e1)
if (this != &e)
{
if (this->materie != NULL)
{
delete[]this->materie;
}
if (this->punctajeSubiecte != NULL)
{
delete[]this->punctajeSubiecte;
}
this->materie = new char[strlen([Link]) + 1];//+1 vine de la terminatorul
'\0'
strcpy(this->materie, [Link]);
this->profesor = [Link];
this->nota = [Link];
this->data[0] = [Link][0];
this->data[1] = [Link][1];
this->data[2] = [Link][2];
this->nrSubiecte = [Link];
this->punctajeSubiecte = new float[this->nrSubiecte];
for (int i = 0; i < this->nrSubiecte; i++)
{
this->punctajeSubiecte[i] = [Link][i];
}
return *this;
}
//metode --- sunt functii din interiorul clasei care primesc implicit pointerul this(*this)
//cateva metode mai uzuale si simple (min,max,suma,medie)-- de obicei cand avem
vector numeric
//suma
float totalPunctajeSubiect()
{
float total = 0;
for (int i = 0; i < this->nrSubiecte; i++)
{
total = total + this->punctajeSubiecte[i];
}
return total;
}
float mediePunctaje()
{
float total = 0;
for (int i = 0; i < this->nrSubiecte; i++)
{
total = total + this->punctajeSubiecte[i];
}
return total/this->nrSubiecte;
}
//minim si maxim se initializeaza cu prima valoare din vector
float minPunctaje()
{
float min = this->punctajeSubiecte[0];
for (int i = 0; i < this->nrSubiecte; i++)
{
if (min > this->punctajeSubiecte[i])
{
min = this->punctajeSubiecte[i];
}
}
return min;
}
float maxPunctaje()
{
float max = this->punctajeSubiecte[0];
for (int i = 0; i < this->nrSubiecte; i++)
{
if (max < this->punctajeSubiecte[i])
{
max = this->punctajeSubiecte[i];
}
}
return max;
}
bool areRestanta()
{
return this->nota < 5;
}
bool examenulEsteRestanta()
{
return data[1] == 7;
}
//operatori
//op <<
//friend --- ofera accesul la atributele din zona privata a unei clase fara sa aiba pointerul
this;
//friend se foloseste neaparat(ca nu se poate fara) atunci cand avem nevoie de un
operator ce implica(are nevoie) de 2 termeni, unul in stanga altul in dreapta
//iar cel din stanga nu este de tipul clasei --- ex(cout<<e1, cin>>e2; e1= 44+e2;)
friend ostream& operator<<(ostream& out, const Examen e)
{
out << "ID:" << [Link] << endl;
out << "Materie:" << [Link] << endl;
out << "Profesor:" << [Link] << endl;
out << "Nota:" << [Link] << endl;
out << "Data:";
for (int i = 0; i < 3; i++)
{
out << [Link][i] << "/";
}
out << endl;
out << "Numar Subiecte:" << [Link] << endl;
out << "Punctaj subiecte: ";
for (int i = 0; i < [Link]; i++)
{
out << [Link][i] << " | ";
}
out << endl;
return out;
}
//operator >>
//in op >> intai trebuie sa dezalocam pointerii si apoi alocam iar
friend istream& operator>>(istream& in, Examen& e)
{
if ([Link] != NULL)
{
delete[][Link];
}
if ([Link] != NULL)
{
delete[][Link];
}
//op>> pentru char*
cout << "Materie:";
in >> ws;
char aux[250];
[Link](aux,249);
[Link] = new char[strlen(aux) + 1];
strcpy([Link], aux);
//op>> pentru string
cout << "Profesor:";
getline(in, [Link]);
//op>> pentru int
cout << "Nota:";
in >> [Link];
//op>> pentru int static sau int*
cout << "Data(zi/ luna/ an):";
for (int i = 0; i < 3; i++)
{
in >> [Link][i];
}
//op>> pentru int
cout << "Numar Subiecte:";
in >> [Link];
//op>> pentru int static sau int*
cout << "Punctaj Subiecte:";
[Link] = new float[[Link]];
for (int i = 0; i < [Link]; i++)
{
in >> [Link][i];
}
return in;
}
//operator +=
Examen& operator +=(float punctaj)
{
Examen copie = *this;
delete[]this->punctajeSubiecte;
this->nrSubiecte++;
this->punctajeSubiecte = new float[this->nrSubiecte];
for (int i = 0; i < [Link]; i++)
{
this->punctajeSubiecte[i] = [Link][i];
}
this->punctajeSubiecte[this->nrSubiecte - 1] = punctaj;
return *this;
}
//operator -=
Examen& operator -=(float punctaj)
{
Examen copie = *this;
int nr = 0;//vom stoca aici de cate ori se gaseste numarul cautat in vector
for (int i = 0; i < this->nrSubiecte; i++)
{
if (punctaj == this->punctajeSubiecte[i])
{
nr++;
}
}
delete[]this->punctajeSubiecte;
this->nrSubiecte = this->nrSubiecte - nr;
this->punctajeSubiecte = new float[this->nrSubiecte];
int pozitie = 0;
for (int i = 0; i < [Link]; i++)
{
if (punctaj != [Link][i])
{
this->punctajeSubiecte[pozitie] = [Link][i];
pozitie++;
}
}
return *this;
}
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
cout << "-------------------Sfarsit Getteri---------------------------" << endl;
cout << "------------------- Setteri---------------------------" << endl;
[Link]("Biogeologie");
/*string numeSetter;
do
{
cout << "Introduceti numele dorit: ";
cin >> numeSetter;
try {
[Link](numeSetter);
}
catch (exception ex)
{
cout << "Numele introdus este incorect!" << endl;
}
} while ([Link]()<3);
*/
[Link](28);
int dataNoua[3] = { 32,05,2021 };
[Link](dataNoua);
float punctajeSubiecte[] = { -30,30,40 };
[Link](3, punctajeSubiecte);
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
cout << "-------------------Sfarsit Setteri---------------------------" << endl;
int data[3] = { 22,01,2021 };
float punctaje[] = { 31.5,11.5,40,50.5 };
Examen e1("Economie", "Doctorescu", 6, data, 3, punctaje);
cout << "-------------------Getteri---------------------------" << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < 3; i++)
{
cout << [Link]()[i] << "/";
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
cout << "-------------------Sfarsit Getteri---------------------------" << endl;
cout << "------------------- Constructor de copiere---------------------------" << endl;
Examen e2 = e1;
//Examen e2(e1); -- ambele forme sunt corecte
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < 3; i++)
{
cout << [Link]()[i] << "/";
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
cout << "-------------------Sfarsit Constructor de copiere---------------------------" << endl;
cout << "------------------- Operator = ---------------------------" << endl;
e1 = e1;
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < 3; i++)
{
cout << [Link]()[i] << "/";
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
cout << "-------------------Sfarsit Operator = ---------------------------" << endl;
cout << "-------------------Metode ---------------------------" << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
if ([Link]())
{
cout << "Examenul a fost picat!" << endl;
}
else
{
cout << "Examenul a fost promovat!" << endl;
}
if ([Link]())
{
cout << "Examenul a fost restanta!" << endl;
}
else
{
cout << "Examenul nu a fost restanta!" << endl;
}
[Link](99);
cout << [Link]() << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < 3; i++)
{
cout << [Link]()[i] << "/";
}
cout << endl;
cout << [Link]() << endl;
cout << [Link]() << endl;
//cout << [Link]() << endl;//asa afisam adresa vectorului
for (int i = 0; i < [Link](); i++)
{
cout << [Link]()[i] << " | ";
}
cout << endl;
}
cout << endl;
cout << "-------------------Sfarsit Metode ---------------------------" << endl;
cout << "-------------------Operatori ---------------------------" << endl;
cout << "-------------------Operator << ---------------------------" << endl;
cout << e1 << endl;
cout << "-------------------Operator >> ---------------------------" << endl;
}
cout << "-------------------Operator cast ---------------------------" << endl;
cout << string(e1) << endl;
cout << "-------------------Operator index -- op [] ---------------------------" << endl;
cout << e1[2] << endl;
e1[2] = 55.55;
cout << e1 << endl;
/*int poz;
do
{
cout << "Introduceti pozitia dorita: ";
cin >> poz;
try {
cout << e1[poz]<<endl;
}
catch (exception ex)
{
cout << "Pozitia introdusa este incorecta!" << endl;
}
} while (poz<0|| poz>= [Link]());*/
}
if (e1 > e2)
{
cout << "Nota la examenul e1 mai mare decat cea la examenul e2!" << endl;
}
else
{
cout << "Nota la examenul e1 mai mica decat cea la examenul e2!" << endl;
}
if (e1 == e2)
{
cout << "Ambele examene sunt la acelasi profesor!" << endl;
}
else
{
cout << "Examenele nu sunt la acelasi profesor!" << endl;
}
if (~e1)
{
cout << "Nu are restanta!" << endl;
}
else
{
cout << "Are restanta!" << endl;
}
if (!e1)
{
cout << "Nu are restanta!" << endl;
}
else
{
cout << "Are restanta!" << endl;
}
if (!e1)
{
cout << "Nu are restanta!" << endl;
}
else
{
cout << "Are restanta!" << endl;
}
if (!e1)
{
cout << "Nu are restanta!" << endl;
}
else
{
cout << "Are restanta!" << endl;
}
cout << "-------------------Operator ++ post si pre ---------------------------" << endl;
Examen e3 = e1++;
cout << e3 << endl << endl;
cout << e1 << endl << endl;
Examen e4 = ++e1;
cout << e4 << endl << endl;
cout << e1 << endl << endl;
cout << "-------------------Operator += si -= ---------------------------" << endl;
e1 += 40;
cout << e1 << endl;
e1 -= 40;
cout << e1 << endl;
cout << "-------------------Sfarsit Operatori ---------------------------" << endl;
cout << "-------------------Functie statica ---------------------------" << endl;
Examen vectExam[4];
vectExam[0] = e;
vectExam[1] = e1;
vectExam[2] = e2;
vectExam[3] = e3;
cout << Examen::medieNoteExamene(4, vectExam);