24/05/2018, 22:11

Thiết kế chương trình theo hướng đối tượng-các ví dụ

Ví dụ 7.1: Tính tiền lương của các nhân viên trong cơ quan theo các dạng khác nhau. Dạng người lao động lãnh lương từ ngân sách Nhà nước được gọi là cán bộ, công chức (dạng biên chế). Dạng người lao động lãnh lương từ ngân sách của cơ quan ...

Ví dụ 7.1: Tính tiền lương của các nhân viên trong cơ quan theo các dạng khác nhau. Dạng người lao động lãnh lương từ ngân sách Nhà nước được gọi là cán bộ, công chức (dạng biên chế). Dạng người lao động lãnh lương từ ngân sách của cơ quan được gọi là người làm hợp đồng. Như vậy hệ thống chúng ta có hai đối tượng: biên chế và hợp đồng.

  Hai loại đối tượng này có đặc tính chung đó là viên chức làm việc cho cơ quan. Từ đây có thể tạo nên lớp cơ sở để quản lý một viên chức (lớp Nguoi) bao gồm mã số, họ tên và lương.

  Sau đó chúng ta xây dựng các lớp còn lại kế thừa từ lớp cơ sở trên:

Lớp dành cho cán bộ, công chức (lớp BienChe) gồm các thuộc tính: hệ số lương, tiền phụ cấp chức vụ.

Lớp dành cho người làm hợp đồng (lớp HopDong) gồm các thuộc tính: tiền công lao động, số ngày làm việc trong tháng, hệ số vượt giờ.

Hình 7.3

File PERSON.H

PERSON.H1: //PERSON.H2: Định nghĩa lớp Nguoi3: #ifndef PERSON_H4: #define PERSON_H5: 6: #include <iostream.h>7:8: #define MAX_TEN 509: #define MAX_MASO 510: #define MUC_CO_BAN 12000011:12: class Nguoi13: {14: protected:15: char HoTen[MAX_TEN];16: char MaSo[MAX_MASO];17: float Luong;18: public:19: Nguoi();20: virtual void TinhLuong()=0;21: void Xuat() const;22: virtual void Nhap();23: };24:25: #endif

File PERSON.CPP

PERSON.CPP1: //PERSON.CPP2: Định nghĩa hàm thành viên cho lớp Nguoi3: #include <iomanip.h>4: #include <string.h>5: #include "person.h"6:7: Nguoi::Nguoi()8: {9: strcpy(HoTen,"");10: strcpy(MaSo,"");11: Luong=0;12: }13:14: void Nguoi::Xuat() const15: {16: cout<<"Ma so:"<<MaSo<<",Ho va ten:"<<HoTen17:       #9; <<",Luong:"<<setiosflags(ios::fixed)<<setprecision(0)<<Luong<<endl;18: }19:20: void Nguoi::Nhap()21: {22: cout<<"Ma so:";23: cin>>MaSo;24: cin.ignore();25: cout<<"Ho va ten:";26: cin.getline(HoTen,MAX_TEN);27: }

File STAFF.H

STAEF.H1: //STAFF.H2 Định nghĩa lớp BienChe3: #ifndef STAFF_H4: #define STAFF_H5:5: #include "person.h"6:7: class BienChe: public Nguoi8: {9: protected:10: float HeSoLuong;11: float HeSoPhuCap;12: public:13: BienChe();14: virtual void TinhLuong();15: virtual void Nhap();16: };17:18: #endif

File STAFF.CPP

STAEF.CPP1: //STAFF.CPP2: Định nghĩa hàm thành viên cho lớp BienChe3: #include "staff.h"4:5: BienChe::BienChe()6: {7: HeSoLuong=HeSoPhuCap=0;8: }9:10: void BienChe::Nhap()11: {12: Nguoi::Nhap();13: cout<<"He so luong:";14: cin>>HeSoLuong;15: cout<<"He so phu cap chu vu:";16: cin>>HeSoPhuCap;17: }18:19: void BienChe::TinhLuong()20: {21: Luong=MUC_CO_BAN*(1.0+HeSoLuong+HeSoPhuCap);22: }

File CONTRACT.H

CONTRACT.H1: //CONTRACT.H2: Định nghĩa lớp HopDong3: #ifndef CONTRACT_H4: #define CONTRACT_H5:6: #include "person.h"7:8: class HopDong : public Nguoi9: {10: protected:11: float TienCong;12: float NgayCong;13: float HeSoVuotGio;14: public:15: HopDong();16: virtual void TinhLuong();17: virtual void Nhap();18: };19:20: #endif

File CONTRACT.CPP:

