Описать класс Работник

Уровень сложности:

Создать класс, описывающий понятие работник, со свойствами:

  • фамилия;
  • стаж;
  • часовая заработная плата;
  • количество отработанных часов.

C помощью метода реализовать ввод данных работника с клавиатуры. Рассчитать с помощью методов заработную плату, за отработанное время, и премию, размер которой определяется в зависимости от стажа (при стаже до 1 года 0%, до 3 лет 5%, до 5 лет 8%, свыше 5 лет 15%).
С помощью метода печати, реализовать вывод информации о работнике на экран. Предусмотреть метод для записи в файл данных о работнике.

Полезные статьи: классы в С++, символы и строки, директивы ifndef и endif. Ниже показан пример работы программы:

Данное решение нам предоставил пользователь нашего сайта — Андрей Калачёв. Огромное ему за это спасибо.

#include<iostream>
#include<cstring>
#include<fstream>

using namespace std;

class Worker
{
      string surname;
      int experience, salaryh, hours, salary;
      double premy;
      public:
             void setWorker(string sn, int exp, int sh, int h)
             {
                  surname = sn;
                  experience = exp;
                  salaryh = sh;
                  hours = h;
                  double p;
                  int s;
                  s = sh*h;
                  salary = s;
                  if (exp<1) p=0;
                  else
                  {
                      if (exp>=1 && exp<3) p=0.05*s;
                      else
                      {
                         if (exp>=3 && exp<5) p=0.08*s;
                         else
                         {
                            if (exp>=5) p=0.15*s;
                         }
                      }
                  }
                  premy = p;
             }
             void getWorker()
             {
                  cout<<surname<<endl<<"Experience is "<<experience<<endl<<"Hourly wage is "<<salaryh<<endl<<surname<<" has worked "<<hours<<" hours"<<endl<<"Salary is "<<salary<<endl<<"Premy is "<<premy<<endl;
                  cout<<"Information about "<<surname<<" was written in file 'Workers.txt'"<<endl;
                  ofstream file;
                  file.open("Workers.txt", ios_base::app);
                  file<<surname<<endl<<"Experience is "<<experience<<endl<<"Hourly wage is "<<salaryh<<endl<<surname<<" has worked "<<hours<<" hours"<<endl<<"Salary is "<<salary<<endl<<"Premy is "<<premy<<endl<<endl<<endl;
                  file.close();
             }                
};

int main()
{
    string surname;
    int experience, salaryh, hours, salary, premy;
    cout<<"Enter worker's name: "; cin>>surname; cout<<endl;
    cout<<"Enter worker's experience: "; cin>>experience; cout<<endl;
    cout<<"Enter worker's hourly wag: "; cin>>salaryh; cout<<endl;
    cout<<"Enter how much hours "<<surname<<" has worked: "; cin>>hours; cout<<endl;
    Worker objWorker;
    objWorker.setWorker(surname, experience, salaryh, hours);
    objWorker.getWorker();
    system ("pause");
    return 0;
}

Постараюсь в нескольких предложениях описать этот код.  Обратите, внимание на то, что реализация класса выполнена внутри, то есть все методы определены внутри тела класса, строки: 7 — 47. Такой способ утилизации классов — не самое лучшее решение, но очень удобный, в качестве обучающего материала. То есть код находится в одном файле, любому новичку будет несложно его скопировать и запустить на своей машине.

Еще один интересный момент в программе, строки 9 -11. В этих строках объявлены элемент-данные класса, то есть, по правилам хорошего стиля программирования, эти данные должны быть в закрытой области класса — private. По определению, элемент данные класса должны быть сокрыты от внешнего доступа, что, собственно, и было сделано. Но если они не объявлены явно в области доступа — private, тогда в какой области они находятся? Если область доступа явно не задается, по умолчанию им присваивается область — private (закрытая).

А методы класса явно определены в  области — public, то есть все члены класса в области public, значит строку 12 можно либо совсем убрать, либо поставить в самое начало тела класса.

Для работы со строками, Андрей использовал заголовочный файл <cstring>, функционал которого намного сокращает объем работы, в отличии от использования обычных Си-строк.

Не помешало бы несколько строк комментариев в программе, а в остальном все должно быть понятно. Еще раз хочу поблагодарить, за исходник, автора программы — Андрея Калачёва. Смотрим результат работы программы:

CppStudio.com
Enter worker's name: Denis

Enter worker's experience: 2

Enter worker's hourly wag: 50

Enter how much hours Denis has worked: 2450

