Mục tiêu: class và sự thừa kế
Bài tập 1: Xây dựng lớp Thí Sinh gồm các thuộc tính sau: Họ Tên, điểm toán, lý, hóa; và có các pt sau:
- Nhập/Xuất thông tin thí sinh gồm: Họ Tên, điểm toán, lý, hóa. Mỗi thuộc tính nên có hàm nhập xuất riêng.
- Tính tổng điểm thi.
Dùng lớp Thí Sinh, viết chương trình nhập một số n. Sau đó khởi tạo và nhập vào một mảng n Thí Sinh. In ra danh sách các thí sinh trúng tuyển biết rằng thí sinh trúng tuyển có tổng điểm >= 15 và không có môn nào bị 0 điểm.
Hướng dẫn:
B1: Như bài 1 của Assign 1
B2: Như bài 1 của Assign 1. Chú ý ta nên đặt tên cho file là bai5_1.cpp
B3: Trên màn hình soạn thảo, đánh 2 dòng sau để khai báo thư viện cho chương trình:
	#include   	// thu vien cho ham cin va cout
	#include   	// thu vien cho ham getch
	
B4: Thực thi lớp Thi Sinh như sau
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	class Thi_Sinh
	{
	// khai bao cac thuoc tinh cua lop Thi Sinh
	private:	// cac thuoc tinh nen la private, ko duoc truy cap truc tiep
	char hoten[40];
	int diem_T;
	int diem_L;
	int diem_H;

	// cac Phuong thuc nhap cho cac thuoc tinh cua lop Thi Sinh
	public:	// cac Phuong thuc nhap, xuat phai duoc truy cap truc tiep
	Thi_Sinh();
	void nhap_hoten(char *ht);
	void nhap_diem_T(int t);
	void nhap_diem_L(int l);
	void nhap_diem_H(int h);

	// cac Phuong thuc xuat cho cac thuoc tinh cua lop Thi Sinh
	char* xuat_hoten();
	int xuat_diem_T();
	int xuat_diem_L();
	int xuat_diem_H();
	
	// phuong thuc tinh tong cac diem cua thi sinh va phuong thuc nay cung la public
	int tong_diem()
	};
B5: Thực thi từng phương thức trong lớp Thí Sinh
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	#include   // bo sung thu vien string.h cho viec copy chuoi

	class Thi_Sinh
	{
	... //nhu trong B4
	}

	// thuc thi Phuong thuc khoi tao cua lop Thi Sinh
	Thi_Sinh::Thi_Sinh()
	{
	strcpy(hoten,"");
	diem_T=0;
	diem_L=0;
	diem_H=0; 
	}
	// thực thi các phương thức nhap của lớp Thí sinh
	void Thi_Sinh::nhap_hoten (char *ht)
	{
		strcpy(hoten , ht);
	}

	void Thi_Sinh::nhap_diem_T (int t)
	{
		diem_T = t;
	} 

	void Thi_Sinh::nhap_diem_L (int l)
	{
		diem_L = l;
	} 

	void Thi_Sinh::nhap_diem_H (int h)
	{
		diem_H = h;
	}

	// thực thi các phương thức xuat của lớp Thí sinh
	Char* Thi_Sinh::xuat_hoten ()
	{
		return hoten;
	}

	int Thi_Sinh::xuat_diem_T ()
	{
		return diem_T;
	} 

	int Thi_Sinh::nhap_diem_L ()
	{
		return diem_L;
	} 

	int Thi_Sinh::nhap_diem_H ()
	{
		return diem_H;
	}
	// thực thi các phương thức tong diem của lớp Thí sinh
	int Thi_Sinh::tong_diem()
	{
		return diem_T + diem_L + diem_H; 
	}
