CHƯƠNG 5: KỸ THUẬT KẾ THỪA

Một phần của tài liệu BÀI TẬP CHƯƠNG TRÌNH CHUYÊN ĐỀ NGÀNH LẬP TRÌNH -LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ (Trang 28)

1. Xây dựng các lớp theo phân cấp thừa kế như sau:

Diem

DiemMau Diem3C

Diem3CMau

class Diem3C : public Diem {

int z; //Tọa độ chiều thứ 3

public: . . . }

2. Xây dựng các lớp có quan hệ thừa kế như sau:

class Luanvan //Lớp luận văn

{ private:

char tenlv[31]; //Tên luận văn

char tensv[31]; //Tên sinh viên int nbv; //Năm bảo vệ

public:

Luanvan (); void Nhap(); void Xuat(); };

class GVHDLV:public GiaoVien //Lớp giáo viên hướng dẫn luận văn

{ private:

int slv; //số luận văn

Luanvan *p; //Con trỏ tới vnđ chứa các luận văn

public:

GVHDLV(); ~GVHDLV();

GVHDLV(const GVHDLV &u); void Nhap();

void Xuat();

GVHDLV operator=(const GVHDLV &u); //Toán tử gán

};

Hướng dẫn:

void GVHDLV::Nhap() { GiaoVien::Nhap(); cout << “So luan van”; cin >> slv;

cin.ignore();

p = new LuanVan[slv]; for(int i = 0; i < slv; i++) {

cout << “Luan van thu << i <<”\n”; p[i].Nhap(); //Goi luanVan::Nhap() }

}

void GVHDLV::Xuat() { GiaoVien::Xuat(); (adsbygoogle = window.adsbygoogle || []).push({});

for(int i = 0; i < slv; i++)

p[i].Xuat(); //Goi luanVan::Xuat() }

GVHDLV ::GVHDLV( const GVHDLV &u) : GiaoVien(u) { cout << “GVHDLV ::GVHDLV( GVHDLV &u)\n”; slv = u.slv; p = new LuanVan[slv]; for(int i = 0; i < slv; i++) p[i] = u.p[i]; }

GVHDLV & GVHDLV::operator=(const GVHDLV &u) { cout << “goi ham GVHDLV::operator=()\n”; if(p!= NULL) {

delete[]p; p = NULL; }

//Gán các thành phần mà lớp GVHDLV thừa kế

*((GiaoVien *)this) = (GiaoVien&)u; /*Gọi GiaoVien::operator=(GiaoVien&)*/ //Gán các thành phần bổ sung của lớp GVHDLV slv = u.slv; p = new LV[slv]; for(int i = 0; i < slv; i++) p[i] = u.p[i]; return *this; }

3. Xây dựng các lớp theo phân cấp thừa kế như sau:

Cap

MTV Vector

class Cap {

static int n; /*Dùng chung cho đối tượng MTV và đối tượng Vector*/ public:

void Nhap(); int LayN(); };

int Cap::n = 0; //Khởi tạo thành phần dữ liệu static

class Vector; //Khai báo trước lớp Vector

class MTV:public Cap //Lớp ma trận vuông

{ private: double arr[SIZE][SIZE]; public: void Nhap(); void Xuat();

Vector operator*(const Vector &u); //Toán tử nhân MTV với Vector

};

class Vector:public Cap {

private:

double arr[SIZE]; public:

void Nhap(); void Xuat();

friend Vector MTV::operator*(const Vector &u); /*khai báo bạn lớp Vector*/ };  Hướng dẫn: void MTV::Nhap() { int n; n = LayN(); if(n == 0) { Cap::Nhap(); n = LayN(); } for(int i = 0; i < n; i++) for(int i = 0; i < n; i++) { cout <<”pt[“ << i <<”][“ << j <<”]=”; cin >>arr[i][j]; } } void Vector::Nhap() { int n; n = LayN(); if(n == 0) { Cap::Nhap(); n = LayN(); } for(int i = 0; i < n; i++) { cout <<”pt[“ << i <<”]=”; cin >>arr[i]; } }

Hinh

Hinh2C Hinh3C

Tron vuong TGDeu Cau LapPhuong

class Hinh { public:

virtual double DienTich() = 0;

virtual void Xuat() = 0; //Xuất thông tin của hình }; (adsbygoogle = window.adsbygoogle || []).push({});

class Hinh2C : public Hinh { public:

virtual double ChuVi() = 0; };

class Hinh3C : public Hinh { public:

virtual double TheTich() = 0; };

class Tron : public Hinh2C { private: double r; public: Tron(double rr); double DienTich(); double ChuVi(); void Xuat(); };

class Vuong : public Hinh2C { . . .

};

class TGDeu : public Hinh2C { . . .

};

private: double r; public: Cau(double rr); double DienTich(); double TheTich(); void Xuat(); };

class LapPhuong : public Hinh3C { . . .

};

Lưu ý:

DT(Cầu) = 4*PI*r2 TT(Cầu) = PI*r3/4

DT(L.phương) = 6*a2 TT(L.Phương) = a3

DT(TG.đều) = a2*sqrt(3)/2 CV(TG.Đều) = 3a

5. Xây dựng các lớp theo phân cấp thừa kế như sau:

NV

NVVP NVBH NVSX

clas NV { //Lớp nhân viên private:

char msnv[21]; //Mã số nhân viên char ht[31]; //Họ tên

double ml; //Mức lương

int loai; /*Loại nhân viên = 0: nhân viên văn phòng, 1:nhân viên bán hàng, 2:nhân viên sản

xuất*/

public: NV();

virtual void Nhap(); virtual void Xuat();

virtual double TienThuong() = 0; };

private:

double tgct; //Thời gian công tác tính theo tháng public: NVVP (); void Nhap(); void Xuat(); double TienThuong(); };

clas NVBH : public NV { //Lớp nhân viên bán hàng private: double hst; //Hệ số thưởng public: NVBH (); void Nhap(); void Xuat(); double TienThuong() ; }; (adsbygoogle = window.adsbygoogle || []).push({});

clas NVSX : public NV { //Lớp nhân viên sản xuất

private:

double tssp; //Tổng sàn phẩm tính từ đầu năm

public: NVSX (); void Nhap(); void Xuat(); double TienThuong(); }; //Hàm chính void main() {

NV *pnv[20]; //Mảng các con trỏ kiểu lớp trừu tượng

int n; //Lưu số nhân viên

int loai; //0: nvvp, 1: nvbh, 2:nvsx int i; <Nhap n> for(i = 0; i < n; i++) { do { <Nhap loai>

} while(loai < 0 || loai > 2); if(loai == 0)

pnv[i] = new NVVP; else if(loai == 1)

pnv[i] = new NVBH; else pnv[i] = new NVSX; pnv[i] -> Nhap();

}

for(i = 0; i < n; i++) {

cout << “ ** Nhan vien thu “ << i <<” **\n”; pnv[i]->Xuat();

cout <<”Tien luong: “ << pnv[i]->TienLuong() << “\n”; }

}

Lưu ý: Tiền thưởng được tính theo quy tắc sau: Đối với nhân viên văn phòng

nếu tgct < 6 thì tiền thưởng = 100000

ngược lại tiền thưởng = 200000 + ml * 10% * tgct/6 Đối với nhân viên bán hàng

tiền thưởng = 150000 * hst Đối với nhân viên sản xuất

Một phần của tài liệu BÀI TẬP CHƯƠNG TRÌNH CHUYÊN ĐỀ NGÀNH LẬP TRÌNH -LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ (Trang 28)