CONTRACT.CPP1: //CONTRACT.CPP2: Định nghĩa hàm thành viên cho lớp HopDong3: #include "contract.h"4:5: HopDong::HopDong()6: {7: TienCong=NgayCong=HeSoVuotGio=0;8: }9:10: void HopDong::Nhap()11: {12: Nguoi::Nhap();13: cout<<"Tien cong:";14: cin>>TienCong;15: cout<<"Ngay cong:";16: cin>>NgayCong;17: cout<<"He so vuot gio:";18: cin>>HeSoVuotGio;19: }20:21: void HopDong::TinhLuong()22: {23: Luong=TienCong*NgayCong*(1+HeSoVuotGio);24: }

File CT7_1.CPP:

CT7_1.CPP1: //CT7_1.CPP2: //Chương trình 7.13: #include <iostream.h>4: #include <ctype.h>5: #include "person.h"6: #include "staff.h"7: #include "contract.h"8:9: int main()10: {11: Nguoi *Ng[100];12: int N=0;13: char Chon,Loai;14: do15: {16: cout<<"Bien che hay Hop dong (B/H)? ";17: cin>>Loai;18: Loai=toupper(Loai);19: if (Loai=='B')20: Ng[N]=new BienChe;21: else22: Ng[N]=new HopDong;23: Ng[N++]->Nhap();24: cout<<"Tiep tuc (C/K)? ";25: cin>>Chon;26: Chon=toupper(Chon);27: if ((N==100)||(Chon=='K'))28: break;29: }30: while (1);31: for(int I=0;I<N;++I)32: {33: Ng[I]->TinhLuong();34: Ng[I]->Xuat();35: }36: return 0;37: }

Chúng ta chạy ví dụ 7.1, kết quả ở hình 7.4

Hình 7.4: Kết quả của ví dụ 7.1

Ví dụ 7.2: Giả sử cuối năm học cần trao giải thưởng cho các sinh viên xuất sắc và các giảng viên có nhiều công trình khoa học được công bố trên tạp chí. Các lớp trong cây phả hệ như hình 7.5: lớp Nguoi để quản lý hồ sơ cá nhân, lớp SinhVien quản lý về sinh viên và lớp GiangVien quản lý giảng viên.

Lớp Nguoi:

Dữ liệu họ và tên.

Phương thức kiểm tra khả năng được khen thưởng. Đây là phương thức thuần ảo.

Phương thức xuất. Đây là phương thức thuần ảo.

Lớp SinhVien:

Dữ liệu điểm trung bình.

Phương thức kiểm tra khả năng được khen thưởng.

Phương thức xuất.

Lớp GiangVien:

Dữ liệu điểm trung bình.

Phương thức kiểm tra khả năng được khen thưởng.

Phương thức xuất.

Hình 7.5

File PERSON.H

PERSON.H1: //PERSON.H2: Định nghĩa lớp Nguoi3: #ifndef PERSON_H4: #define PERSON_H5:6: #include <iostream.h>7:8: #define MAX_TEN 509:10: class Nguoi11: { 12: protected:13: char HoTen[MAX_TEN];14: public:15: Nguoi(char *HT);16: virtual int DuocKhenThuong() const=0;17: virtual void Xuat() const=0;18: };19:20: #endif

File PERSON.CPP:

PERSON.CPP1: //PERSON.CPP2: Định nghĩa hàm thành viên cho lớp Nguoi3: #include <string.h>4: #include "person.h"5:6: Nguoi::Nguoi(char *HT)7: {8: strcpy(HoTen,HT);9: }

File STUDENT.H:

STUDENT.H1: //STUDENT.H2: Định nghĩa lớp SinhVien3: #ifndef STUDENT_H4: #define STUDENT_H5:6: #include "person.h"7:8: class SinhVien : public Nguoi9: {10: protected:11: float DiemTB;12: public:13: SinhVien(char *HT,float DTB);14: virtual int DuocKhenThuong() const;15: virtual void Xuat() const;16: };17:18: #endif

File STUDENT.CPP:

STUDENT.CPP1: //STUDENT.CPP2: Định nghĩa hàm thành viên cho lớp SinhVien3: #include "student.h"4:5: SinhVien::SinhVien(char *HT,float DTB):Nguoi(HT)6: {7: DiemTB=DTB;8: }9:10: int SinhVien::DuocKhenThuong() const11: {12: return DiemTB>9.0;13: }14:15: void SinhVien::Xuat() const16: {17: cout<<"Ho va ten cua sinh vien:"<<HoTen;18: }

File TEACHER.H:

TEACHER.H1: //TEACHER.H2: Định nghĩa lớp GiangVien3: #ifndef TEACHER_H4: #define TEACHER_H5:6: #include "person.h"7:8: class GiangVien : public Nguoi9: {10: protected:11: int SoBaiBao;12: public:13: GiangVien(char *HT,int SBB);14: virtual int DuocKhenThuong() const;15: virtual void Xuat() const;16: };17:18: #endif