B6: Sau khi ta đã thực thi xong lớp Thí Sinh, giờ ta sẽ viết code hàm main để sử dụng lớp Thí Sinh ta vừa tạo ra
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	#include   // bo sung thu vien string.h cho viec copy chuoi

	class Thi_Sinh
	{
	... //nhu trong B4
	}

	// thực thi các phương thức nhap của lớp Thí sinh
	... // nhu trong B5

	// thực thi các phương thức xuat của lớp Thí sinh
	... // nhu trong B5

	// thực thi các phương thức tong diem của lớp Thí sinh
	...// nhu trong B5

	void main ()
	{
	Thi_Sinh *a=NULL;
	int n=0, i=0, tam=0;
	char ht[40];
	cout << "nhap vao so luong thi sinh can tao ra";
	cin >> n;
	a = new Thi_Sinh[n];
	for (i = 0; i < n; i++)
	{
	cout << ”nhap ten cho thi sinh thu” << i;
	cin.getline(ht,40);
	a[i].nhap_hoten(ht);
	cout << "nhap diem Toan cho thi sinh thu" << i;
	cin >> tam;
	a[i].nhap_diem_T(tam);
	cout << ”nhap diem Ly cho thi sinh thu ”<> tam;
	a[i].nhap_diem_L(tam);
	cout << ”nhap diem Hoa cho thi sinh thu ”<> tam;
	a[i].nhap_diem_H(tam);
	}
	cout << "danh sach cac thi sinh trung tuyen";
	for (i = 0; i < n; i++)
	{
	if (a[i].tong_diem()>= 15 && a[i].xuat_diem_T()>0 && a[i].xuat_diem_L() >0 && a[i].xuat_diem_H() >0)
		{
		cout << a[i].xuat_hoten() << endl;
		}
	}
	getch();
	}
B7: Nhấn F2 để lưu chương trình trước khi chạy và biên dịch
B8: Nhấn Ctrl+F9 để chạy chương trình. Kết quả như bên dưới.
Bài tập 2: Xây dựng lớp hình chữ nhật và lớp hình vuông thừa kế lớp hcn. Lớp hình chữ nhật gồm 2 thuộc tính chiều dài, chiều rộng và các phương thức nhập/xuất cho các thuộc tính, in ra diện tích và chu vi của hình vuông. Lớp hv có phương thức khởi tạo để gán các giá trị ban đầu cho cạnh hình vuông. Viết chương trình dùng lớp hv, nhập vào cạnh hình vuông, in ra diện tích, chu vi.
Gợi ý: lớp hình vuông không cần thuộc tính thêm, chúng ta chỉ cần sử dụng hàm tạo của lớp hình chữ nhật một cách hợp lý.
Bài tập 3: Xây dựng lớp ptbn và lớp ptbh, thừa kế lớp ptbn. Lớp ptbn gồm 2 thuộc tính b,c và phương thức giai phương trình bật nhất (bx +c = 0). Lớp ptbh chỉ cần có dữ liệu a và các phương thức sau:
- Phương thức khởi tạo gán trị ban đầu cho a, b, c
- Phương thức gpt, để giải phương thức bậc hai. Trường hợp a=0, gọi gpt của lớp ptbn
Viết chương trình dùng lớp ptbh, nhập vào hệ số của ptbh, hiện kết quả.
Hướng dẫn giải:
B1: Như bài 1
B2: Như bài 1
B3: Như bài 1
B4: Thực thi lớp ptbn như sau:
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	#include   // bo sung thu vien string.h cho viec copy chuoi

	class ptbn
	{
		protected: 		//de lop con la ptbh thua ke duoc b,c
		float b,c;
		public:
		ptbn(float m=0, float n=0); 	//pt khoi tao
		void nhap();
		void xuat();
		void gpt();
	};

	// thực thi phương thức khởi tạo của lớp ptbn
	ptbn::ptbn(float m, float n)
	{
		b=m; c=n;
	}

	// thực thi phương nhập của lớp ptbn
	void ptbn::nhap(float x, float y)
	{
		b=x;
		c=y
	}

	// thực thi phương thức xuất của lớp ptbn
	void ptbn::xuat()
	{
		cout << b << "*X" << (( c>=0 )?"+":"") << c << "=0";   //2*X+-3=0
	}
	// thực thi phương thức giải phương trình cho lớp ptbn
	void ptbn::gpt()	//bx+c=0
	{
		if (b!=0) cout << endl << "x= "<<-c/b;
		else
			if (c!=0) cout << endl << "Vo nghiem";   //c<>0
			else cout << endl << "Vo so nghiem";     //c=0
	}
