Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstring>
- using namespace std;
- class Employee { //Да се дефинира апстрактна класа Employee
- protected: //којашто ќе содржи
- char ime[50]; //име на вработениот
- int godini; // години
- int iskustvo; //и работно искуство во години (integer).
- public:
- Employee(){ // defaulten
- strcpy(this->ime, "");
- this->godini = 0;
- this->iskustvo = 0;
- }
- Employee(char * ime, int godini, int iskustvo){ // konstruktor so argumenti
- strcpy(this->ime, ime);
- this->godini = godini;
- this->iskustvo = iskustvo;
- }
- Employee(const Employee &e) { // copy konstruktor
- strcpy(this->ime, e.ime);
- this->godini = e.godini;
- this->iskustvo = e.iskustvo;
- }
- const int getgodini() {
- return godini;
- }
- virtual ~Employee(){} //destruktor
- virtual double plata() = 0; //Да се дефинираат чисти виртуелни функции plata()
- virtual double bonus() = 0; //и bonus() (double).
- };
- class SalaryEmployee : public Employee { //Од класата Employee да се изведе класа SalaryEmployee
- private: //која покрај основните информации содржи и
- int osnovnaplata; //информација за основната плата.
- public:
- SalaryEmployee() {
- this->osnovnaplata = 0;
- }//defaulten
- SalaryEmployee(char * ime, int godini, int iskustvo, int osnovnaplata) : Employee(ime, godini, iskustvo) {
- this->osnovnaplata = osnovnaplata;
- }//konstruktor so argumenti
- SalaryEmployee(const SalaryEmployee &se) : Employee(se) {
- this->osnovnaplata = se.osnovnaplata;
- }//copy konstruktor
- ~SalaryEmployee(){} // destruktor
- double bonus() { //Бонусот на овие работници се пресметува како процент од основната плата,
- return (osnovnaplata*iskustvo)/100;// а процентот е бројот на години со работно искуство.
- } //На пример ако работеле 10 години, бонусот е 10 проценти од основната плата.
- double plata() { //Вкупната плата се пресметува како основната
- return osnovnaplata + bonus(); // плата плус бонусот.
- }
- };
- class HourlyEmployee : public Employee { //Од класата Employee исто така да се изведе класа HourlyEmployee
- private: //која покрај основните информации
- int brcasovi; //содржи информација и за вкупниот број на часови кои ги одработил работникот
- int platapocas; // и платата по час.
- public:
- HourlyEmployee() {
- this->brcasovi = 0;
- this->platapocas = 0;
- }//defaulten
- HourlyEmployee(char * ime, int godini, int iskustvo, int brcasovi, int platapocas) : Employee(ime, godini, iskustvo) {
- this->brcasovi = brcasovi;
- this->platapocas = platapocas;
- }//konstruktor so argumenti
- HourlyEmployee(const HourlyEmployee &he) : Employee(he) {
- this->brcasovi = he.brcasovi;
- this->platapocas = he.platapocas;
- }//copy konstruktor
- ~HourlyEmployee(){} // destruktor
- //плус бонусот,
- double bonus(){ //додека бонусот се пресметува на следниот начин:
- if (brcasovi>320) //За секој час над 320-тиот
- return (platapocas*0.5)*(brcasovi-320); //се добива 50 проценти од платата по час.
- else return 0;
- }
- double plata() { //Вкупната плата се пресметува како
- return (brcasovi * platapocas) + bonus(); //бројот на часови помножен со платата по час
- }
- };
- //CE SE UBIAM ZNACI ZA U IDNINA U KONSTRUKTOR SO ARGUMENTI DONT FUCK UP REDOT NA ARGUMENTITE
- //SO TOA KAKO TI SE NAPISANI UNATRE POSO IZMESANO IMALO VRSKA AKO SE APPARENTLY
- //4 SAATA IZGUBIV NA VOA.
- class Freelancer : public Employee { //Од класата Employee на крај се изведува класата Freelancer
- private: //која покрај основните информации содржи и
- int proekti; //број на проекти на кои работел вработениет и
- double * sumi; //низа со суми кои ги добил за тие проекти (double).
- public:
- Freelancer(){ // defaulten
- this->proekti = 0;
- this->sumi = new double[0];
- }
- Freelancer(char * ime, int godini, int iskustvo, int proekti, double * sumi) : Employee(ime, godini, iskustvo) {
- this->proekti = proekti;
- this->sumi = new double[proekti];
- for(int i=0; i<proekti; i++)
- this->sumi[i] = sumi[i];
- } // konstruktor so argumenti
- Freelancer(const Freelancer &f) : Employee(f){ // copy konstruktor
- this->proekti = f.proekti;
- this->sumi = new double[f.proekti];
- for(int i=0; i<f.proekti; i++)
- this->sumi[i] = f.sumi[i];
- }
- ~Freelancer(){ // destruktor
- delete [] sumi;
- }
- double bonus() {// По направени 5 проекти, за секој нареден вработените
- if(proekti>5) return (proekti-5)*1000;
- else return 0;
- }
- double plata() { //Вкупната плата на овој тип на вработени изнесува
- double total=0.0;
- for(int i=0; i<proekti; i++){ //вкупната сума добиена од сите проекти плус бонусот.
- total = sumi[i] + total;
- }
- return total+bonus();
- }
- };
- bool operator ==(Employee &e1, Employee &e2) { //Да се преоптовари операторот ==
- if (e1.getgodini() == e2.getgodini()&&e1.bonus()==e2.bonus()) //кој ќе прима два објекти од класата Employee
- return true; //и ќе ги споредува според тоа дали имаат ист број на години и дали добиваат ист бонус.
- else return false;
- }
- class Company { //Да се дефинира класа Company
- private: //која ќе содржи информации за
- char ime [50]; //името на компанијата,
- int vraboteni; //бројот на вработени, и
- Employee **niza; //динамична низа од покажувачи од класата Employee или Employee **.
- public: //За потребите на оваа класа треба да се дефинира конструктор
- Company(char * ime = "") { //кој прима само еден аргумент - името на компанијата,
- strcpy(this->ime, ime);
- this->vraboteni = 0;
- this-> niza = new Employee * [0];
- }
- Company &operator+=(Employee *e) {// да се преоптовари операторот += и
- Employee ** tmp = new Employee * [vraboteni+1];
- for(int i=0; i<vraboteni; i++)
- tmp[i] = niza[i];
- tmp[vraboteni++] = e;
- delete [] niza;
- niza = tmp;
- return *this;
- }
- double vkupnaPlata() {//double vkupnaPlata() - метод којшто ја враќа
- int vkupno=0;
- for(int i=0; i<vraboteni; i++) {//вкупната плата на сите вработени во компанијата
- vkupno+=niza[i]->plata();
- }
- return vkupno;
- }
- double filtriranaPlata(Employee * emp) { // double filtriranaPlata(Employee * emp)
- double total=0.0;
- for(int i=0; i<vraboteni; i++) { //метод којшто ја враќа платата само на работниците
- if(*niza[i] == *emp) { //кои се еднакви со дадениот вработен (според оператор ==)
- total = total + niza[i]->plata();
- }
- }
- return total;
- }
- void pecatiRabotnici() { //void pecatiRabotnici() - метод којшто печати по колку вработени
- cout<<"Vo kompanijata "<<ime<<" rabotat:"<<endl;
- int salary=0, hourly=0, free=0;
- for(int i=0; i<vraboteni; i++){
- SalaryEmployee *se=dynamic_cast<SalaryEmployee *>(niza[i]);
- if(se!=0) salary++;
- HourlyEmployee *he=dynamic_cast<HourlyEmployee *>(niza[i]);
- if(he!=0) hourly++;
- Freelancer *fe=dynamic_cast<Freelancer *>(niza[i]);
- if(fe!=0) free++;
- }//има од секој тип на работници во компанијата
- cout<<"Salary employees: "<<salary<<endl;
- cout<<"Hourly employees: "<<hourly<<endl;
- cout<<"Freelancers: "<<free<<endl;
- }
- ~Company() {
- // for(int i=0;i<vraboteni; i++)
- // delete [] niza;
- }
- };
- int main() {
- char name[50];
- cin >> name;
- Company c(name);
- int n;
- cin >> n;
- char employeeName[50];
- int age;
- int experience;
- int type;
- for (int i=0; i <n; ++i) {
- cin >> type;
- cin >> employeeName >> age >> experience;
- if (type == 1) {
- int basicSalary;
- cin >> basicSalary;
- c += new SalaryEmployee(employeeName, age, experience, basicSalary);
- }
- else if (type == 2) {
- int hoursWorked;
- int hourlyPay;
- cin >> hoursWorked >> hourlyPay;
- c += new HourlyEmployee(employeeName, age, experience, hoursWorked, hourlyPay);
- }
- else {
- int numProjects;
- cin >> numProjects;
- double projects[10];
- for (int i=0; i < numProjects; ++i) {
- cin >> projects[i];
- }
- c += new Freelancer(employeeName, age, experience, numProjects, projects);
- }
- }
- c.pecatiRabotnici();
- cout << "Vkupnata plata e: " << c.vkupnaPlata() << endl;
- Employee * emp = new HourlyEmployee("Petre_Petrov",31,6,340,80);
- cout << "Filtriranata plata e: " << c.filtriranaPlata(emp);
- delete emp;
- }
Add Comment
Please, Sign In to add comment