Bài tập Lập trình hướng đối tượng C++

pdf 59 trang phuongnguyen 33270
Bạn đang xem 20 trang mẫu của tài liệu "Bài tập Lập trình hướng đối tượng C++", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_tap_lap_trinh_huong_doi_tuong_c.pdf

Nội dung text: Bài tập Lập trình hướng đối tượng C++

  1. Bài tập lập trình hướng đối tượng C++ BỘ CÔNG THƯƠNG TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP PHÚC YÊN BÀI TẬP LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG C++ CƠ BẢN THỰC HIỆN: TRẦN XUÂN THỨC CN: Trần Xuân Thức - 1- tranxuanthuc.pci@gmail.com
  2. Bài tập lập trình hướng đối tượng C++ I. DẠNG BÀI TẬP MÔ TẢ BẰNG LỜI. Toàn bộ các lớp, các mối quan hệ giữa các lớp được đề bài mô tả bằng lời một cách chi tiết. Dạng này dễ dàng xác định được các lớp của bài và mối quan hệ giữa chúng, các thuộc tính và phương thức trong mỗi lớp. Do vậy ta dễ dàng vẽ một sơ đồ cho mỗi bài (nếu cần). Sau đây là một số bài tập ví dụ: Bài 1.1: Xây dựng lớp Person gồm các thông tin: Họ và tên, Ngày sinh, Quê quán. Sau đó, xây dựng lớp dẫn xuất “Kỹ sư” ngoài các thông tin của lớp Person, lớp kỹ sư còn có các thông tin về: Ngành học, Năm tốt nghiệp (int) và các phương thức: Phương thức nhập: nhập các thông tin của kỹ sư. Phương thức xuất: xuất các thông tin lên màn hình. Xây dựng chương trình chính nhập vào một danh sách các kỹ sư. In danh sách của các kỹ sư lên màn hình và thông tin của các kỹ sư tốt nghiệp gần đây nhất (năm tốt nghiệp lớn nhất). #include #include #include #include class Person { public: char HT[30]; char NS[30]; char Q[30]; }; class Kysu:public Person { public: char NH[30]; int NTN; void nhap(); void xuat(); }; void Kysu::nhap() { cout >NTN; } void Kysu::xuat() CN: Trần Xuân Thức - 2- tranxuanthuc.pci@gmail.com
  3. Bài tập lập trình hướng đối tượng C++ { cout >n; for(i=0;i Max) Max=a[i].NTN; cout #include #include #include class Mayin { public: CN: Trần Xuân Thức - 3- tranxuanthuc.pci@gmail.com
  4. Bài tập lập trình hướng đối tượng C++ float TL; char NamSX[30]; char HangSX[30]; }; class Mkim:public Mayin { int Skim; int Tdo; public: void nhap(); void xuat(); }; class Mlaser:public Mayin { int DPG; int TD; public: void nhap(); void xuat(); }; void Mkim::nhap() { cout >TL; cout >Skim; cout >Tdo; } void Mkim::xuat() { cout >TL; cout >DPG; cout >TD; } void Mlaser::xuat() { cout<<"Trong luong may: "<<TL<<endl; CN: Trần Xuân Thức - 4- tranxuanthuc.pci@gmail.com
  5. Bài tập lập trình hướng đối tượng C++ cout >n; cout >m; cout #include #include #include class Person { public: char HT[50],NS[12],QQ[100]; void nhap(); CN: Trần Xuân Thức - 5- tranxuanthuc.pci@gmail.com
  6. Bài tập lập trình hướng đối tượng C++ void xuat(); Person() { strcpy(HT,"");strcpy(NS,"");strcpy(QQ,""); } }; class Diem { public: int Dtoan; int Dly; int Dhoa; void nhap(); void xuat(); Diem() { Dtoan=Dly=Dhoa=0; } }; class Hocsinh:public Person,public Diem { char Lop[30]; int TDiem; public: void nhap(); void xuat(); Hocsinh() { strcpy(Lop,"");TDiem=0; } }; void Person::nhap() { cout >Dtoan; cout >Dly; CN: Trần Xuân Thức - 6- tranxuanthuc.pci@gmail.com
  7. Bài tập lập trình hướng đối tượng C++ cout >Dhoa; } void Diem::xuat() { cout >n; for(int i=0;i<n;i++) a[i].nhap(); cout<<"Thong tin hoc sinh vua nhap:\n "; for(int i=0;i<n;i++) a[i].xuat(); getch(); } II. CÀI ĐẶT THEO SƠ ĐỒ LỚP. Bài 2.1. Cài đặt các lớp theo biểu đồ sau: Máy tính Máy Nhà sản xuất - Nhãn hiệu - Tốc độ private: - Nhà sản suất - Tên NSX - Dung lượng - Giá thành RAM; - Địa chỉ void input(); - Dung lượng HDD void output(); void input(); void output(); CN: Trần Xuân Thức - 7- tranxuanthuc.pci@gmail.com
  8. Bài tập lập trình hướng đối tượng C++ (với input và output là các phương thức nhập, xuất thông tin của các thuộc tính của lớp). Viết chương trình chính nhập vào danh sách n máy tính. In ra thông tin của các máy tính của nhà sản xuất IBM. Sắp xếp danh sách các máy tính theo chiều tăng dần của giá thành và in danh sách đã sắp ra màn hình. Xoá mọi máy tính của hãng Intel sản xuất và in danh sách kết quả ra màn hình. #include #include #include #include class NhaSX { char TenNSX[30]; char DC[30]; friend class May; friend class Maytinh; friend void In(Maytinh *a,int n); friend void Xoa(Maytinh *a,int *n); }; class May { public: char NH[30]; NhaSX NSX; float GT; void nhap(); void xuat(); }; class Maytinh:public May { float TD; int DLR; int DLHDD; public: void nhap(); void xuat(); CN: Trần Xuân Thức - 8- tranxuanthuc.pci@gmail.com
  9. Bài tập lập trình hướng đối tượng C++ friend void In(Maytinh *a,int n); friend void Sap(Maytinh *a,int n); friend void Xoa(Maytinh *a,int *n); }; void May::nhap() { cout >GT; } void May::xuat() { cout >TD; cout >DLR; cout >DLHDD; } void Maytinh::xuat() { May::xuat(); cout<<"Toc do: "<<TD<<endl; cout<<"Dung luong Ram: "<<DLR<<endl; cout<<"Dung luong HDD: "<<DLHDD<<endl; } void In(Maytinh a[100],int n) { for(int i=0;i<n;i++) if(strcmp(a[i].NSX.TenNSX,"IBM")==0) CN: Trần Xuân Thức - 9- tranxuanthuc.pci@gmail.com
  10. Bài tập lập trình hướng đối tượng C++ a[i].xuat(); } void Sap(Maytinh a[100],int n) { int i,j; Maytinh tg; for(i=0;i >n; for(i=0;i<n;i++) a[i].nhap(); cout<<" May tinh cua hang IBM \n"; In(a,n); cout<<" Sap xep may tinh tang dan theo gia \n"; Sap(a,n); CN: Trần Xuân Thức - 10- tranxuanthuc.pci@gmail.com
  11. Bài tập lập trình hướng đối tượng C++ for(i=0;i #include #include #include class NhaSX { char TenNSX[30]; char DC[30]; friend class May; friend class Maytinh; friend void In(Maytinh *a,int n); friend void Xoa(Maytinh *a,int *n); }; class May { CN: Trần Xuân Thức - 11- tranxuanthuc.pci@gmail.com
  12. Bài tập lập trình hướng đối tượng C++ public: char NH[30]; NhaSX NSX; float GT; void nhap(); void xuat(); }; class Maytinh:public May { int TD; float DLR; float DLHDD; public: void nhap(); void xuat(); }; void May::nhap() { cout >GT; } void May::xuat() { cout >TD; cout >DLR; cout >DLHDD; CN: Trần Xuân Thức - 12- tranxuanthuc.pci@gmail.com
  13. Bài tập lập trình hướng đối tượng C++ } void Maytinh::xuat() { May::xuat(); cout<<"Toc do: "<<TD<<endl; cout<<"Dung luong Ram: "<<DLR<<endl; cout<<"Dung luong HDD: "<<DLHDD<<endl; } void In(Maytinh a[100],int n) { for(int i=0;i<n;i++) if(strcmp(a[i].NSX.TenNSX,"IBM")==0) a[i].xuat(); } void Sap(Maytinh a[100],int n) { for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(a[i].GT<a[j].GT) { Maytinh tg=a[i]; a[i]=a[j]; a[j]=tg; } } void Xoa(Maytinh a[100],int *n) { for(int i=0;i<*n;i++) while(strcmp(a[i].NSX.TenNSX,"Intel")==0) { for(int j=i;j<*n;j++) a[j]=a[j+1]; *n=*n-1; } } void main() CN: Trần Xuân Thức - 13- tranxuanthuc.pci@gmail.com
  14. Bài tập lập trình hướng đối tượng C++ { int n,i; Maytinh a[100]; float TB=0,GTB=0; cout >n; for(i=0;i<n;i++) { a[i].nhap(); TB=TB+a[i].GT; } GTB=(GTB+TB)/n; cout<<"Gia trung binh: "<<GTB<<endl; cout<<" May tinh cua hang IBM \n"; In(a,n); cout<<" Sap xep \n"; Sap(a,n); for(i=0;i<n;i++) a[i].xuat(); cout<<" May tinh con lai sau khi xoa \n"; Xoa(a,&n); for(i=0;i<n;i++) a[i].xuat(); getch(); } Bài 2.3. Cài đặt lớp theo sơ đồ sau: Vé Giá gốc Ngày void nhap() void xuat() Vé người lớn Vé trẻ em -Giảm (%) -Giảm (%) -Giá vé -Giá vé void nhap() void nhap() void xuat() void xuat() CN: Trần Xuân Thức - 14- tranxuanthuc.pci@gmail.com
  15. Bài tập lập trình hướng đối tượng C++ Viết chương trình chính nhập vào 1 vé người lớn và 1 vé trẻ em. In ra thông tin của các vé đó kèm theo giá vé. #include #include #include #include #include class Ve { public: int Giagoc; char Ngay[30]; void nhap(); void xuat(); }; class VeNL:public Ve { int Giam; float Giave; public: void nhap(); void xuat(); }; class VeTE:public Ve { int Giam; float Giave; public: void nhap(); void xuat(); }; void Ve::nhap() { cout >Giagoc; cout >Giam; Giave=Giagoc-(Giagoc*Giam)/100; CN: Trần Xuân Thức - 15- tranxuanthuc.pci@gmail.com
  16. Bài tập lập trình hướng đối tượng C++ } void VeNL::xuat() { Ve::xuat(); cout >Giam; Giave=Giagoc-(Giagoc*Giam)/100; } void VeTE::xuat() { Ve::xuat(); cout<<"Giam: "<<Giam<<"%"<<endl; cout<<"Gia ve: "<<Giave<<endl; } void main() { VeNL x; VeTE y; cout<<"Ve nguoi lon:\n"; x.nhap(); x.xuat(); cout<<"Ve tre em:\n"; y.nhap(); y.xuat(); getch(); } Bài 2.4. Viết chương trình mô phỏng hoạt động của một bộ máy vi tính gồm các bộ phận: Nguồn (Power), Hệ điều hành (OS), Màn hình (Monitor), CPU theo sơ đồ sau (nội dung các phương thức thí sinh tự xác định sao cho thoả mãn yêu cầu trong chương trình chính): Power CPU Computer Bật_Nguồn(): Nguon: Màn_Hình: Monitor void Power Cpu: CPU Tắt_Nguồn(): HĐH: OS void Cài_Đặt(Tên: char*): void Bật_CPU():void OS ĐătĐộSáng(đs: int): void Tên: char(30) Tắt_CPU(): void CN: Trần Xuân Thức - 16- tranxuanthuc.pci@gmail.com
  17. Bài tập lập trình hướng đối tượng C++ Khởi_Động(): void Monitor Tăt_HĐH(): void Độ_sáng: int ĐặtĐộSáng(đs: int): void Chương trình chính sinh ra một chiếc máy tính, cài đặt hệ điều hành cho máy tính đó (với tên hệ điều hành được gán là WINXP). Bật CPU của máy (gồm bật nguồn: thông báo nguồn đã bật; khởi động hệ điều hành: thông báo hệ điều hành đã khởi động kèm theo tên hệ điều hành). Đặt độ sáng cho màn hình máy tính với giá trị bất kỳ (có thông báo độ sáng được đặt ra màn hình). Tắt CPU ( bao gồm tắt hệ điều hành, tắt nguồn). #include #include #include #include class Power { public: void Bat_Nguon(); void Tat_Nguon(); }; class OS { char Ten[30]; public: void Khoi_Dong(); void Tat_HDH(); friend class Computor; }; class CPU { Power Nguon; OS HDH; friend class Computor; }; class Monitor { int Do_Sang; public: void Datdosang(int ds); }; class Computor { Monitor Man_Hinh; CN: Trần Xuân Thức - 17- tranxuanthuc.pci@gmail.com
  18. Bài tập lập trình hướng đối tượng C++ CPU Cpu; public: void Cai_Dat(char *Ten); void Bat_CPU(); void Datdosang(int ds); void Tat_CPU(); }; void Power::Bat_Nguon() { cout<<"Nguon da bat"; } void Power::Tat_Nguon() { cout<<"Nguon da tat"; } void OS::Khoi_Dong() { cout<<"He dieu hanh da khoi dong. "<<Ten; } void OS::Tat_HDH() { cout<<"Da tat he dieu hanh."; } void Monitor::Datdosang(int ds) { Do_Sang=ds; cout<<"Do sang da duoc dat: "<<ds; } void Computor::Cai_Dat(char*Ten) { strcpy(Cpu.HDH.Ten,"WINXP"); } void Computor::Bat_CPU() { Cpu.Nguon.Bat_Nguon(); Cpu.HDH.Khoi_Dong(); } void Computor::Datdosang(int ds) { Man_Hinh.Datdosang(ds); } void Computor::Tat_CPU() { Cpu.HDH.Tat_HDH(); Cpu.Nguon.Tat_Nguon(); } void main() CN: Trần Xuân Thức - 18- tranxuanthuc.pci@gmail.com
  19. Bài tập lập trình hướng đối tượng C++ { Computor x; x.Cai_Dat("WINXP"); x.Bat_CPU(); x.Datdosang(15); x.Tat_CPU(); getch(); } Bài 2.5. Cài đặt lớp theo sơ đồ sau: Person Hospital Person Họ tên Tên BV Họ tên Tuổi Địa chỉ Tuổi Nhap( ) Nhap( ) Xuat( ) Xuat( ) Nhập vào một danh sách gồm n bệnh nhân. Sắp xếp danh sách theo chiều tăng dần của tuổi. In ra các bệnh nhân được điều trị trong bệnh viện có giám đốc bệnh viện là Hoàng Hà. #include #include #include #include class Person { public: char HT[30]; int Tuoi; void nhap(); void xuat(); }; class Hospital { char TenBV[30],DC[30]; Person GD; friend class BN; friend void IN(BN *a,int n); }; class BN:public Person { char TS[30],CD[30]; Hospital BV; public: void nhap(); CN: Trần Xuân Thức - 19- tranxuanthuc.pci@gmail.com
  20. Bài tập lập trình hướng đối tượng C++ void xuat(); friend void IN(BN *a,int n); }; void Person::nhap() { cout >Tuoi; } void Person::xuat() { cout >n; for(i=0;i<n;i++) a[i].nhap(); for(i=0;i<n;i++) for(j=i+1;j<n;j++) CN: Trần Xuân Thức - 20- tranxuanthuc.pci@gmail.com
  21. Bài tập lập trình hướng đối tượng C++ if(a[j].Tuoi #include CN: Trần Xuân Thức - 21- tranxuanthuc.pci@gmail.com
  22. Bài tập lập trình hướng đối tượng C++ #include #include #include class SV { char MaSV[10],TenSV[30]; public: void nhap(); void xuat(); }; class Lop { char TenL[30]; int Khoa; public: void nhap(); void xuat(); }; class Mon { char TenMH[30]; int ST; int Diem; public: void nhap(); void xuat(); friend class Phieu; }; class Phieu { SV a; Lop b; int n; Mon c[100]; public: void nhap(); void xuat(); }; void SV::nhap() { cout<<"Ma sinh vien: ";gets(MaSV);fflush(stdin); cout<<"Ten sinh vien: ";gets(TenSV);fflush(stdin); } void SV::xuat() { cout<<"Ma sinh vien: "<<MaSV; cout<<" Ten sinh vien: "<<TenSV<<endl; CN: Trần Xuân Thức - 22- tranxuanthuc.pci@gmail.com
  23. Bài tập lập trình hướng đối tượng C++ } void Lop::nhap() { cout >Khoa; } void Lop::xuat() { cout >ST; cout >Diem; } void Mon::xuat() { cout >n; for(int i=0;i<n;i++) c[i].nhap(); } void Phieu::xuat() { cout<<" PHIEU BAO DIEM \n"; a.xuat(); b.xuat(); cout<<"Bang diem:\n"; cout<<"Ten mon So trinh Diem\n"; for(int i=0;i<n;i++) c[i].xuat(); float D=0,TongST=0,DTB; for(int i=0;i<n;i++) { D=D+c[i].ST*c[i].Diem; TongST=TongST+c[i].ST; } DTB=D/TongST; cout<<" Diem trung binh: "<<DTB<<endl; } CN: Trần Xuân Thức - 23- tranxuanthuc.pci@gmail.com
  24. Bài tập lập trình hướng đối tượng C++ void main() { int n; Phieu x[100]; cout >n; for(int i=0;i #include #include #include #include class BN { char TenBN[30]; char GT[20]; int Tuoi; char DC[30],TSB[30]; public: void nhap(); void xuat(); }; class BS { char TenBS[30]; char NoiCT[30]; public: CN: Trần Xuân Thức - 24- tranxuanthuc.pci@gmail.com
  25. Bài tập lập trình hướng đối tượng C++ void nhap(); void xuat(); }; class TC { char MaTC[30]; char TenTC[30]; public: void nhap(); void xuat(); }; class Phieu { char MaP[30],Ngay[30]; BN a; BS b; int n; TC c[100]; char KL[50]; public: void nhap(); void xuat(); }; void BN::nhap() { cout >Tuoi; cout<<"Dia chi: ";gets(DC);fflush(stdin); cout<<"Tien su benh: ";gets(TSB);fflush(stdin); } void BN::xuat() { cout<<"Ten benh nhan: "<<TenBN; cout<<" Gioi tinh: "<<GT; cout<<" Tuoi: "<<Tuoi<<endl; cout<<"Dia chi: "<<DC; cout<<" Tien su benh: "<<TSB<<endl; } void BS::nhap() { cout<<"Ten BS: ";gets(TenBS);fflush(stdin); cout<<"Noi cong tac: ";gets(NoiCT);fflush(stdin); } void BS::xuat() { cout<<"Ten BS: "<<TenBS; CN: Trần Xuân Thức - 25- tranxuanthuc.pci@gmail.com
  26. Bài tập lập trình hướng đối tượng C++ cout >n; for(int i=0;i<n;i++) c[i].nhap(); cout<<"Ket luan: ";gets(KL);fflush(stdin); } void Phieu::xuat() { cout<<" PHIEU KHAM BENH \n"; cout<<"Ma phieu: "<<MaP; cout<<" Ngay kham: "<<Ngay<<endl; a.xuat(); b.xuat(); cout<<"Ma trieu chung Ten trieu chung\n"; for(int i=0;i<n;i++) c[i].xuat(); cout<<"Ket luan: "<<KL<<endl; } void main() { Phieu x; x.nhap(); x.xuat(); getch(); } Bài 3.3. Viết chương trình cho phép nhập, xuất phiếu sau: PHIẾU KIỂM KÊ TÀI SẢN Mã phiếu: PH01. Ngày kiểm kê: 01/01/2007 CN: Trần Xuân Thức - 26- tranxuanthuc.pci@gmail.com
  27. Bài tập lập trình hướng đối tượng C++ Nhân viên kiểm kê: Kiều Thị Thanh Chức vụ: Kế toán viên Kiểm kê tại phòng: Tổ chức hành chính Mã phòng: PTC Trưởng phòng: Hoàng Bích Hảo Tên tài sản Số lượng Tình trạng Máy vi tính 5 Tốt Máy vi tính 3 Hết khấu hao- hỏng Bàn làm việc 6 ốt T Số tài sản đã kiểm kê: 3 Tổng số lượng: 14 #include #include #include #include #include class Nhanvien { char TenNV[30]; char CV[30]; public: void nhap(); void xuat(); }; class Phong { char TenP[30]; char MaP[30]; char TP[30]; public: void nhap(); void xuat(); }; class Taisan { char TenTS[30]; int SL; char TT[30]; public: void nhap(); void xuat(); friend class Phieu; }; class Phieu { char MP[30], Ngay[30]; Nhanvien a; Phong b; CN: Trần Xuân Thức - 27- tranxuanthuc.pci@gmail.com
  28. Bài tập lập trình hướng đối tượng C++ int n; Taisan c[100]; public: void nhap(); void xuat(); }; void Nhanvien::nhap() { cout >SL; cout >n; for(int i=0;i<n;i++) c[i].nhap(); CN: Trần Xuân Thức - 28- tranxuanthuc.pci@gmail.com
  29. Bài tập lập trình hướng đối tượng C++ } void Phieu::xuat() { cout #include #include #include class KH { CN: Trần Xuân Thức - 29- tranxuanthuc.pci@gmail.com
  30. Bài tập lập trình hướng đối tượng C++ char MaKH[10],TenKH[30],DC[30]; int DT; public: void nhap(); void xuat(); }; class Sach { char MaS[10],TenS[30]; float Gia; int SL; public: void nhap(); void xuat(); friend class Phieu; }; class Phieu { char MaP[10],Ngay[30]; KH a; int n; Sach b[100]; public: void nhap(); void xuat(); }; void KH::nhap() { cout >DT; } void KH::xuat() { cout >Gia; cout >SL; } CN: Trần Xuân Thức - 30- tranxuanthuc.pci@gmail.com
  31. Bài tập lập trình hướng đối tượng C++ void Sach::xuat() { cout >n; for(int i=0;i<n;i++) b[i].nhap(); } void Phieu::xuat() { cout<<" PHIEU XUAT SACH \n"; cout<<"Ma phieu: "<<MaP; cout<<"Ngay xuat: "<<Ngay<<endl; a.xuat(); cout<<" Ma sach Ten sach Gia So luong Thanh tien\n"; for(int i=0;i<n;i++) b[i].xuat(); int t=0; for(int i=0;i<n;i++) t=t+(b[i].Gia * b[i].SL); cout<<" Tong thanh tien: "<<t<<" VND"; } void main() { Phieu x; x.nhap(); x.xuat(); getch(); } Bài 3.5. Viết chương trình quản lý việc đặt phòng khách sạn. Yêu cầu các thuộc tính đều đặt phạm vi truy cập private và chương trình đáp ứng được các chức năng sau: - Tạo một phiếu đặt phòng: cho phép nhập các thông tin về mã phiếu, ngày đặt, ngày đến (thuê), các thông tin về khách hàng, các thông tin về phòng đặt. - In ra phiếu đặt phòng theo mẫu sau: PHIẾU ĐẶT PHÒNG Mã phiếu: PH01. Ngày đặt: 01/02/2007 Ngày đến: 15/02/2007 Mã khách hàng: KH005 Tên KH: Trần Thanh Hà CN: Trần Xuân Thức - 31- tranxuanthuc.pci@gmail.com
  32. Bài tập lập trình hướng đối tượng C++ Địa chỉ: Công ty SIMCO Số CMND: 151174189 Cấp tại: Thái Bình Thông tin đặt phòng: Mã phòng Loại phòng Hạng Số người sẽ ở P05 Phòng đôi Sang 2 P07 Phòng 4 người Thường 3 Số tiền đặt trước: 2000000 VNĐ Tổng số người ở: 5 #include #include #include #include #include class KH { char MaKH[10],TenKH[30],DC[30]; int CMND; char NC[30]; public: void nhap(); void xuat(); }; class Phong { char MaP[10],LP[20],Hang[20]; int SN; public: void nhap(); void xuat(); friend class Phieu; }; class Phieu { char MP[10],NDat[20],NDen[20]; int DC; KH a; int n,i; Phong b[100]; public: void nhap(); void xuat(); }; void KH::nhap() { cout<<"Ma khach hang: ";gets(MaKH);fflush(stdin); cout<<"Ten khach hang: ";gets(TenKH);fflush(stdin); CN: Trần Xuân Thức - 32- tranxuanthuc.pci@gmail.com
  33. Bài tập lập trình hướng đối tượng C++ cout >CMND; cout >SN; } void Phong::xuat() { cout >DC; a.nhap(); cout >n; for(int i=0;i<n;i++) b[i].nhap(); } void Phieu::xuat() { cout<<" PHIEU DAT PHONG \n"; cout<<"Ma phieu: "<<MP; cout<<" Ngay dat: "<<NDat; cout<<" Ngay den: "<<NDen<<endl; a.xuat(); cout<<"Thong tin dat phong:\n"; cout<<"Ma phong Loai phong Hang So nguoi se o \n"; for(i=0;i<n;i++) b[i].xuat(); cout<<"Tien dat coc: "<<DC<<" VND"; CN: Trần Xuân Thức - 33- tranxuanthuc.pci@gmail.com
  34. Bài tập lập trình hướng đối tượng C++ int t=0; for(i=0;i - Cú pháp của hàm: operator (các đối số) { CN: Trần Xuân Thức - 34- tranxuanthuc.pci@gmail.com
  35. Bài tập lập trình hướng đối tượng C++ Thân hàm toán tử; } Ví dụ: Hàm toán tử cộng hai số thực bất kỳ được viết như sau: float operator + (float x, float y) { return x + y; } - Cách sử dụng hàm toán tử: Có hai cách gọi một hàm toán tử. Cách 1: gọi như hàm thông thường. VD: để cộng hai số thực a, b ta có thể viết: cout + i * . Cho hai số phức X = a + i*b và Y = c + i * d. Khi đó X + Y sẽ cho số phức có dạng: X+Y = (a+c) + i * (b + d). Hãy định nghĩa hàm toán tử để thực hiện cộng hai số phức bất kỳ. typedef struct SP { float Phanthuc; float Phanao; }; //Dinh nghia ham toan tu cong hai so phuc SP operator+(SP x, SP y) { SP tg; tg.Phanthuc = x.Phanthuc + y.Phanthuc; tg.Phanao = x.Phanao + y.Phanao; return tg; } void main() { //Khai bao hai so phuc x va y va so phuc tong T SP x,y, T; x.Phanthuc = 2; x.Phanao = 3; y.Phanthuc= 3; y.Phanao = 5; //Cong hai so phuc va in ket qua len man hinh T = operator+(x, y); //Co the viet T = x + y cout<<"Ket qua "<<T.Phanthuc<<"+ i * "<<T.Phanao; getch(); } CN: Trần Xuân Thức - 35- tranxuanthuc.pci@gmail.com
  36. Bài tập lập trình hướng đối tượng C++ Chú ý: Thay bằng viết T = operator+(x, y); ta có thể viết: T = x + y; như cộng hai số thực thông thường do đã định nghĩa hàm toán tử cộng hai số phức ở trên. 2. Định nghĩa phương thức toán tử Trong Lập trình Hướng đối tượng, khi muốn một phương thức là phương thức toán tử, ta cài đặt thế nào? Khi đã cài đặt chúng thì sử dụng thế nào? Ta nhận thấy: - Phương thức toán tử một ngôi không có đối vào. Như vậy việc đổi dấu sẽ thực hiện trên số phức nào? Thực chất phương thức toán tử đổi dấu trên đã bao gồm một đối mặc định, đó là con trỏ this. - Con trỏ this luôn là đối mặc định của các phương thức toán tử. Như vậy, hai cách viết sau là tương đương tg.Phanthuc = -Phanthuc; tg.Phanthuc = -this -> tg.Phanao = -Phanao; Phanthuc; tg.Phanao = -this -> Phanao; - Khi sử dụng phương thức toán tử một ngôi ta cũng có 2 cách như với hàm toán tử. Như vậy, hai cách viết sau là tương đương: SoPhuc y = x.operator-(); SoPhuc y = -x; b. Cài đặt phương thức toán tử hai ngôi Như đã biết, trong phương thức toán tử, con trỏ this luôn là một đối số mặc định. Như vậy, với phương thức toán tử hai ngôi, thay vì có hai đối vào, ta chỉ cần một đối, đối còn lại là con trỏ this. Tương tự như phương thức toán tử một ngôi, ta nhận thấy: - Phương thức toán tử hai ngôi có 1 đối vào. Đối vào còn lại chính là con trỏ this. - Con trỏ this luôn là đối mặc định của các phương thức toán tử. Như vậy, hai cách viết sau là tương đương tg.Phanthuc = Phanthuc + tg.Phanthuc = this -> Phanthuc + y.Phanthuc; y.Phanthuc; tg.Phanao = Phanao + tg.Phanao = this -> Phanao + y.Phanao; y.Phanao; - Khi sử dụng phương thức toán tử hai ngôi ta cũng có 2 cách như với hàm toán tử. Như vậy, hai cách viết sau là tương đương: SoPhuc T = x.operator+(y); SoPhuc T = x + y 3. Cài đặt một số phương thức toán tử: Bài 4.2. Hãy xây dựng lớp phân số với các thuộc tính Tử số và Mẫu số và các phương thức: Toán tử nhập (>>) và xuất (<<) đưa phân số ra màn hình (dưới dạng Tử số/ Mẫu số). Phương thức khởi tạo, khởi gán Tử số và Mẫu số. CN: Trần Xuân Thức - 36- tranxuanthuc.pci@gmail.com
  37. Bài tập lập trình hướng đối tượng C++ Viết chương trình chính nhập vào hai phân số, đưa ra màn hình phân số là tổng và hiệu của hai phân số vừa nhập. #include #include #include class PS { float TS,MS; public: friend istream & operator>>(istream & x,PS & y); friend ostream & operator >(istream & x,PS & y) { cout >y.TS; cout >y.MS; return x; } ostream & operator<<(ostream & x,PS & y) { x<<y.TS<<"/"<<y.MS; return x; } PS PS::operator+(PS y) { PS z; z.TS=TS*y.MS+y.TS*MS; z.MS=MS*y.MS; return z; } CN: Trần Xuân Thức - 37- tranxuanthuc.pci@gmail.com
  38. Bài tập lập trình hướng đối tượng C++ PS PS::operator-(PS y) { PS z; z.TS=TS*y.MS-y.TS*MS; z.MS=MS*y.MS; return z; } void main() { PS x,y,z; cout >x; cout >y; cout #include #include class PS { int TS,MS; public: friend istream & operator>>(istream & x,PS & y); friend ostream & operator<<(ostream & x,PS & y); PS operator*(PS y); CN: Trần Xuân Thức - 38- tranxuanthuc.pci@gmail.com
  39. Bài tập lập trình hướng đối tượng C++ }; istream & operator>>(istream & x,PS & y) { cout >y.TS; cout >y.MS; return x; } ostream & operator >x; cout >y; cout<<y<<endl; z=x*y; cout<<"Ket qua phep nhan 2 ps: "<<z; getch(); } Bài 4.3. Cho hai số phức dạng: SP1 = a1+ i*b1; SP2 = a2+ i*b2; Phép cộng, trừ hai số phức được định nghĩa như sau: SP3 = SP1 + SP2 = (a1+a2) + i*(b1+b2); SP3 = SP1 - SP2 = (a1-a2) + i*(b1-b2); Hãy xây dựng lớp số phức với các thuộc tính Thực, ảo và các phương thức: Phương thức khởi tạo: khởi gán phần thực và phần ảo của số phức. Phương thức xuất: in giá trị của số phức lên màn hình Phương thức toán tử + và - hai số phức. Xây dựhương c ng trình chính để sử dụng lớp Số phức nói trên. CN: Trần Xuân Thức - 39- tranxuanthuc.pci@gmail.com
  40. Bài tập lập trình hướng đối tượng C++ #include #include #include class SP { float T,A; public: friend istream & operator>>(istream & x,SP & y); friend ostream & operator >(istream & x,SP & y) { cout >y.T; cout >y.A; return x; } ostream & operator<<(ostream & x,SP & y) { x<<y.T<<"+"<<y.A<<"*i"; return x; } SP SP::operator+(SP y) { SP z; z.T=T+y.T; z.A=A+y.A; return z; } SP SP::operator-(SP y) { SP z; CN: Trần Xuân Thức - 40- tranxuanthuc.pci@gmail.com
  41. Bài tập lập trình hướng đối tượng C++ z.T=T-y.T; z.A=A-y.A; return z; } void main() { SP x,y,z; cout >x; cout >y; cout >) và xuất ( #include #include #include class MT { int n,m; float a[100][100]; public: friend istream & operator>>(istream & x,MT & y); friend ostream & operator >(istream & x,MT & y) { cout >y.n; CN: Trần Xuân Thức - 41- tranxuanthuc.pci@gmail.com
  42. Bài tập lập trình hướng đối tượng C++ cout >y.m; for(int i=0;i >y.a[i][j]; } return x; } ostream & operator >y; z=-y; cout >) và xuất ( CN: Trần Xuân Thức - 42- tranxuanthuc.pci@gmail.com
  43. Bài tập lập trình hướng đối tượng C++ #include #include #include class MT { int n,m; float a[100][100]; public: friend istream & operator>>(istream & x,MT & y); friend ostream & operator >(istream & x,MT & y) { cout >y.n; cout >y.m; for(int i=0;i >y.a[i][j]; } return x; } ostream & operator<<(ostream & x,MT & y) { for(int i=0;i<y.n;i++) for(int j=0;j<y.m;j++) { gotoxy(5+3*j,10+i); x<<y.a[i][j]<<" "; } return x; } MT MT::operator-() { MT z; z.n=m; z.m=n; CN: Trần Xuân Thức - 43- tranxuanthuc.pci@gmail.com
  44. Bài tập lập trình hướng đối tượng C++ for(int i=0;i >y; z=-y; cout #include #include class TT { float a,b,c; public: friend istream & operator>>(istream & x,TT & y); friend ostream & operator<<(ostream & x,TT & y); TT operator+(TT y); CN: Trần Xuân Thức - 44- tranxuanthuc.pci@gmail.com
  45. Bài tập lập trình hướng đối tượng C++ TT operator-(); }; istream & operator>>(istream & x,TT & y) { cout >y.a; cout >y.b; cout >y.c; return x; } ostream & operator >x; CN: Trần Xuân Thức - 45- tranxuanthuc.pci@gmail.com
  46. Bài tập lập trình hướng đối tượng C++ cout >y; cout #include #include class Mang { int n; float a[100]; public: void nhap(); void xuat(); Mang operator++(); Mang operator (); }; void Mang::nhap() { cout >n; for(int i=0;i<n;i++) { cout<<"a["<<i<<"]= "; CN: Trần Xuân Thức - 46- tranxuanthuc.pci@gmail.com
  47. Bài tập lập trình hướng đối tượng C++ cin>>a[i]; } } void Mang::xuat() { for(int i=0;i<n;i++) cout<<a[i]<<" "; } Mang Mang::operator++() { Mang z; int i,j; float tg; z.n=n; for(i=0;i<n;i++) z.a[i]=a[i]; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(z.a[j]<z.a[i]) { tg=z.a[i]; z.a[i]=z.a[j]; z.a[j]=tg; } return z; } Mang Mang::operator () { Mang z; int i,j; float tg; z.n=n; CN: Trần Xuân Thức - 47- tranxuanthuc.pci@gmail.com
  48. Bài tập lập trình hướng đối tượng C++ for(i=0;i >), xuất ( >B //nhập: 1, 59, 6 C=A+B; Cout #include #include CN: Trần Xuân Thức - 48- tranxuanthuc.pci@gmail.com
  49. Bài tập lập trình hướng đối tượng C++ class Time { int g,p,gi; public: friend istream & operator>>(istream & x,Time & y); friend ostream & operator >(istream & x,Time & y) { cout >y.g; cout >y.p; cout >y.gi; return x; } ostream & operator =60) { z.gi=z.gi%60; z.p=z.p+1; } if(z.p>=60) { z.p=z.p%60; z.g=z.g+1; } return z; } void Time::operator++() { gi=gi+1; if(gi==60) { gi=0; p=p+1; } CN: Trần Xuân Thức - 49- tranxuanthuc.pci@gmail.com
  50. Bài tập lập trình hướng đối tượng C++ if(p==60) { p=0; g=g+1; } } int Time::operator y.g) return 0; else if(p y.p) return 0; else if(gi >B; C=A+B; cout<<C; A++; cout<<A; if(A<B) cout<<"Dung\n"; else cout<<"Sai\n"; getch(); } V. PHƯƠNG THỨC ẢO VÀ LIÊN KẾT ĐỘNG . 1. Con trỏ đối tượng và các phương thức tĩnh Giả sử có 3 lớp A, B, C kế thừa nhau theo cây thứ bậc sau: A B C Tức lớp B kế thừa lớp A, Lớp C lại kế thừa trực tiếp lớp B. Nếu ta khai báo một con trỏ đối tượng P thuộc lớp A (A * P) thì: P có thể chứa địa chỉ của các đối tượng thuộc lớp A hoặc B hoặc C. VD: Ta khai báo: A a, *P; B b; C c; thì ta có thể viết: P = &a; hoặc P = & b; hoặc P = & c; Xét trường hợp cả 3 lớp A, B, C đều có cùng một phương thức: cùng tên, cùng danh sách các đối, chỉ khác nhau về nội dung phương thức. Khi đó, nếu ta viết: P CN: Trần Xuân Thức - 50- tranxuanthuc.pci@gmail.com
  51. Bài tập lập trình hướng đối tượng C++ ; thì phương thức nào trong 3 phương thức của 3 lớp sẽ được gọi? Câu trả lời là: Chỉ có phương thức của lớp A sẽ được gọi, cho dù P có trỏ tới đối tượng thuộc lớp B và C. VD: Xét đoạn trình mô tả 3 lớp A, B, C kế thừa nhau theo cây thứ bậc trên. Cả 3 lớp đều có phương thức giống nhau là phương thức nhap(). class A { int a; public: void nhap() { cout >a; } }; class B: public A { int b; public: void nhap() { cout >b; } }; class C: public B { int c; public: void nhap() { cout >c; } }; Tại hàm main(), ta khai báo 3 đối tượng thuộc 3 lớp A, B, C và một con trỏ p thuộc lớp A. Khi đó, mặc dù p trỏ tới đối tượng của lớp B, C những khi viết p nhap() thì phương thức nhap() của lớp A vẫn được gọi. void main() { A d1, *p; B d2; C d3; CN: Trần Xuân Thức - 51- tranxuanthuc.pci@gmail.com
  52. Bài tập lập trình hướng đối tượng C++ p = & d2; p->nhap();//van la phuong thuc nhap() cua lop A p = & d3; p->nhap();//van la phuong thuc nhap() cua lop A } 2. Phương thức ảo và ý nghĩa của phương thức ảo Trong nhiều trường hợp, ta mong muốn: Khi con trỏ đối tượng p thuộc lớp A đang chứa địa chỉ của một đối tượng thuộc lớp B hoặc C mà ta viết: P nhap(); thì sẽ truy cập tới phương thức nhap() của lớp B hoặc C. Muốn được như vậy thì phương thứ c nhap() của 3 lớp A, B, C phải là phương thức ảo. Các phương thức viết theo kiểu thông thường đều là các phương thức tĩnh. Phương thức nhap() trong ví dụ trên là phương thức tĩnh. Cách chuyển phương thức tĩnh thành phương thức ảo: Cách 1: Thêm từ khoá virtual vào trước phương thức tĩnh của cả tất cả các lớp (cơ sở và dẫn xuất). VD: Đoạn trình sau chuyển phương thức tĩnh nhap() thành phương thức ảo: class A { int a; public: virtual void nhap() { cout >a; } }; class B: public A { int b; public: virtual void nhap() { cout >b; } }; class C: public B { int c; CN: Trần Xuân Thức - 52- tranxuanthuc.pci@gmail.com
  53. Bài tập lập trình hướng đối tượng C++ public: virtual void nhap() { cout >c; } }; Cách 2: Chỉ cần thêm từ khoá virtual vào trước phương thức tĩnh của lớp cơ sở. class A { int a; public: virtual void nhap() { cout >a; } }; class B: public A { int b; public: void nhap() { cout >b; } }; class C: public B { int c; public: void nhap() { cout >c; } }; Khi đó, trong chương trình chính, nếu p trỏ tới đối tượng của lớp nào thì phương thức nhap() của đối tượng thuộc lớp đó sẽ được gọi khi ta viết p nhap(); void main() { A d1, *p; B d2; CN: Trần Xuân Thức - 53- tranxuanthuc.pci@gmail.com
  54. Bài tập lập trình hướng đối tượng C++ C d3; p = & d2; p->nhap();//phuong thuc nhap() cua lop B duoc goi p = & d3; p->nhap();//phuong thuc nhap() cua lop C duoc goi } 3. Phương thức ảo và sự kết nối động Trong ví dụ trên, cùng một lời gọi phương thức : p nhap(); nhưng có thể truy cập tới phương thức ảo của lớp A hoặc B hoặc C. Lời gọi p nhap(); tương ứng với 3 phương thức nhap() khác nhau. Khi ta sử dụng phương thức ảo, rõ ràng là: cùng một con trỏ thuộc lớp cơ sở, cùng một lời gọi phương thức nhưng lời gọi đó lại tương ứng với nhiều phương thức khác nhau. Ta gọi đó là sự tương ứng bội hay tính đa hình. Lời gọi p nhap(); có thể kết nối tới phương thức nhap() của lớp A hoặc lớp B, hoặc lớp C. Điều đó có nghĩa là lời gọi đó không liên kết cứng tới một phương thức nhap() nào mà sự liên kết đó là động. Như vậy, khi sử dụng phương thức ảo thì ta có thể liên kết động từ một lời gọi phương thức tới nhiều phương thức cùng tên, cùng bộ đối số. Tính chất như vậy của phương thức ảo gọi là sự kết nối động. 4. Ví dụ về sử dụng phương thức ảo Xây dựng lớp Cây gồm các thuộc tính: Chiều cao, độ tuổi, chu vi tán và các phương thức: - Phương thức nhập: nhập các giá trị cho các thuộc tính của lớp Cây. - Phương thức xuất: xuất các giá trị của các thuộc tính thuộc lớp Cây lên màn hình. Xây dựng lớp Cây cảnh, ngoài các thuộc tính của lớp Cây còn có các thuộc tính: Giá thành, chủng loại và các phương thức: - Phương thức nhập: nhập các giá trị cho các thuộc tính của lớp Cây cảnh. - Phương thức xuất: xuất các giá trị của các thuộc tính thuộc lớp Cây cảnh lên màn hình. Viết chương trình chính khai báo 2 đối tượng thuộc 2 lớp trên và một con trỏ thuộc lớp Cây. Dùng con trỏ này để nhập, xuất các thuộc tính của hai đối tượng trên. class Cay { public: float Chieucao; float Dotuoi; float CVTan; public: virtual void nhap() CN: Trần Xuân Thức - 54- tranxuanthuc.pci@gmail.com
  55. Bài tập lập trình hướng đối tượng C++ { cout >Chieucao; cout >Dotuoi; cout >CVTan; } virtual void xuat() { cout >Chieucao; cout >Dotuoi; cout >CVTan; cout >Giathanh; cout<<"Chung loai "; gets(Chungloai); } void xuat() { cout<<"Thong tin cua lop Cay Canh "<<endl; cout<<"Chieu cao: "<<Chieucao<<endl; cout<<"Do tuoi: "<<Dotuoi<<endl; cout<<"Chu vi tan: "<<CVTan<<endl; cout<<"Gia thanh: "<<Giathanh<<endl; cout<<"Chung loai: "<<Chungloai<<endl; } }; void main() { CN: Trần Xuân Thức - 55- tranxuanthuc.pci@gmail.com
  56. Bài tập lập trình hướng đối tượng C++ Cay a, *p; Caycanh b; p = &a; p->nhap();//Nhap cua lop Cay p=&b; p->nhap();//Nhap cua lop Caycanh p=&a; p->xuat();//Xuat cua lop Cay p=&b; p->xuat();//Xuat cua lop Caycanh getch(); } 5. Lớp cơ sở trừu tượng và các thành phần ảo Trong nhiều trường hợp, ta chỉ muốn dùng con trỏ của lớp cơ sở để truy cập tới các phương thức ảo của các lớp dẫn xuất. Ngoài ra, rất ít khi dùng con trỏ lớp cơ sở để truy cập tới phương thức ảo của chính lớp này. Tuy nhiên, để con trỏ của lớp cơ sở có thể truy cập các phương thức ảo của các lớp dẫn xuất thì lớp cơ sở cũng phải có phương thức ảo này. Từ đây xuất hiện một khả năng: Phương thức ảo của lớp cơ sở có thể chỉ được định nghĩa hình thức mà không được dùng. Khi đó thân của phương thức ảo này không cần có bất cứ dòng lệnh nào. Một phương thức ảo của lớp cơ sở mà trong thân của nó không thực thi một lệnh nào (trừ return) gọi là phương thức thuần ảo. Lớp cơ sở có phương thức thuần ảo gọi là lớp cơ sở trừu tượng. Khi thiết kế phần mềm hướng đối tượng, ta luôn xác định được các lớp có thể có trong phần mềm và cây thứ bậc thể hiện sự kế thừa của các lớp. Người ta thường tạo ra các lớp cơ sở trừu tượng, trong đó có các phương thức thuần ảo. Những phương thức như vậy không thực hiện một công việc nào mà chỉ dùng để tạo phương thức ảo cho các phương thức cùng tên trong các lớp dẫn xuất. Từ đó, chỉ cần khai báo một con trỏ thuộc lớp cơ sở trừu tượng này, ta có thể dùng con trỏ đó để truy cập tới các phương thức ảo của các lớp dẫn xuất. Từ đây, tạo ra sự linh hoạt trong truy cập các lớp dẫn xuất. Phương thức ảo chỉ được tạo ra sau khi đã hình thành đối tượng, do vậy, phương thức khởi tạo không thể là phương thức ảo nhưng phương thức huỷ bỏ có thể là phương thức ảo. Ngoài ra, phương thức toán tử cũng có thể là phương thức ảo. Ưu nhược điểm của phương thức ảo: - Chương trình sử dụng nhiều phương thức ảo sẽ linh hoạt hơn trong sự truy cập các phương thức cùng tên của các lớp dẫn xuất. - Việc thực thi chương trình sẽ chậm hơn. - Tốn nhiều bộ nhớ hơn do phải tạo ra một bảng chỉ mục của các phương thức ảo. CN: Trần Xuân Thức - 56- tranxuanthuc.pci@gmail.com
  57. Bài tập lập trình hướng đối tượng C++ Khi nào dùng phương thức ảo? Ta chỉ thiết kế các lớp có phương thức ảo khi: - Có sự kế thừa giữa các lớp. - Các lớp trong cây thứ bậc có các phương thức cùng tên, cùng đối số, lớp cơ sở ban đầu (lớp gốc) bắt buộc cũng phải có phương thức này. - Bản chất của cây thứ bậc đòi hỏi cần có phương thức ảo. Bài 5.1. Xây dựng lớp cơ sở Xe gồm thuộc tính năm sản xuất, trọng lượng và phương thức tính giá thành: Giá thành = (năm sản xuất * 0.2 + trọng lượng), phương thức khởi tạo khởi gán các giá trị cho các thuộc tính của lớp Xe, phương thức Xuất đưa các thông tin của xe và giá thành lên màn hình. Xây dựng lớp dẫn xuất Xe tải kế thừa tất cả các thuộc tính và phương thức trên của lớp Xe, ngoài ra còn có thêm thuộc tính Trọng tải và các phương thức: Phương thức khởi tạo: khởi gán các giá trị thuộc tính cho xe tải. Phương thức Tính giá thành: Giá thành = Trọng tải *200. Phương thức xuất, đưa các thông tin và giá thành của xe tải lên màn hình. Xây dựng chương trình chính sử dụng một con trỏ đối tượng thuộc lớp Xe. Sử dụng con trỏ này để nhập thông tin cho đối tượng thuộc lớp Xe và in các thông tin vừa nhập lên màn hình kèm theo giá thành của Xe. Vẫn sử dụng con trỏ này để nhập thông tin cho đối tượng thuộc lớp Xe tải và in các thông tin vừa nhập lên màn hình kèm theo giá thành của Xe tải. #include #include #include #include class Xe { public: int NamSX; float TL; Xe(int x1,float x2) { NamSX=x1; TL=x2; } Xe() { NamSX=TL=0; } virtual void nhap() { cout >NamSX; cout >TL; } virtual void gt() { float GT=0; GT=(NamSX*0.2+TL); CN: Trần Xuân Thức - 57- tranxuanthuc.pci@gmail.com
  58. Bài tập lập trình hướng đối tượng C++ cout >TT; } void gt() { float G=0; G=TT*200; cout nhap(); cout nhap(); cout xuat(); p->gt(); CN: Trần Xuân Thức - 58- tranxuanthuc.pci@gmail.com
  59. Bài tập lập trình hướng đối tượng C++ cout xuat(); p->gt(); getch(); } CN: Trần Xuân Thức - 59- tranxuanthuc.pci@gmail.com