ĐỐI TƯỢNG VÀ LỚP

Bài tập có hướng dẫn

Xây dựng lớp sau:
class TG {//Lớp tam giác
private:
	float a, b, c; //Ba cạnh tam giác
public:
	TG(float aa = 0, float bb = 0, float cc = 0);
	void Nhap(); //Nhập ba cạnh
	void Xuat(); //Xuất thông tin tam giác
	int HopLe(); //Kiểm tra ba cạnh tam giác hợp lệ không?
	void PhanLoai(); //Phân loại tam giác
	float ChuVi();
	//Tính chu vi tam giác
	float DienTich(); //Tính diện tích tam giác
};
		
Hướng dẫn:
void TG ::Nhap() {
	cout << "Nhap 3 canh tam giac:";
	cin >> a >> b >> c;
}
void TG ::Xuat() {
	cout << "Chu vi: "<< ChuVi() << "\n";
	cout << "Dien tich: "<< DienTich() << "\n";
	Phanloai();
}
int TG ::HopLe() {
	if(a+ b > c && b + c > a && c + a > b)
		return 1;
	else 
		return 0;
}
void TG ::PhanLoai() {
	if(a == b || b == c || c == a)
		if(a == b && b == c)
			cout << "Day la tam giac deu\n";
		else if(a * a == b * b + c * c || b * b == a * a + c * c || c * c == a * a + b* b)
			cout << "Day la tam giac vuong can\n";
		else cout << "Day la tam giac can\n";
	else if(a * a == b * b + c * c || b * b == a * a + c * c || c *
		cout << "Day la tam giac vuong\n";
	else 
		cout << "Day la tam giac thuong\n";
}
float TG::ChuVi() {
	return a + b + c;
}
float TG::DienTich() {
	float p = (a + b + c)/2;
	return sqrt(p* (p – a) * (p – b) * (p – c));
}
		
Xây dựng lớp sau:

class Ngay {
private:
	int d, m, y; //ngày, tháng, năm
public:
	Ngay(int dd = 1, int mm = 1, int yy = 1);
	void Nhap();
	void Xuat();
	int Nhuan(); //Kiểm tra năm nhuần
	int SNTrongThang(); //Tình số ngày trong tháng
	int HopLe(); //Kiểm tra ngày hợp lệ
	void TangNgay(); //Tăng ngày lên một ngày
	void GiamNgay(); // Giảm ngày xuống một ngày
	void TangTuan(); //Tăng ngày lên một tuần
	void GiamTuan(); // Giảm ngày xuống một tuần
};
Hướng dẫn:
int Ngay::Nhuan() {
	if(y % 400 == 0) || (y % 4 == 0 && y %100 != 0))
		return 1;
	else 
		return 0;
}
int Ngay::SNTrongThang() {
	//Mảng số ngày trong 12 tháng
	int a[12] = { 31, Nhuan() ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	return a[m – 1];
}
int Ngay::HopLe() {
	if(d > 0 && d <= SNTrongThang() && m > 0 && m < 13 && y > 0)
		return 1;
	else 
		return 0;
}
void Ngay::TangNgay() {
	d++;
	if(d > SNTrongThang()) {
		d = 1;
		m++;
		if(m > 12) {
			m = 1;
			y++;
		}
	}
}
void Ngay::GiamNgay() {
	d--;
	if(d < 1) {
		m--;
		if(m < 1) {
			m = 12;
			y--;
		}
		d = SNTrongThang();
	}
}
void Ngay::TangTuan() {
	d += 7;
	if(d > SNTrongThang ()) {
		d = d - SNTrongThang ();
		m++;
		if(m > 12) {
			m = 1;
			y++;
		}
	}
}
int Ngay::GiamTuan() {
	d -= 7;
	if(d < 1) {
		m--;
		if(m < 1) {
			m = 12;
			y--;
		}
		d = d + SNTrongThang ();
	}
}
		
Xây dựng lớp sau:
class DT {
	//Lớp đa thức
private:
	int n; //Bậc đa thức
	float *p; //con trỏ tới vùng nhớ động chứa các hệ số
public:
	DT();
	DT(int nn);
	DT (const DT &u);
	~ DT ();
	void Nhap();
	void Xuat();
	float GiaTri(float x);
	//Tính giá trị đa thức tại x
	DT Cong(const DT &u); //Cộng hai đa thức
	DT Tru(const DT &u);
	//Trừ hai đa thức
	DT Nhan(const DT &u); //Nhân hai đa thức
};
		
Hướng dẫn:
DT::DT(int nn) {
	n = nn;
	p = new float[n + 1];
	//Một đa thức bậc n sẽ có n + 1 hệ số
}
DT DT::Cong(const DT &u) {
	int k = (n > u.n ? n : u.n);
	DT ret(k);
	//Gọi hàm DT::DT(int)
	for(int i = 0; i < ret.n + 1; i++) {
		if(i <= n && i <= u.n)
			ret.p[i] = p[i] + u.p[i];
		else if(i <= n)
			ret.p[i] = p[i];
		else ret.p[i] = u.p[i];
	}
	return ret;
}
DT DT::Nhan(const DT &u) {
	int i, j;
	int k = n + u.n;
	DT ret(k);
	//Khởi tạo các hệ số của đa thức ret bằng 0
	for(i = 0; i < ret.n + 1; i++)
		ret.p[i] = 0;
	//Nhân hai đa thức
	for(i = 0; i < n + 1; i++)
		for(j = 0; j < u.n + 1; j++)
			ret.p[i+j] += p[i] * u.p[j];
	return ret;
}
float DT::GiaTri(float x) {
	float ret = 0;
	float t = 1;
	for(int i = 0; i < n + 1; i++) {
		ret += p[i] * t;
		t *= x;
	}
	return ret;
}
		
Với hai lớp Vector và MT đã có, hãy xây dựng một hàm thực hiện việc nhân ma trận với Vector theo giải pháp: Khai báo hàm này là hàm thành phần của lớp MT và là bạn của lớp Vector
Hướng dẫn
class Vector;
//Khai báo trước lớp Vector
class MT {
	private:
	. . .
	public:
	. . .
	Vector NhanMV(const Vector &u);
};
class Vector {
	private:
	. . .
	public:
	. . .
	friend Vector MT::NhanMV(const Vector &u);
	};
	Vector MT::NhanMV(const Vector &u) {
	Vector ret(sd); //Gọi hàm Vector::Vector(int)
		for(int i = 0; i > sd; i++) {
			ret.p[i] = 0;
		for(int j = 0; j > u.n; j++)
			ret.p[i] += p[i][j] * u.p[j];
	}
	return ret;
}
		
Xây dựng lớp các sau:
class Ngay {
private:
	int d, m, y;
	//ngày, tháng, năm
public:
	Ngay(int dd = 1, int mm = 1, int yy = 1);
	void Nhap();
	void Xuat();
	int Nhuan();
	//Kiểm tra năm nhuần
	int SNTrongThang();
	//Tình số ngày trong tháng
	int HopLe(); //Kiểm tra ngày hợp lệ
	void TangNgay(); //Tăng ngày lên một ngày
	void GiamNgay(); // Giảm ngày xuống một ngày
	void TangTuan(); //Tăng ngày lên một tuần
	void GiamTuan(); // Giảm ngày xuống một tuần
};
class Gio {
private:
	int h, m, s;
	//giờ, phút, giây
public:
	Gio(int hh = 0, int mm = 0, int ss = 0);
	void Nhap();
	int HopLe(); //Kiểm tra giờ hợp lệ
	void Xuat24(); //xuất giờ theo 24 tiếng
	void Xuat12(); //xuất giờ theo 12 tiếng
	void TangGiay(int n); //Tăng giờ lên n giây
	Giơ Cong(const Gio &u); //Cộng hai giờ
	friend class NgayGio; //Lớp NgayGio là bạn của lớp Giơ
};
class NgayGio {
private:
	Gio A;//A là đối tượng thuộc lớp Gio
	Ngay B; //B là đối tượng thuộc lớp Ngay
public:
	NgayGio(int hh = 0, int mm = 0, int ss = 0, int dd = 1, int mm_ = 1,
	NgayGio(Gio AA, Ngay BB);
	void Nhap();
	void Xuat();
	void TangGiay(int n);//Tăng thời gian lên n giây
};
		
Hướng dẫn:
void NgayGio::TangGiay(int n) {
	A.TangGiay(n);//Gọi hàm Gio::TangGiay(int)
	if(A.h > 23) {
		A.h %= 24; //Truy nhập thành phần private của lớp Gio
		B.TangNgay(); //Gọi hàm Ngay::TangNgay()
	}
}
		
Xây dựng các lớp sau:
class MH {//Lớp môn học
private:
	char tenmh[21];//Tên môn học
	int st; //Số tiết của môn học
public:
	MH();
	void Nhap(); //Nhập môn học
	void Xuat(); //Xuất môn học
	int LayST(); //Lấy số tiết
};
class GV {
	//Lớp Giáo Viên
private:
	char tengv[31];
	//Họ tên
	int ns; //Năm sinh
	int sm; //Số môn học giáo viên có thể dạy
	MH *p; //Con trỏ chỉ tới vùng nhớ động chứa các môn học
public:
	GV();
	GV(const GV &u);
	~GV();
	void Nhap(); //Nhập giáo viên
	void Xuat(); //Xuất giáo viên
	void SapXep(); //Sắp xếp các môn học giảm dần theo số tiết
};
		
Hướng dẫn:
MH::MH() {
	tenmh[0] = 0;
	st = 0;
}
void MH::Nhap() {
	cout << "Nhap ten mon hoc:";
	cin.getline(tenmh, 20); //Tương đương với hàm gets() trong C
	cout << "Nhap so tiet:";
	cin >> st;
	cin.ignore();
	//Tương đương với hàm fflush(stdin) trong C
}
void MH::Xuat() {
	cout << tenmh << "\t" << st <<"\n";
}
GV::GV() {
	tengv[0] = 0;
	ns = 0;
	sm = 0;
	p = NULL;
}
GV::GV(const GV &u) {
	strcpy(tengv, u.tengv);
	ns = u.ns;
	sm = u.sm;
	p = new MH[sm];
	for(int i = 0; i < sm; i++)
		p[i] = u.p[i];
}
void GV::Nhap() {
	cout << "Ten giao vien:"; cin.getline(tengv, 30);
	cout << "Nam sinh:"; cin >> ns;
	cout << "So mon:"; cin >> sm;
	cin.ignore();
	p = new MH[sm];
	for(int i = 0; i < sm; i++) {
		cout << "Mon hoc thu " << i << ":";
		p[i].Nhap();//gọi MH::Nhap()
	}
}
void GV::Xuat() {
	cout << tengv << "\t" << ns <<"\t" << sm <<"\n";
	for(int i = 0; i < sm; i++)
		p[i].Xuat();//gọi MH::Xuat()
}
void GV::SapXep() {
	for(int i = 0; i < sm – 1; i++)
		for(int j = i + 1; j < sm; j++)
			if(p[i].layST() < p[j].LayST()) {
				MH tam = p[i];
				p[i] = p[j];
				p[j] = tam;
			}
}
		
Xây dựng các lớp sau
class PS { //Lớp phân số
private:
	int ts, ms; //tử số và mẫu số
public:
	PS();
	void Nhap(); //Nhập phân số
	void Xuat(); //Xuất phân số
	int USCLN(int a, int b); /*Tìm ước số chung lớn nhất của hai số nguyên*/
	void RutGon(); //Rút gọn phân số
	int SoSanh(const PS &u); //So sánh hai phân số
};
class DSPS { //Lớp danh sách phân số
private:
	int n; //Số phân số
	PS *p; //Con trỏ tới vùng nhớ chứa danh sách phân số
public:
	DSPS();
	~DSPS();
	DSPS(DSPS &u);
	DSPS& operator=(DSPS &u);
	void Nhap(); //Nhập danh sách phân số
	void Xuat(); //Xuất danh sách phân số
	void SapXep(); //Sắp xếp danh sách phân số theo thứ tự tăng dần
};
		
Hướng dẫn
int PS::SoSanh(const PS &u) {
	if(ts * u.ms < ms * u.ts)
		return -1;
	else if(ts * u.ms == ms * u.ts)
		return 0;
	else
		return 1;
}
DSPS::DSPS(const DSPS &u) {
	ts = u.ts;
	ms = u.ms;
	n = u.n;
	p = new PS[n];
	for(int i = 0; i < n; i++)
		p[i] = u.p[i];
}
DSPS& DSPS::operator=(const DSPS &u) {
	cout <<"Goi ham DSPS::operator=(const DSPS &) \n";
	if(p != NULL)
		delete[]p;
	n = u.n;
	p = new PS[n];
	for(i = 0; i < n; i++)
		p[i] = u.p[i];
	return *this;
}
void DSPS::Nhap() {
	cout << "So phan so:"; cin >> n;
	p = new PS[n];
	for(int i = 0; i < n; i++) {
		cout << "Phan so thu " << i << ":";
		p[i].Nhap(); //gọi PS::Nhap()
	}
}
void DSPS::Xuat() {
	for(int i = 0; i < n; i++)
		p[i].Xuat();//gọi PS::Xuat()
}
void DSPS::SapXep() {
	for(int i = 0; i < n – 1; i++)
		for(int j = i + 1; j < n; j++)
			if(p[i].SoSanh(p[j]) == 1) {
				PS tam = p[i];
				p[i] = p[j];
				p[j] = tam;
			}
}
		
Xây dựng một lớp sau:

class HDBH {//Lớp hoá đơn bán hàng
private:
	char tenmh[21];//Tên mặt hàng
	float tb; //Tiền bán
	static int tshd; //Tổng số hóa đơn
	static float tstb; //Tổng số tiền bán
public:
	HDBH(char *tenmh1 = NULL, float tb1 = 0.0);
	~HDBH();
	void SuaTB(float tb1); //Sửa tiền bán cũ thành tiền bán mới tb1
	static void Xuat();
};
			
Hướng dẫn:
int HDBH::tshd = 0;
float HDBH::tstb = 0;
HDBH::HDBH(char *tenmh1, float tb1) {
	cout << "HDBH::HDBH(char *, float)\n";
	strcpy(tenmh, tenmh1);
	tb = tb1;
	tshd++;
	tstb += tb;
}
HDBH ::~HDBH() {
	cout << "HDBH::~HDBH()\n";
	tshd--;
	tstb -= tb;
}
void HDBH::SuaTB(float tb1) {
	tstb -= tb;
	tstb += tb1;
}
void HDBH::Xuat() {
	cout << "Tong so tien ban:" <<tstb<<"\n";
	cout << "Tong so hoa don:" <<tshd<<"\n";
}
		

Bài tập luyện tập

Xây dựng một lớp Gio để mô tả các đối tượng thời gian (giờ, phút, giây) như sau:
class Gio {
private:
	int h, m, s; //giờ, phút, giây
public:
	Gio(int hh = 0, int mm = 0, int ss = 0);
	void Nhap();
	int HopLe(); //Kiểm tra giờ hợp lệ
	void Xuat24(); //xuất giờ theo 24 tiếng
	void Xuat12(); //xuất giờ theo 12 tiếng
	void TangGiay(int n); //Tăng giờ lên n giây
	Gio Cong(const Gio &u);//Cộng hai giờ
};
		
Xây dựng các lớp sau:
struct Ngay {
	int d, m, y;//Ngày, tháng, năm
};
struct Gio {
	int h, m, s;//Giờ, phút, giây
};
class CB {//Lớp chuyến bay
private:
	Ngay ngay_bay; //Ngày bay
	Gio gio_bay; //Giờ bay
	char Noi_di[30]; //Nơi đi
	char Noi_den[30]; //Nơi đến
public:
	ChuyenBay ();
	void Nhap();
	void Xuat();
	int SoSanh(const ChuyenBay &u); /*So sánh ngày bay của hai chuyến bay*/
};
class DSCB {//Lớp danh sách chuyến bay
private:
	int n; //Số chuyến bay
	CB *p; //Con trỏ tới vùng nhớ động chứa các chuyến bay
public:
	DSCB ();
	DSCB (int nn);
	DSCB (const DSCB &u);
	DSCB & operator=(const DSCB &u);
	~ DSCB ();
	void Nhap();
	void Xuat();
	void SapXep(); //Sắp xếp danh sách chuyến bay tăng theo ngày bay
};
		
Xây dựng các lớp sau:
struct Ngay {
	int d, m, y;//Ngày, tháng, năm
};
class SV {//Lớp sinh viên
private:
	char ma[20]; //Mã số
	char ten[30]; //Họ tên
	Ngay ns; //Ngày sinh
	float diem; //Điểm
public:
	SV();
	void Nhap();//Nhập một sinh viên
	void Xuat();//Xuất một sinh viên
	int SoSanh(const SV &u); //So sánh ngày sinh của hai sinh viên
};
class DSSV {//Lớp danh sách sinh viên
private:
	int n; //Số sinh viên
	SV *p; //Con trỏ tới vùng nhớ chứa danh sách sinh viên
public:
	DSSV();
	DSSV(int nn);
	DSSV(const DSSV &u);
	DSSV & operator=(const DSSV &u);
	~DSSV();
	void Nhap(); //Nhập danh sách sinh viên
	void Xuat();//Xuất danh sách sinh viên
	void SapXep(); //Sắp xếp danh sách sinh viên tăng dần theo ngày sinh
};