Bài tập

Bạn hãy tạo 4 lớp Book, Person, Children, Adult với các thông tin như sau:

Giải thích:

Lớp Book:

  • nameBook, nameAuthor, numberBook lần lượt là các thuộc tính chỉ tên, tác giả, số lượng sách có phạm vi truy cập private.
  • Book() là phương thức khởi tạo không tham số.
  • Book(nameBook: string, nameAuthor: string, numberBook: int) là phương thức khởi tạo 3 tham số.
  • display(): void là phương thức hiển thị thông tin Book ra màn hình. Ví dụ nameBook = "O Alquimista", nameAuthor = "Paulo Coelho", numberBook = 1000 thì sau khi gọi phưng thức display() màn hình sẽ hiển thị:
Name Book: O Alquimista
Name Author: Paulo Coelho
Number Book: 1000
  • Các phương thức còn lại là các gettersetter.

Lớp Person:

  • Person là lớp trừu tượng thể hiện cho một độc giả, ở đây các lớp ChildrenAdult kế thừa class Person để chỉ độc giả là trẻ em và người lớn.
  • name, age, add, vb lần lượt là các thuộc tính chỉ tên, tuổi, địa chỉ và danh sách các cuốn sách mượn của độc giả 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, vb: vector<Book>) là phương thức khởi tạo 4 tham số.
  • moneyPay(): virtual long = 0 là phương thức thuần ảo tính toán số tiền phải trả của độc giả.
  • display(): virtual void là phương thức ảo để hiển thị thông tin Person. Các bạn tham khảo code phía dưới.
virtual void display()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
		cout << "Add: " << add << endl;
		cout << "List Book Borrowed:" << endl;
		for (int i = 0; i < vb.size(); i++)
		{
			vb[i].display();
		}
		cout << "Money Pay: " << moneyPay() << endl;
	}
  • sortPersonAge(&vt: vector<Person*>): static voidphương thức tĩnh sắp xếp các độc giả theo thứ tự tăng dần của tuổi.
  • getListAge(vt: vector<Person*>): static vector<int>phương thức tĩnh trả về một vector chứa độ tuổi không lặp của các độc giả. Ví dụ có tuổi 14, 14, 15, 16, 15 thì trả về một vector chứa các phần tử 14, 15, 16.
  • getMaxBookBorrowed(vp: vector<Person*>, vB: vector<Book>): static vector<Book> là phương thức tĩnh trả về danh sách các cuốn sách được mượn nhiều nhất.

Lớp Children:

  • Children là lớp thể hiện cho độc giả trẻ em kế thừa public của class Person. Do là lớp kế thừa lớp trừu tượng nên các phương thức thuần ảo chúng ta cần phải bắt buộc định nghĩa lại.
  • Children() là phương thức khởi tạo không tham số.
  • Children(name: string, age: int, add: string, vb: vector<Book>) là phương thức khởi tạo 4 tham số.
  • moneyPay(): long là phương thức trả về số tiền phải trả khi mượn sách theo công thức (số sách mượn)*5000.
  • display(): void là phương thức hiển thị thông tin của độc giả trẻ em. Các bạn xem mẫu code dưới:
void display()
	{
		cout << "Children!" << endl;
		Person::display();
	}

Lớp Adult:

  • Adult là lớp thể hiện cho độc giả người lớn kế thừa public của class Person. Do là lớp kế thừa lớp trừu tượng nên các phương thức thuần ảo chúng ta cần phải bắt buộc định nghĩa lại.
  • Adult() là phương thức khởi tạo không tham số.
  • Adult(name: string, age: int, add: string, vb: vector<Book>) là phương thức khởi tạo 4 tham số.
  • moneyPay(): long là phương thức trả về số tiền phải trả khi mượn sách theo công thức (số sách mượn)*10000.
  • display(): void là phương thức hiển thị thông tin của độc giả người lớn. Các bạn xem mẫu code dưới:
void display()
	{
		cout << "Adult!" << endl;
		Person::display();
	}

Mình sẽ dùng hàm main tương tự phía dưới để test các phương thức:

