Skip to content

Instantly share code, notes, and snippets.

@conache
Last active February 25, 2017 11:59
Show Gist options
  • Save conache/bd24d730d7d458ce3b3b3d95b4b561a2 to your computer and use it in GitHub Desktop.
Save conache/bd24d730d7d458ce3b3b3d95b4b561a2 to your computer and use it in GitHub Desktop.
#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;
}
@rptoma
Copy link

rptoma commented May 30, 2016

BEST CODE BRO! U ROCK

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment