196040

OOP labs 7 Employee

May 16th, 2020
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.10 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class Employee { //Да се дефинира апстрактна класа Employee
  5.     protected: //којашто ќе содржи
  6.     char ime[50]; //име на вработениот
  7.     int godini; // години
  8.     int iskustvo; //и работно искуство во години (integer).
  9.     public:
  10.     Employee(){ // defaulten
  11.     strcpy(this->ime, "");
  12.     this->godini = 0;
  13.         this->iskustvo = 0;
  14.     }
  15.     Employee(char * ime, int godini, int iskustvo){ // konstruktor so argumenti
  16.     strcpy(this->ime, ime);
  17.         this->godini = godini;
  18.         this->iskustvo = iskustvo;
  19.     }
  20.     Employee(const Employee &e) { // copy konstruktor
  21.      strcpy(this->ime, e.ime);
  22.         this->godini = e.godini;
  23.         this->iskustvo = e.iskustvo;
  24.     }
  25.    const int getgodini() {
  26.     return godini;
  27.     }
  28.     virtual ~Employee(){} //destruktor
  29.     virtual double plata() = 0;    //Да се дефинираат чисти виртуелни функции plata()
  30.     virtual double bonus() = 0; //и bonus() (double).
  31. };
  32. class SalaryEmployee : public Employee { //Од класата Employee да се изведе класа SalaryEmployee
  33.     private: //која покрај основните информации содржи и
  34.     int osnovnaplata; //информација за основната плата.
  35.     public:
  36.     SalaryEmployee() {
  37.     this->osnovnaplata = 0;
  38.     }//defaulten
  39.     SalaryEmployee(char * ime, int godini, int iskustvo, int osnovnaplata) : Employee(ime, godini, iskustvo) {
  40.     this->osnovnaplata = osnovnaplata;
  41.     }//konstruktor so argumenti
  42.     SalaryEmployee(const SalaryEmployee &se) : Employee(se) {
  43.     this->osnovnaplata = se.osnovnaplata;
  44.     }//copy konstruktor
  45.     ~SalaryEmployee(){} // destruktor
  46.     double bonus() { //Бонусот на овие работници се пресметува како процент од основната плата,
  47.     return (osnovnaplata*iskustvo)/100;// а процентот е бројот на години со работно искуство.
  48.     }  //На пример ако работеле 10 години, бонусот е 10 проценти од основната плата.
  49.     double plata() { //Вкупната плата се пресметува како основната
  50.     return osnovnaplata + bonus();  //  плата плус бонусот.
  51.     }
  52. };
  53.     class HourlyEmployee : public Employee { //Од класата Employee исто така да се изведе класа HourlyEmployee
  54.     private: //која покрај основните информации
  55.     int brcasovi; //содржи информација и за вкупниот број на часови кои ги одработил работникот
  56.     int platapocas; // и платата по час.
  57.     public:
  58.     HourlyEmployee() {
  59.     this->brcasovi = 0;
  60.     this->platapocas = 0;
  61.     }//defaulten
  62.     HourlyEmployee(char * ime, int godini, int iskustvo,  int brcasovi, int platapocas) : Employee(ime, godini, iskustvo) {
  63.     this->brcasovi = brcasovi;
  64.         this->platapocas = platapocas;
  65.     }//konstruktor so argumenti
  66.     HourlyEmployee(const HourlyEmployee &he) : Employee(he) {
  67.     this->brcasovi = he.brcasovi;
  68.         this->platapocas = he.platapocas;
  69.     }//copy konstruktor
  70.     ~HourlyEmployee(){} // destruktor
  71.      //плус бонусот,
  72.     double bonus(){ //додека бонусот се пресметува на следниот начин:
  73.         if (brcasovi>320) //За секој час над 320-тиот
  74.          return (platapocas*0.5)*(brcasovi-320); //се добива 50 проценти од платата по час.
  75.     else return 0;
  76.     }
  77.         double plata() { //Вкупната плата се пресметува како
  78.         return (brcasovi * platapocas) + bonus(); //бројот на часови помножен со платата по час
  79.     }
  80. };
  81. //CE SE UBIAM ZNACI ZA U IDNINA U KONSTRUKTOR SO ARGUMENTI DONT FUCK UP REDOT NA ARGUMENTITE
  82. //SO TOA KAKO TI SE NAPISANI UNATRE POSO IZMESANO IMALO VRSKA AKO SE APPARENTLY
  83. //4 SAATA IZGUBIV NA VOA.
  84. class Freelancer : public Employee { //Од класата Employee на крај се изведува класата Freelancer
  85.     private: //која покрај основните информации содржи и
  86.     int proekti; //број на проекти на кои работел вработениет и
  87.     double * sumi; //низа со суми кои ги добил за тие проекти (double).
  88.     public:
  89.     Freelancer(){ // defaulten
  90.     this->proekti = 0;
  91.     this->sumi = new double[0];
  92.     }
  93.     Freelancer(char * ime, int godini, int iskustvo, int proekti, double * sumi) : Employee(ime, godini, iskustvo) {
  94.     this->proekti = proekti;
  95.         this->sumi = new double[proekti];
  96.         for(int i=0; i<proekti; i++)
  97.             this->sumi[i] = sumi[i];
  98.     } // konstruktor so argumenti
  99.     Freelancer(const Freelancer &f) : Employee(f){ // copy konstruktor
  100.     this->proekti = f.proekti;
  101.         this->sumi = new double[f.proekti];
  102.         for(int i=0; i<f.proekti; i++)
  103.             this->sumi[i] = f.sumi[i];
  104.     }
  105.     ~Freelancer(){ // destruktor
  106.     delete [] sumi;
  107.     }
  108.     double bonus() {// По направени 5 проекти, за секој нареден вработените
  109.         if(proekti>5) return (proekti-5)*1000;
  110.         else return 0;
  111.     }
  112.     double plata() { //Вкупната плата на овој тип на вработени изнесува
  113.         double total=0.0;
  114.     for(int i=0; i<proekti; i++){ //вкупната сума добиена од сите проекти плус бонусот.
  115.         total = sumi[i] + total;
  116.     }
  117.         return total+bonus();
  118.     }
  119. };
  120. bool operator ==(Employee &e1, Employee &e2) { //Да се преоптовари операторот ==
  121. if (e1.getgodini() == e2.getgodini()&&e1.bonus()==e2.bonus()) //кој ќе прима два објекти од класата Employee
  122.    return true; //и ќе ги споредува според тоа дали имаат ист број на години и дали добиваат ист бонус.
  123.     else return false;
  124. }
  125. class Company { //Да се дефинира класа Company
  126.     private: //која ќе содржи информации за
  127.     char ime [50]; //името на компанијата,
  128.     int vraboteni; //бројот на вработени, и
  129.     Employee **niza; //динамична низа од покажувачи од класата Employee или Employee **.
  130.     public: //За потребите на оваа класа треба да се дефинира конструктор
  131.     Company(char * ime = "") { //кој прима само еден аргумент - името на компанијата,
  132.     strcpy(this->ime, ime);
  133.         this->vraboteni = 0;
  134.         this-> niza = new Employee * [0];
  135.     }
  136.     Company &operator+=(Employee *e) {// да се преоптовари операторот += и
  137. Employee ** tmp = new Employee * [vraboteni+1];
  138.         for(int i=0; i<vraboteni; i++)
  139.             tmp[i] = niza[i];
  140.         tmp[vraboteni++] = e;
  141.         delete [] niza;
  142.         niza = tmp;
  143.         return *this;
  144.     }
  145.     double vkupnaPlata() {//double vkupnaPlata() - метод којшто ја враќа
  146.         int vkupno=0;
  147.         for(int i=0; i<vraboteni; i++) {//вкупната плата на сите вработени во компанијата
  148.             vkupno+=niza[i]->plata();
  149.         }
  150.         return vkupno;
  151.     }
  152.         double filtriranaPlata(Employee * emp) { // double filtriranaPlata(Employee * emp)
  153.            double total=0.0;
  154.             for(int i=0; i<vraboteni; i++)  { //метод којшто ја враќа платата само на работниците
  155.                 if(*niza[i] == *emp) { //кои се еднакви со дадениот вработен (според оператор ==)
  156.            total = total + niza[i]->plata();
  157.                 }
  158.             }
  159.                 return total;
  160.         }
  161.         void pecatiRabotnici() { //void pecatiRabotnici() - метод којшто печати по колку вработени
  162.         cout<<"Vo kompanijata "<<ime<<" rabotat:"<<endl;
  163.             int salary=0, hourly=0, free=0;
  164.             for(int i=0; i<vraboteni; i++){
  165.                 SalaryEmployee *se=dynamic_cast<SalaryEmployee *>(niza[i]);
  166.                 if(se!=0) salary++;
  167.                 HourlyEmployee *he=dynamic_cast<HourlyEmployee *>(niza[i]);
  168.                 if(he!=0) hourly++;
  169.                 Freelancer *fe=dynamic_cast<Freelancer *>(niza[i]);
  170.                 if(fe!=0) free++;
  171.             }//има од секој тип на работници во компанијата
  172. cout<<"Salary employees: "<<salary<<endl;
  173. cout<<"Hourly employees: "<<hourly<<endl;
  174. cout<<"Freelancers: "<<free<<endl;
  175.         }
  176. ~Company() {
  177.  //   for(int i=0;i<vraboteni; i++)
  178. //        delete [] niza;
  179. }
  180. };
  181. int main() {
  182. char name[50];
  183. cin >> name;
  184. Company c(name);
  185. int n;
  186. cin >> n;
  187. char employeeName[50];
  188. int age;
  189. int experience;
  190. int type;
  191. for (int i=0; i <n; ++i) {
  192.   cin >> type;
  193.   cin >> employeeName >> age >> experience;
  194.   if (type == 1) {
  195.     int basicSalary;
  196.     cin >> basicSalary;
  197.     c += new SalaryEmployee(employeeName, age, experience, basicSalary);
  198.   }
  199.   else if (type == 2) {
  200.     int hoursWorked;
  201.     int hourlyPay;
  202.     cin >> hoursWorked >> hourlyPay;
  203.     c += new HourlyEmployee(employeeName, age, experience, hoursWorked, hourlyPay);
  204.   }
  205.   else {
  206.     int numProjects;
  207.     cin >> numProjects;
  208.     double projects[10];
  209.     for (int i=0; i < numProjects; ++i) {
  210.       cin >> projects[i];
  211.     }
  212.     c += new Freelancer(employeeName, age, experience, numProjects, projects);
  213.   }
  214. }
  215. c.pecatiRabotnici();
  216.     cout << "Vkupnata plata e: " << c.vkupnaPlata() << endl;
  217.     Employee * emp = new HourlyEmployee("Petre_Petrov",31,6,340,80);
  218. cout << "Filtriranata plata e: " << c.filtriranaPlata(emp);
  219. delete emp;
  220. }
Add Comment
Please, Sign In to add comment