int main()
{
	Book a("Pride and Prejudice", "Jane Austen", 100);
	Book b("Crime and Punishment", "Fyodor Dostoyevsky", 1000);
	vector<Book> all;
	all.push_back(a);
	all.push_back(b);
	vector<Book> vb, v;
	v.push_back(b);
	v.push_back(a);
	vb.push_back(a);
	Person* x[4];
	x[0] = new Children("a", 9, "HN", vb);
	x[1] = new Adult("b", 20, "NM", vb);
	x[2] = new Children("c", 8, "HN", v);
	x[3] = new Children("d", 9, "NB", v);
	vector<Person*> p;
	p.push_back(x[0]);
	p.push_back(x[1]);
	p.push_back(x[2]);
	p.push_back(x[3]);
	for (int i = 0; i < p.size(); i++)
	{
		p[i]->display();
	}
	Person::sortPersonAge(p);
	
	vector<int> str(Person::getListAge(p));

	vector<Book> res(Person::getMaxBookBorrowed(p, all));

	return 0;
}

Hướng dẫn:

Lớp Book.cpp

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

class Book {
private:
	string nameBook;
	string nameAuthor;
	int numberBook;
public:
	Book() {}
	Book(string nameBook, string nameAuthor, int numberBook)
	{
		this->nameBook = nameBook;
		this->nameAuthor = nameAuthor;
		this->numberBook = numberBook;
	}

	void display()
	{
		cout << "Name Book: " << this->nameBook << endl;
		cout << "Name Author: " << this->nameAuthor << endl;
		cout << "Number Book: " << this->numberBook << endl;
	}
	int getNumberBook()
	{
		return this->numberBook;
	}
	string getNameBook()
	{
		return this->nameBook;
	}
	string getNameAuthor()
	{
		return this->nameAuthor;
	}
};

Lớp Person.cpp

#pragma once
#include <vector>
#include <algorithm>
#include "Book.cpp"
class Person {
private:
	string name;
	int age;
	string add;
	vector<Book> vb;
public:
	Person() {}
	Person(string name, int age, string add, vector<Book> vb) : name(name), age(age), add(add), vb(vb) {}
	string getName()
	{
		return name;
	}
	int getAge()
	{
		return age;
	}
	string getAdd()
	{
		return add;
	}
	vector<Book> getVB()
	{
		return vb;
	}
	virtual long moneyPay() = 0;
	virtual void display()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
		cout << "Add: " << add << endl;
		cout << "List Book Borrowed:" << endl;
		for (int i = 0; i < vb.size(); i++)
		{
			vb[i].display();
		}
		cout << "Money Pay: " << moneyPay() << endl;
	}
	static void sortPersonAge(vector<Person*>& vt)
	{
		for (int i = 0; i < vt.size() - 1; i++)
		{
			for (int j = i + 1; j < vt.size(); j++)
			{
				if (vt[i]->getAge() > vt[j]->getAge())
				{
					swap(vt[i], vt[j]);
				}
			}
		}
	}
	static vector<int> getListAge(vector<Person*>vt)
	{
		vector<int> str;
		for (int i = 0; i < vt.size(); i++)
		{
			if (!(find(str.begin(), str.end(), vt[i]->getAge()) != str.end()))
			{
				str.push_back(vt[i]->getAge());
			}
		}
		return str;
	}
	static vector<Book> getMaxBookBorrowed(vector<Person*>vp, vector<Book> vB)
	{
		vector<int> count(vB.size(), 0);
		for (int i = 0; i < vB.size(); i++)
		{
			for (int j = 0; j < vp.size(); j++)
			{
				vector<Book> b(vp[j]->getVB());
				for (int k = 0; k < b.size(); k++)
				{
					if (vB[i].getNameBook() == b[k].getNameBook())
					{
						count[i]++;
					}
				}
			}
		}
		int max = *max_element(count.begin(), count.end());
		vector<Book> res;
		for (int i = 0; i < vB.size(); i++)
		{
			if (count[i] == max)
			{
				res.push_back(vB[i]);
			}
		}
		return res;
	}
};

Lớp Children.cpp

#pragma once
#include "Person.cpp"
class Children : public Person {
public:
	Children() {}
	Children(string name, int age, string add, vector<Book> vb) : Person(name, age, add, vb) {}
	long moneyPay()
	{
		return this->getVB().size() * 5000;
	}
	void display()
	{
		cout << "Children!" << endl;
		Person::display();
	}
};

Lớp Adult.cpp

#pragma once
#include "Person.cpp"
class Adult : public Person {
public:
	Adult() {}
	Adult(string name, int age, string add, vector<Book> vb) : Person(name, age, add, vb) {}
	long moneyPay()
	{
		return this->getVB().size() * 10000;
	}
	void display()
	{
		cout << "Adult!" << endl;
		Person::display();
	}
};