B5: Thực thi lớp ptbh kế thừa lớp ptbn
	#include   // thu vien cho ham cin va cout
	#include   // thu vien cho ham getch
	#include   // bo sung thu vien string.h cho viec copy chuoi
	#include    // bo sung thu vien cho ham sqrt

	class ptbn
	{
	   ... // như B4
	};

	// thực thi phương thức khởi tạo của lớp ptbn
	   ... // như B4

	// thực thi phương nhập của lớp ptbn
	   ... // như B4

	// thực thi phương thức xuất của lớp ptbn
	   ... // như B4

	// thực thi phương thức giải phương trình cho lớp ptbn
	   ... // như B4

	class ptbh: public ptbn   // ke thua lop ptbn
	{
		private:
		float a;
		public:
		ptbh(float a1=0, float b1=0, float c1=0); //pt khoi tao
		void nhap();
		void xuat();
		void gpt();
	};

	// thực thi phương thức khởi tạo cho lớp ptbh
	ptbh::ptbh(float a1, float b1, float c1): ptbn(b1, c1) // gọi pt khởi tạo 										//của lớp ptbn
	{
		a=a1;
	}
	// thực thi phương thức nhập cho lớp ptbh
	void ptbh::nhap()
	{
		cin>>a; 
		ptbn::nhap();	// goi phương thức của ptbn để nhap b,c
	}

	// thực thi phương thức xuất cho lớp ptbh
	void ptbh::xuat()
	{
		cout << a << "*X*X" << ((b>=0)?"+":"") << b << "*X" <<((c>=0)?"+":"") << c << "=0";
	}

	// thực thi phương thức giai Phuong trinh cho lớp ptbh
	void ptbh::gpt()
	{
		if (a==0) ptbn::gpt(); //goi gpt bn
		else
		{
		float d=b*b-4*a*c;  //tinh delta
		if (d>0) cout << endl << "x1=" << (-b+sqrt(d))/(2*a) <<", "<<"x2="<<(-b-sqrt(d))/(2*a);
		else
			if (d==0) cout<< endl << "x1=x2="<<-b/(2*a);
			else cout<< endl << "Vo nghiem";
		}
	}
B6: Nhấn F2 để lưu chương trình trước khi biên dịch
B7: Nhấn Ctrl+F9 để biên dịch và chạy chương trình. Kết quả như hình sau
Bài tập 4: Xây dựng lớp điểm gồm 2 thuộc tính x, y và các phương thức nhập/ xuất cho mỗi thuộc tính. Xây dựng lớp đoạn thẳng kế thữa lớp điểm và có 2 thuộc tính a, b là tọa độ điểm thứ hai và có các phương thức sau
- Phương thức khởi tạo gán trị ban đầu cho x, y va a, b
- Phương thức nhập, xuất toạ độ của đoạn thẳng
- Phương thức tính chiều dài đoạn thẳng
- Phương thức kiểm tra 2 đoạn thẳng song song

Viết chương trình dùng lớp đoạn thẳng, nhập toạ độ của hai đoạn thẳng, cho biết hai đoạn thẳng song song hay không?
Gợi ý: 2 đường thẳng song song nếu như thỏa mãn công thức sau:
(d1.x2 – d1.x1)*(d2.b2 - d2.b1) = (d1.y2-d1.y1)*(d2.a2-d2.a1)
Trong đó d1 được tạo thành từ 2 điểm là (x1,y1) và (x2,y2), d2 được tạo thành từ 2 điểm (a1,b1) v (a2,b2).