File TEACHER.CPP:

TEACHER.CPP1: //TEACHER.CPP2: Định nghĩa hàm thành viên cho lớp GiangVien3: #include "teacher.h"4:5: GiangVien::GiangVien(char *HT,int SBB):Nguoi(HT)6: {7: SoBaiBao=SBB;8: }9:10: int GiangVien::DuocKhenThuong() const11: {12: return SoBaiBao>5;13: }14:15: void GiangVien::Xuat() const16: {17: cout<<"Ho va ten cua giang vien:"<<HoTen;18: }

File CT7_2.CPP:

CT7_2.CPP1: //CT7_2.CPP2: //Chương trình 7.23: #include <ctype.h>4: #include "person.h"5: #include "student.h"6: #include "teacher.h"7:8: int main()9: {10: Nguoi *Ng[100];11: int N=0;12: char Chon,Loai;13: char HoTen[MAX_TEN];14: do15: {16: cout<<"Ho va ten:";17: cin.getline(HoTen,MAX_TEN);18: cout<<"Sinh vien hay Giang vien(S/G)? ";19: cin>>Loai;20: Loai=toupper(Loai);21: if (Loai=='S')22: {23: float DTB;24: cout<<"Diem trung binh:";25: cin>>DTB;26: Ng[N++]=new SinhVien(HoTen,DTB);27: }28: else29: {30: int SoBaiBao;31: cout<<"So bai bao:";32: cin>>SoBaiBao;33: Ng[N++]=new GiangVien(HoTen,SoBaiBao);34: }35: cout<<"Tiep tuc (C/K)? ";36: cin>>Chon;37: Chon=toupper(Chon);38: cin.ignore();39: if ((N==100)||(Chon=='K'))40: break;41: }42: while (1);43: for(int I=0;I<N;++I)44: {45: Ng[I]->Xuat();46: if (Ng[I]->DuocKhenThuong())47: cout<<". Nguoi nay duoc khen thuong";48: cout<<endl;49: }50: return 0;51: }

Chúng ta chạy ví dụ 7.2, kết quả ở hình 7.6

Hình 7.6: Kết quả của ví dụ 7.2

Ví dụ 7.3: Giả sử cần phải tạo các hình: hình tròn và hình chữ nhật được tô theo hai màu red và blue. Xây dựng một cây phả hệ để quản lý các hình này.

Trước hết chúng ta cần có lớp cơ sở Shape để lưu trữ thông tin chung cho các hình, sau đó là hai lớp dẫn xuất Rectangle về hình hình chữ nhật và Circle về hình tròn như hình 7.7

Lớp Shape:

Tọa độ tâm.

Màu đường biên.

Màu tô.

Phương thức thiết lập tô màu.

Phương thức vẽ hình. Đây là phương thức thuần ảo.

Lớp Rectangle:

Chiều dài và chiều rộng.

Phương thức vẽ hình.

Lớp Circle:

Bán kính.

Phương thức vẽ hình.

Hình 7.7

File SHAPE.H:

SHAPE.H1: //SHAPE.H2: Định nghĩa lớp Shape3: #ifndef SHAPE_H4: #define SHAPE_H5:6: #include <iostream.h>7: #include <graphics.h>8:9: class Shape10: {11: protected:12: int XC,YC; //Tọa độ tâm13: int BoundaryColor; //Màu đường biên14: int FillColor; //Màu tô15: void Setting() const; //Thiết lập các thông số vẽ và tô màu16: public:17: Shape(int X,int Y,int BC,int FC);18: virtual void Draw() const=0;19: };20:21: #endif

File SHAPE.CPP:

SHAPE.CPP1: //SHAPE.CPP2: Định nghĩa hàm thành viên cho lớp Shape3: #include "shape.h"4:5: Shape::Shape(int X,int Y,int BC,int FC)6: {7: XC=X;8: YC=Y;9: BoundaryColor=BC;10: FillColor=FC;11: }12:13: void Shape::Setting() const14: {15: setcolor(BoundaryColor);16: setlinestyle(SOLID_LINE,0,THICK_WIDTH);17: setfillstyle(SOLID_FILL,FillColor);18: }

File RECT.H:

RECT.H1: //Rect.H2: Định nghĩa lớp Rectangle3: #ifndef RECT_H4: #define RECT_H5:6: #include "shape.h"7:8: class Rectangle : public Shape9: {10: protected:11: int Width,Height;12: public:13: Rectangle(int X,int Y,int BC,int FC,int W,int H);14: virtual void Draw() const;15: };16:17: #endif
0