Bài tập

Bạn hãy tạo 3 lớp People, Family, Group với các thông tin như sau:

Giải thích:

Lớp People:

  • name, age, job, id lần lượt là các thuộc tính chỉ tên, tuổi, nghề nghiệp, mã định danh của mỗi người có phạm vi truy cập private.
  • People() là phương thức khởi tạo không tham số.
  • People(name: string, age: int, job: string, id: string) là phương thức khởi tạo 4 tham số.
  • display(): void là phương thức hiển thị thông tin People ra màn hình. Ví dụ ta có name = "Nguyen Minh Hieu", age = 20, job = "Dev", id =  "1" thì sau khi gọi phương thức display() màn hình hiển thị:
Name: Nguyen Minh Hieu
Age: 20
Job: Dev
Id: 1
  • Các phương thức còn lại là gettersetter.

Lớp Family:

  • Lớp Family để quản lí các thành viên trong gia đình. Một Family có nhiều People.
  • nameF, status, add, p lần lượt là các thuộc tính chỉ tên chủ hộ, thực trạng, địa chỉ, danh sách các thành viên của hộ gia đình có phạm vi truy cập private. Tên chủ hộ được lấy tên của người đầu tiên trong danh sách các thành viên, status có các giá trị là poor, normal, rich tương ứng với hộ nghèo, hộ bình dân, hộ người giàu.
  • Family() là phương thức khởi tạo không tham số.
  • Family(add: string, status: string, p: vector<People>) 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 hộ gia đình ra màn hình. Bạn tham khảo code mẫu bên dưới.
  • getPoorHousehold(fa: vector<Family>): static vector<Family> là phương thức tĩnh đầu vào là danh sách các hộ ra đình và đầu ra là danh sách các hộ gia đình đang có status = "poor".
  • findFamilySurname(fa: vector<Family>,surename: string): static vector<Family> là phương thức tĩnh đầu vào là danh sách các hộ gia đình và tên của chủ hộ bạn muốn tìm; đầu ra là một danh sách các hộ gia đình có tên chủ hộ giống với surename.
  • Các phương thức còn lại là gettersetter.

Lớp Group:

  • Lớp Group dùng để quản lí các hộ gia đình. Một Group có nhiều Family.
  • nameGr, f lần lượt là các thuộc tính chỉ tên phường và danh sách các hộ gia đình có phạm vi truy cập private.
  • Group() là phương thức khởi tạo không tham số.
  • Group(nameGr: string, f: vector<Family>) là phương thức khởi tạo 2 tham số.
  • getNumberFamily(): int là phương thức trả về số hộ gia đình của một Group.
  • avgAgeGroup(v: Group): static double là phương thức tĩnh có đầu vào là một Group và đầu ra là độ tuổi trung bình của Group đó.
  • getPeopleHaveNotJob(g: Group): static vector<People> là phương thức tĩnh đầu vào là một Group đầu ra là một danh sách những người không có công ăn việc làm tức là Job = "".
  • Các phương thức còn lại là gettersetter.

Hướng dẫn

 File People.cpp

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

class People {
private:
	string name;
	int age;
	string job;
	string id;
public:
	People() {}
	People(string name, int age, string job, string id) : name(name), age(age), job(job), id(id) {}
	string getName()
	{
		return name;
	}
	int getAge()
	{
		return age;
	}
	string getJob()
	{
		return job;
	}
	string getId()
	{
		return id;
	}
	void display()
	{
		cout << "Name: " << name << endl;
		cout << "Age: " << age << endl;
		cout << "Job: " << job << endl;
		cout << "Id: " << id << endl;
	}

};

 File Family.cpp

#pragma once
#include "People.cpp"
class Family {
private:
	string nameF;
	string status;
	string add;
	vector<People> p;
public:
	Family()
	{
		nameF = p[0].getName();
	}
	Family(string add,string status, vector<People>p) :add(add), status(status), p(p)
	{
		nameF = p[0].getName();
	}
	string getNameF()
	{
		return nameF;
	}
	string getStatus()
	{
		return status;
	}
	string getAdd()
	{
		return add;
	}
	vector<People> getP()
	{
		return p;
	}
	void display()
	{
		cout << "householder's name: " << nameF << endl;
		cout << "Number Member: " << p.size() << endl;
		cout << "Address: " << add << endl;
		cout << "Status: " << status << endl;
		cout << "List Information Member" << endl;
		for (int i = 0; i < p.size(); i++)
		{
			p[i].display();
		}
	}
	static vector<Family> getPoorHousehold(vector<Family>fa)
	{
		vector<Family> v;
		for (int i = 0; i < fa.size(); i++)
		{
			if (fa[i].getStatus() == "poor")
			{
				v.push_back(fa[i]);
			}
		}
		return v;
	}
	static vector<Family> findFamilySurename(vector<Family>fa, string surename)
	{
		vector<Family> v;
		for (int i = 0; i < fa.size(); i++)
		{
			if (fa[i].getNameF() == surename)
			{
				v.push_back(fa[i]);
			}
		}
                return v;
	}
};

 File Group.cpp

#include "Family.cpp"
class Group {
private:
	string nameGr;
	vector<Family> f;
public:
	Group() {}
	Group(string name, vector<Family> f) : nameGr(name), f(f) {}
	void display()
	{
		cout << "Name Group " << nameGr << endl;
		for (int i = 0; i < f.size(); i++)
		{
			f[i].display();
		}
	}
	vector<Family> getF()
	{
		return f;
	}
	int getNumberFamily()
	{
		return f.size();
	}
	static double avgAgeGroup(Group v)
	{
		vector<Family> F(v.getF());
		double sum = 0;
		int n = 0;
		for (int i = 0; i < F.size(); i++)
		{
			vector<People> P(F[i].getP());
			for (int j = 0; j < P.size(); j++)
			{
				sum += P[j].getAge();
			}
			n += P.size();
		}
		return sum / n;
	}
	static vector<People> getPeopleHaveNotJob(Group g)
	{
		vector<People> v;
		vector<Family> F(g.getF());
		for (int i = 0; i < F.size(); i++)
		{
			vector<People> P(F[i].getP());
			for (int j = 0; j < P.size(); j++)
			{
				if (P[j].getJob() == "")
				{
					v.push_back(P[j]);
				}
			}
		}
		return v;
	}
};