Bài tập

Bạn hãy tạo 3 lớp Person, EmployeePT, EmployeeFT với các thông tin sau:

  

Giải thích:

Lớp Person:

  • name, age, add, tel, sex lần lượt là các thuộc tính chỉ tên người, tuổi, địa chỉ, số điện thoại, giới tính có phạm vi truy cập private.
  • Person() là phương thức khởi tạo không tham số.
  • Person(name: string, age: int, add: string, tel: string, sex: string) là phương thức khởi tạo 5 tham số.
  • display(): virtual void là phương thức hiển thị thông tin Person. Ví dụ name = "Nam", age = 18, sex = "nam", add = "HN", tel = "0123456789" thì sau khi gọi display() màn hình hiển thị:
Name: Nam
Age: 18
Sex: nam
Add: HN
Tel: 0123456789
  • salary(): virtual long = 0 là phương thức thuần ảo tính tiền lương cho nhân viên.
  • findPerson(p: vector<Person *>): static vector<Person*>phương thức tĩnh trả về một vector bao gồm những nhân viên có add = "HN".
    • Với phương thức này mình sẽ dùng hàm main để test như sau:
int main()
{
	vector<Person*> s;
	Person* a[5];
	a[0] = new EmployeeFT("a", 18, "HN", "09842", "nam", 30, 309200);
	a[1] = new EmployeePT("b", 18, "HN", "09842", "nam", 7, 30000);
	a[2] = new EmployeeFT("c", 18, "HN", "09842", "nam", 30, 1200);
	a[3] = new EmployeePT("d", 18, "HB", "09842", "nam", 6, 1200);
	a[4] = new EmployeeFT("e", 18, "NB", "09842", "nam", 30, 130200);
	s.push_back(a[0]);
	s.push_back(a[1]);
	s.push_back(a[2]);
	s.push_back(a[3]);
	s.push_back(a[4]);
	vector<Person*> per(Person::findPerson(s));
}
  • Các phương thức còn lại là gettersetter.

Lớp EmployeePT:

  • Lớp EmployeePT là class kế thừa public từ class Person
  • hour, money lần lượt là số giờ làm việc và số tiền lương/giờ có phạm vi truy cập private.
  • EmployeePT() là hàm tạo không tham số.
  • EmployeePT(name: string, age: int, add: string, tel: string, sex: string, hour: int, money: long) là hàm tạo 7 tham số.
  • display(): void là phương thức hiển thị thông tin EmployeePT. Ví dụ: name = "Nam", age = 18, sex = "nam", add = "HN", tel = "0123456789", hour = 4, money = 1200 thì sau khi gọi display() màn hình hiển thị:
  • Employee Part Time
    Name: Nam
    Age: 18
    Sex: nam
    Add: HN
    Tel: 0123456789
    Hour: 4
    Money: 1200
    Salary: 48000
  • getMaxSalary(pt: vector<EmployeePT>): vector<EmployeePT>phương thức tĩnh trả về một vector bao gồm các nhân viên Part Time có salary nhất.
    • Với phương thức này mình sẽ dùng main test như sau:
    • int main()
      {
      	vector<EmployeePT> e;
      	e.push_back(EmployeePT("a", 18, "HN", "09842", "nam", 7, 30000));
      	e.push_back(EmployeePT("b", 18, "HN", "09842", "nam", 7, 40000));
      	e.push_back(EmployeePT("c", 18, "HN", "09842", "nam", 7, 50000));
      	e.push_back(EmployeePT("d", 18, "HN", "09842", "nam", 7, 60000));
      	e.push_back(EmployeePT("e", 18, "HN", "09842", "nam", 7, 50000));
      	e.push_back(EmployeePT("f", 18, "HN", "09842", "nam", 7, 60000));
      	vector<EmployeePT> pt(EmployeePT::getMaxSalary(e));
      }
  • Các phương thức còn lại là gettersetter.

Lớp EmployeeFT:

  • Lớp EmployeeFT là class kế thừa public từ class Person
  • day, money lần lượt là số ngày làm việc và số tiền lương/ngày có phạm vi truy cập private.
  • EmployeeFT() là hàm tạo không tham số.
  • EmployeeFT(name: string, age: int, add: string, tel: string, sex: string, day: int, money: long) là hàm tạo 7 tham số.
  • display(): void là phương thức hiển thị thông tin EmployeePT. Ví dụ: name = "Nam", age = 18, sex = "nam", add = "HN", tel = "0123456789", day = 30, money = 300000 thì sau khi gọi display() màn hình hiển thị:
  • Employee Full Time
    Name: Nam
    Age: 18
    Sex: nam
    Add: HN
    Tel: 0123456789
    Day: 30
    Money: 300000
    Salary: 9000000
  • getMaxSalary(ft: vector<EmployeeFT>): vector<EmployeeFT>phương thức tĩnh trả về một vector bao gồm các nhân viên Full Time có salary nhất.
    • Với phương thức này mình dùng hàm main để test như sau:
int main()
{
	vector<EmployeeFT> ft;
	ft.push_back(EmployeeFT("a", 18, "HN", "09842", "nam", 10, 309200));
	ft.push_back(EmployeeFT("b", 18, "HN", "09842", "nam", 30, 309200));
	ft.push_back(EmployeeFT("c", 18, "HN", "09842", "nam", 30, 309200));
	ft.push_back(EmployeeFT("d", 18, "HN", "09842", "nam", 15, 309200));
	ft.push_back(EmployeeFT("e", 18, "HN", "09842", "nam", 30, 309200));
	vector<EmployeeFT> f(EmployeeFT::getMaxSalary(ft));
}
  • Các phương thức còn lại là gettersetter.

Hướng dẫn

File Person.cpp

#pragma once
#include <iostream>
#include <vector>
using namespace std;

class Person {
private:
	string name;
	int age;
	string add;
	string tel;
	string sex;
public:
	Person() {}
	Person(string name, int age, string add, string tel, string sex)
	{
		this->name = name;
		this->age = age;
		this->add = add;
		this->tel = tel;
		this->sex = sex;
	}
	string getName()
	{
		return name;
	}
	int getAge()
	{
		return age;
	}
	string getAdd()
	{
		return add;
	}
	string getTel()
	{
		return tel;
	}
	string getSex()
	{
		return sex;
	}
	virtual void display()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
		cout << "Sex: " << sex << endl;
		cout << "Add: " << add << endl;
		cout << "Tel: " << tel << endl;
	}
	virtual long salary() = 0;
	static vector<Person*> findPerson(vector<Person*> p)
	{
		vector<Person*> v;
		for (int i = 0; i < p.size(); i++)
		{
			if (p[i]->add == "HN")
			{
				v.push_back(p[i]);
			}
		}
		return v;
	}
};

File EmployeePT.cpp

#include "Person.cpp"
class EmployeePT : public Person {
private:
	int hour;
	long money;
public:
	EmployeePT() :Person() {}
	EmployeePT(string name, int age, string add, string tel, string sex, int hour, long money) :Person(name, age, add, tel, sex), hour(hour), money(money) {}
	int getHour()
	{
		return hour;
	}
	long getMoney()
	{
		return money;
	}
	long salary()
	{
		return long(hour) * money;
	}
	virtual void display()
	{
		cout << "Employee Part Time" << endl;
		Person::display();
		cout << "Hour: " << hour << endl;
		cout << "Money: " << money << endl;
		cout << "Salary: " << salary() << endl;
	}
	static vector<EmployeePT> getMaxSalary(vector<EmployeePT> pt)
	{
		long max = pt[0].salary();
		for (int i = 1; i < pt.size(); i++)
		{
			if (pt[i].salary() > max)
			{
				max = pt[i].salary();
			}
		}
		vector<EmployeePT> v;
		for (int i = 0; i < pt.size(); i++)
		{
			if (pt[i].salary() == max)
			{
				v.push_back(pt[i]);
			}
		}
		return v;
	}
};

File EmployeeFT.cpp

#include "Person.cpp"
class EmployeeFT : public Person {
private:
	int day;
	long money;
public:
	EmployeeFT() :Person() {}
	EmployeeFT(string name, int age, string add, string tel, string sex, int day, long money) :Person(name, age, add, tel, sex), day(day), money(money) {}
	int getDay()
	{
		return day;
	}
	long getMoney()
	{
		return money;
	}
	long salary()
	{
		return long(day) * money;
	}
	void display()
	{
		cout << "Employee Full Time" << endl;
		Person::display();
		cout << "Day: " << day << endl;
		cout << "Money: " << money << endl;
		cout << "Salary: " << salary() << endl;
	}
	static vector<EmployeeFT> getMaxSalary(vector<EmployeeFT> ft)
	{
		long max = ft[0].salary();
		for (int i = 1; i < ft.size(); i++)
		{
			if (ft[i].salary() > max)
			{
				max = ft[i].salary();
			}
		}
		vector<EmployeeFT> v;
		for (int i = 0; i < ft.size(); i++)
		{
			if (ft[i].salary() == max)
			{
				v.push_back(ft[i]);
			}
		}
		return v;
	}
};