Last active
February 25, 2017 11:59
-
-
Save conache/bd24d730d7d458ce3b3b3d95b4b561a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <map> | |
using namespace std; | |
class Data{ | |
int an,zi, luna; | |
public: | |
Data( int a=0, int z=0, int l=0){ | |
an = a; | |
zi = z; | |
luna = l; | |
} | |
int getAn() const { return an;} | |
int getZi() const {return zi;} | |
int getLuna() const { return luna;} | |
friend istream& operator>> ( istream& input, Data& data){ | |
cout<<"Zi:";input>>data.zi; | |
cout<<"Luna:";input>>data.luna; | |
cout<<"An:";input>>data.an; | |
return input; | |
} | |
void show() const{ | |
cout<<zi<<"."<<luna<<"."<<an; | |
} | |
bool operator<= ( const Data data){ | |
if( an < data.getAn() ) return true; | |
if( an > data.getAn() ) return false; | |
if( luna <= data.getLuna() ) return true; | |
else return false; | |
if( zi <= data.getZi() ) return true; | |
else return false; | |
} | |
}; | |
class Angajat{ | |
protected: | |
string nume, prenume, tip_contract, tipul_activitatii; | |
Data data_intrare,data_terminare; | |
float prima; | |
public: | |
Angajat():prima(400){}; | |
virtual void show(){ | |
cout<<nume<<" "<<prenume<<" "<<tip_contract<<" "<<tipul_activitatii<<"Data intrare:"; | |
data_intrare.show(); | |
if( tip_contract == "ora") cout<<" Data incheiere:";data_terminare.show(); | |
cout<<" Prima:"<<prima; | |
} | |
friend istream& operator>> ( istream& input, Angajat* angajat){ | |
cin.get(); | |
cout<<"Nume:";getline( input, angajat->nume); | |
cin.get(); | |
cout<<"Prenume:";getline( input, angajat->prenume); | |
cin.get(); | |
cout<<"Tip contract:";getline( input, angajat->tip_contract); | |
cin.get(); | |
cin>>angajat->data_intrare; | |
if( angajat->tip_contract == "ora" ){ | |
input>>angajat->data_terminare; | |
float prima = angajat->prima; | |
Data data_curenta(31,12,2014); | |
if( data_curenta <= angajat->data_terminare ) | |
angajat->prima = prima/2; | |
} | |
return input; | |
} | |
string getTipContract(){ return tip_contract;} | |
string getTipActivitate(){ return tipul_activitatii;} | |
Data getDeadline(){ return data_terminare; } | |
virtual int getNrCopii(){ return 0;} | |
virtual int getWeekend(){ return 0;} | |
}; | |
class Lucrativ:public Angajat{ | |
int nr_copii; | |
public: | |
Lucrativ():nr_copii(0){}; | |
friend istream& operator>>( istream& input, Lucrativ* lucrativ){ | |
lucrativ->tipul_activitatii = "lucrativ"; | |
input>>dynamic_cast<Angajat*>(lucrativ); | |
if(lucrativ->tip_contract == "permanent"){ | |
cout<<"Numar copii minori aflati in intretinere:"; | |
input>>lucrativ->nr_copii; | |
float prima_curenta = lucrativ->prima; | |
lucrativ->prima = prima_curenta + ((2014 - ((lucrativ->data_intrare).getAn()))* lucrativ->nr_copii)/100; | |
} | |
return input; | |
} | |
void show(){ | |
if( tip_contract == "permanent" ) cout<<"Numar copii minori:"<<nr_copii<<endl; | |
Angajat::show(); | |
} | |
int getNrCopii(){ return nr_copii;} | |
}; | |
class Tesa:public Angajat{ | |
int weekend_concediu; | |
public: | |
Tesa(): weekend_concediu(0){}; | |
friend istream& operator>>( istream& input, Tesa* tesa){ | |
tesa->tipul_activitatii = "TESA"; | |
input>>dynamic_cast<Angajat*>(tesa); | |
if( tesa->tip_contract == "permanent"){ | |
cout<<"Weekend concediu:"; | |
input>>tesa->weekend_concediu; | |
} | |
} | |
void show(){ | |
if( tip_contract == "permanent" ) cout<<"Weekend concediu:"<<weekend_concediu<<endl; | |
Angajat::show(); | |
} | |
int getWeekend(){ | |
return weekend_concediu; | |
} | |
}; | |
class WorkerFactory{ | |
public: | |
Angajat* create( std::string classname ){ | |
map<string, int> mapper; | |
mapper["TESA"] = 0; | |
mapper["lucrativ"] = 1; | |
switch( mapper[classname]){ | |
case 0: return create_tesa(); | |
case 1: return create_lucrativ(); | |
} | |
} | |
Angajat* create_tesa(){ | |
Tesa* tesa_worker = new Tesa; | |
cin>>tesa_worker; | |
return tesa_worker; | |
} | |
Angajat* create_lucrativ(){ | |
Lucrativ* lucrativ_worker = new Lucrativ; | |
cin>>lucrativ_worker; | |
return lucrativ_worker; | |
} | |
}; | |
class ManagerAngajati{ | |
static ManagerAngajati* current_manager; | |
vector<Angajat*>Angajati; | |
public: | |
static ManagerAngajati* Instance(){ return current_manager;} | |
void Add( Angajat* angajat){ Angajati.push_back(angajat); } | |
void All(){ | |
for( int i=0; i<Angajati.size(); i++) | |
Angajati[i]->show(); | |
} | |
void filter( string activitate, string contract){ | |
for( int i=0; i<Angajati.size(); i++){ | |
if( Angajati[i]->getTipActivitate() == activitate && Angajati[i]->getTipContract() == contract && Angajati[i]->getNrCopii()>0) | |
Angajati[i]->show(); | |
} | |
} | |
void filter( string activitate, string contract, int weekend_concediu ){ | |
for( int i=0; i<Angajati.size(); i++){ | |
if( Angajati[i]->getTipActivitate() == activitate && Angajati[i]->getTipContract() == contract && Angajati[i]->getWeekend() ) | |
Angajati[i]->show(); | |
} | |
} | |
void filter(string contract, Data data ){ | |
for( int i=0; i<Angajati.size(); i++){ | |
if( Angajati[i]->getTipContract() == contract && Angajati[i]->getDeadline() <= data ) | |
Angajati[i]->show(); | |
} | |
} | |
}; | |
ManagerAngajati* ManagerAngajati::current_manager( new ManagerAngajati); | |
int main() | |
{ | |
WorkerFactory factory; | |
int optiune; | |
do{ | |
cout<<"1. Angajat Tesa\n"; | |
cout<<"2. Angajat lucrativ\n"; | |
cout<<"3. Paraseste acest meniu\n"; | |
cout<<"Optiunea ta:"; cin>>optiune; | |
switch( optiune ){ | |
case 1: { | |
ManagerAngajati::Instance()->Add(factory.create("TESA")); | |
break; | |
} | |
case 2:{ | |
ManagerAngajati::Instance()->Add(factory.create("lucrativ")); | |
break; | |
} | |
default: if( optiune != 3) cout<<"Optiune necunoscuta\n"; | |
} | |
}while( optiune != 3); | |
ManagerAngajati::Instance()->All(); | |
ManagerAngajati::Instance()->filter("lucrativ","permanent"); | |
ManagerAngajati::Instance()->filter("TESA","permanent", 2); | |
Data data(2015,31,2); | |
ManagerAngajati::Instance()->filter("ora",data); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
BEST CODE BRO! U ROCK