Denis
Experience is 2
Hourly wage is 50
Denis has worked 2450 hours
Salary is 122500
Premy is 6125
Information about Denis was written in file 'Workers.txt'
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. Anufree

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    class worker
    {
    private:
    	char name[80];
    	int w_exp;
    	int salary_p_h;
    	int worked_h;
    public:
    	void enter()
    	{
    		cout << "Введите имя работника: ";
    		cin >> name;
    		cout << "Введите стаж работника: ";
    		cin >> w_exp;
    		cout << "Введите зарплату за час: ";
    		cin >> salary_p_h;
    		cout << "Введите кол-во отработанных часов: ";
    		cin >> worked_h;
    		cout << endl;
    	}
    	void print()
    	{
    		double prem = 0.0;
    		if(w_exp < 1)
    			prem = ((salary_p_h * worked_h) / 100) * 0;
    		if(w_exp > 1 && w_exp < 3)
    			prem = ((salary_p_h * worked_h) / 100) * 5;
    		if(w_exp > 3 && w_exp < 5)
    			prem = ((salary_p_h * worked_h) / 100) * 8;
    		if(w_exp > 5)
    			prem = ((salary_p_h * worked_h) / 100) * 15;
    		
    		cout << name << endl;
    		cout << "Стаж работы: " << w_exp << endl;
    		cout << "З/П в час: " << salary_p_h << endl;
    		cout << "Отработанно часов: " << worked_h << endl;
    		cout << "Зарплата: " << (salary_p_h * worked_h) << endl;
    		cout << "Премия: " << prem << endl;
    	}
    };
    
    int main()
    {
    	setlocale(LC_ALL, "Russian");
    
    	worker w;
    
    	w.enter();
    	w.print();
    	
    	_getch();
    
    	return 0;
    }
  2. gornyyvladimir

    gornyyvladimir

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <iostream>
    #include <string>
    #include <fstream.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    class Worker
    {
    private:
            string lastName;
            unsigned int experience;
            unsigned int salaryPerHour;
            unsigned int salaryForWorkTime;
            unsigned int workTime;
            double award;
    public:
            void Set (string wLastName, unsigned int wExperience, unsigned int wSalaryPerHour,
                      unsigned int wWorkTime)
            {
                lastName = wLastName;
                experience = wExperience;
                salaryPerHour = wSalaryPerHour;
                workTime = wWorkTime;
                salaryForWorkTime = salaryPerHour * workTime;
                if( experience < 1 )
                    award=0.0;
                else if( experience < 3)
                     {
                        award=(double)(salaryForWorkTime * 5)/100.0;
                     }
                else if( experience < 5 )
                     {
                        award=(double)(salaryForWorkTime * 8)/100.0;
                     }
                     else
                     {
                        award=(double)(salaryForWorkTime * 15)/100.0;
                     }
    
    
            }
            void Get ()
            {
                cout<<"Last Name: "<< lastName <<"\nExperience: "<<experience
                <<"\nSalary per hour: "<<salaryPerHour<<"\nWorkTime: "<<workTime<<
                "\nSalary for work time: "<<salaryForWorkTime<<"\nAward: "<<award<<endl;
            }
    
            bool SaveToFile ( char const* fileName )
            {
                ofstream fout( fileName );
                if(!fout.is_open())
                    return false;
                fout<<"Last Name: "<< lastName <<"\nExperience: "<<experience
                <<"\nSalary per hour: "<<salaryPerHour<<"\nWorkTime: "<<workTime<<
                "\nSalary for work time: "<<salaryForWorkTime<<"\nAward: "<<award<<endl;
                fout.close();
                return true;
            }
    
    };
    #pragma argsused
    int main(int argc, char* argv[])
    {
        string lastName;
        unsigned int experience;
        unsigned int salaryPerHour;
        unsigned int workTime;
        double award;
    
        cout<<"Enter last name: ";
        cin>>lastName;
        cout<<endl;
        cout<<"Enter experience: ";
        cin>>experience;
        cout<<endl;
        cout<<"Enter salary per hour: ";
        cin>>salaryPerHour;
        cout<<endl;
        cout<<"Enter work time: ";
        cin>>workTime;
        cout<<endl;
    
        Worker objWorker;
        objWorker.Set(lastName, experience, salaryPerHour, workTime);
        objWorker.Get();
        bool isSaved = objWorker.SaveToFile("save.txt");
        if(isSaved)
        {
            cout<<"File successfully saved"<<endl;
        }
        else
            cout<<"File NOT saved"<<endl;
    
        system("pause");
        return 0;
    }
    //---------------------------------------------------------------------------
  3. Boss

    #include <iostream>
    #include <fstream>
    #include <windows.h>
    using namespace std;
    
    class Workers
    {
    	public:
    		Workers() {};
    		~Workers() {};
    		
    		void Add_data();
    		void Show_data();
    		void Delete_data();
    		
    		char surname;
    		float itsExp;
    		float ItsHoursalary;
    		float itsHours;
    		float GetTotalSalary(float hoursalary, float hours) const {return (hoursalary * hours);};
    		float GetBonus(float exp, float hoursalary) const;
    };
    
    void Workers::Add_data()
    {
    	int ans(0);
    	char surname[30];
    	float exp(0), hoursalary(0), hours(0);
    	do
    	{
    		cout << "Do you like to save previous information?\n1 - Yes\n2 - No\n";
    		cin >> ans;
    	}
    	while (!ans == 1 || !ans == 2);
    	ofstream fout("Workers.txt", ios_base::app);
    	if (ans == 2)
    		ofstream fout("Workers.txt", ios_base::trunc | ios_base::out);
    	cout << "Enter worker's surname: ";
    	cin.sync();
    	gets(surname);
    	fout << "\nSurname: " << surname << endl;
    	cout << "\nEnter worker's experience (in hours): ";
    	cin >> exp;
    	fout << "Experience (in hours): " << exp << endl;
    	cout << "\nEnter worker's salary per hour: ";
    	cin >> hoursalary;
    	fout << "Salary per hour: " << hoursalary << endl;
    	fout << "Resulting salary: " << Workers::GetTotalSalary(hoursalary, exp) << endl;
    	fout << "Bonus: " << Workers::GetBonus(exp, hoursalary) << endl << endl;
    	fout.close();
    }
    
    void Workers::Show_data()
    {
    	ifstream fin("Workers.txt");
    	if (!fin.is_open())
    		cout << "Can't open the file!\n";
    	else
    	{
    		cout << "\nSaved information";
    		char ch;
        	while (fin.get(ch))
            	cout<<ch;
    	fin.close();
    	cout << "All information has saved in file 'Workers.txt'\n\n";
    	}
    }
    
    void Workers::Delete_data()
    {
    	ofstream fout("Workers.txt", ios_base::trunc);
    }
    
    float Workers::GetBonus(float exp, float hoursalary) const
    {
    	if (exp < 1000)	return 0;
    	else if (exp < 2000) return (0.05 * Workers::GetTotalSalary(hoursalary, exp));
    	else if (exp < 3000) return (0.08 * Workers::GetTotalSalary(hoursalary, exp));
    	else if (exp >= 3000) return (0.15 * Workers::GetTotalSalary(hoursalary, exp));
    }
    
    int main()
    {
    	int answer(0);
    	while (true)
    	{
    		do
    		{
    			cout << "What will we do now?\n1 - Add new employee\n2 - Show all information\n3 - Delete all information\n4 - Exit\n";
    			cin >> answer;
    		}
    		while (answer < 1 || answer > 4);
    
    		if (answer == 1)
    		{
    			Workers *NewWorker = new Workers;
    			NewWorker->Add_data();
    			delete NewWorker;
    		}
    	
    		if (answer == 2)
    		{
    			Workers *NewWorker = new Workers;
    			NewWorker->Show_data();
    			delete NewWorker;
    		}
    	
    		if (answer == 3)
    		{
    
    			Workers *NewWorker = new Workers;
    			NewWorker->Delete_data();
    			delete NewWorker;	
    			cout << "All information has been deleted\n";
    		}
    	
    		if (answer == 4)
    		{
    			cout << "\nGood bye!";
    			return 0;
    		}
    	}
    }
  4. CppStudnet

    CppStudnet

    Вполне адекватно

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    class employee {
    public:
    	employee(){												
    		cout << "Имя: "; cin >> Name;						
    		cout << "Стаж: "; cin >> Experience;
    		cout << "Зарплата в час: "; cin >> Hourly_Wag;
    		cout << "Часов отработано: "; cin >> Hours;
    		Salary = Hourly_Wag*Hours;
    		switch (Experience)
    		{
    		case 0:  Premy = 0;
    		case 1:  Premy = Salary * 0.05; break;
    		case 2:  Premy = Salary * 0.05; break;
    		case 4:  Premy = Salary * 0.08; break;
    		case 5:  Premy = Salary * 0.08; break;
    		default: Premy = Salary * 0.15; break;
    		}
    	}																						
    	void print(employee&x){
    		cout << "\nИмя: "              << x.Name 
    			 << "\nСтаж: "             << x.Experience 
    			 << "\nЗарплата в час:"    << x.Hourly_Wag
    		     << "\nЧасов отработано: " << x.Hours 
    			 << "\nЗарплата: "		   << x.Salary 
    			 << "\nПремия: "		   << x.Premy << endl;
    	}
    	void fprint(employee&x){
    		ofstream F("Emplpyers.txt", ios::app);
    		F   << Name << "\nСтаж: "  << Experience 
    			<< "\nЗарплата в час: "  << Hourly_Wag 
    			<< "\nЧасов отработал: " << Hours      
    			<< "\nЗарплата: "        << Salary     
    			<< "\nПремия: "          << Premy      << endl << endl;
    		F.close();
    	}
    private:
    	string Name;
    	int Experience;
    	int Hourly_Wag;
    	int Hours;
    	int Salary;
    	double Premy;
    
    };
    int main()
    {
    	setlocale(LC_ALL, "Rus");
    	employee x;
    	x.print(x);
    	x.fprint(x);
    	return 0;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.