Đang tải... (xem toàn văn)
Một số chương trình hướng đối tượng trên C++
Chương 10 Một số chương trình hướng đối tượng C++ Chương trình bầy thêm số chương trình hướng đối tượng C++ Đây chương trình tương đối phức tạp, hữu ích sử dụng công cụ mạnh C++ như: Cách truy nhập trực tiếp nhớ hình, kỹ thuật đồ hoạ, trỏ void, tính kế thừa, lớp sở trừu tượng, tương ứng bội, phương thức ảo § Lớp cửa sổ Chương trình gồm lớp cua_so lớp stack + Lớp cửa sổ Thuộc tính gồm: char *noidung; // Trỏ đến vùng nhớ chứa nội dung // soạn thảo cửa sổ int cao,rong ; // Chiều cao chiều rộng cửa sổ int mau; // mau = 16*mau_nen + mau_chu int ra_mh; // Cho biết cửa sổ đưa hình chưa? int posx,posy; // Vị trí trái cửa sổ hình word *pluu; // Trỏ đến vùng nhớ chứa nội dung // phần hình bị cửa sổ đè lên Phương thức gồm: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu); int push(int x,int y); // Đưa cửa sổ hình (x,y) // cho phép soạn thảo cửa sổ // Bấm F6 chuyển sang cửa sổ khác // Bấm ESC kết thúc 504 void pop(); // Tháo gỡ cửa sổ khơi phục hình int get_ra_mh(); + Lớp stack (dùng để quản lý dẫy cửa sổ) Thuộc tính gồm: int max; //Số cửa sổ cực đại quản lý int num; //Số cửa sổ có stack cua_so **pcs; //Con trỏ trỏ đến vùng nhớ chứa //địa đối tượng cua_so Phương thức gồm: stack(); stack(int max_cs); int accept(cua_so *cs,int x,int y); //Đưa cửa sổ //vào stack, lên hình void del(); // Loại cửa sổ khỏi stack, bị xố // khỏi hình Nội dung chương trình: + Đầu tiên cửa sổ thứ GREEN chữa WHITE Có thể soạn thảo + Nếu bấm ESC kết thúc chương trình, bấm F6 thêm cửa sổ thứ hai CYAN chữ MAGENTA Có thể soạn thảo + Nếu bấm ESC kết thúc chương trình, bấm F6 thêm cửa sổ thứ ba RED chữ YELLOW Có thể soạn thảo + Đang cửa sổ, bấm ESC kết thúc chương trình, bấm F6 cửa sổ (theo thứ tự vịng quanh: -> -> -> 1) 505 Chương trình sử dụng phương pháp truy nhập trực tiếp nhớ hình trình bầy chương // CT10_01.CPP // lop cua_so #include #include #include 506 #include typedef unsigned int word; typedef unsigned char byte; struct kt_word { word kt; }; struct kt_byte { byte ma, mau; }; union ky_tu { struct kt_byte h; struct kt_word x; }; typedef union ky_tu far *VP; VP vptr=(VP)MK_FP(0xb800,0); // Vi tri x,y tren man hinh #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) class cua_so { private: char *noidung; int cao, rong; int mau; // mau = 16*mau_nen + mau_chu int ra_mh; int posx,posy; word *pluu; public: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu); int push(int x,int y); void pop(); int get_ra_mh(); }; cua_so::cua_so() { cao=rong=mau=ra_mh=posx=posy=0; noidung=NULL; pluu=NULL; } cua_so::cua_so(int c,int r,byte mau_nen, byte mau_chu) { cao=c; rong=r; mau= 16*mau_nen+mau_chu; ra_mh=posx=posy=0; noidung = (char*)malloc(cao*rong); for (int i=0;ih.ma=ch1; ++xx; if (xx>=posx+rong) {++yy; xx=posx;} if (yy>=posy+cao) break; } else if (ch2==72||ch2==80||ch2==75||ch2==77) { if (ch2==72) yy ; else if (ch2==80) ++yy; else if (ch2==75) xx; else ++xx; if (xx=posx+rong) {++yy; xx=posx;} if (yy=posy+cao) break; } } // Luu ket qua soan thao pnd=noidung; 509 for (i=posx;ipop(); pcs[num]=NULL; } main() { 512 int ch; cua_so w1(10,40,GREEN,WHITE), w2(12,42,CYAN,MAGENTA), w3(14,44,RED,YELLOW); stack s(4); clrscr(); while(1) { ch=s.accept(&w1,5,5); if(ch==1)break; ch=s.accept(&w2,8,8); if(ch==1)break; ch=s.accept(&w3,11,11); if(ch==1)break; } Hàm tạo cmenu(int so_cn_menu,char **nd_menu); dùng để tạo menu (đối tượng kiểu cmenu) Hàm tạo chứa đối là: + Biến so_cn_menu chứa số chức menu + Con trỏ nd_menu trỏ tới vùng nhớ chứa địa chuỗi ký tự dùng làm tiêu đề menu tiêu đề chức menu Ví dụ câu lệnh: char *nd[]={"Quản lý vật tư", "Nhập số liệu", "Tìm kiếm","Kết thúc"}; cmenu mc(3,nd); tạo menu mc gồm chức năng: Nhập số liệu, Tìm kiếm Kết thúc Menu có tiêu đề là: Quản lý vật tư Phương thức int menu(int x,int y,int mau_nen,int mau_chon); thực việc sau: + Hiển thị menu vị trí (x,y) hình Menu có mầu xác định đối mau_nen mầu chức định chọn (hộp sáng) xác định đối mau_chon + Cho phép sử dụng phím mũi tên lên, xuống để di chuyển hộp sáng dùng phím Enter để khỏi phương thức 513 + Sau thoát khỏi, phương thức trả giá trị số thứ tự (tính từ 1) chức chọn Chương trình xây dựng lớp cmenu minh hoạ cách sử dụng lớp /* CT10_02.CPP menu.cpp lop cmenu */ #include #include #include #include #include typedef unsigned int word; typedef unsigned char byte; 514 struct kt_word { word kt; }; struct kt_byte { byte ma, mau; }; union ky_tu { struct kt_byte h; struct kt_word x; }; typedef union ky_tu far *VP; VP vptr=(VP)MK_FP(0xb800,0); // Vi tri x,y tren man hinh #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) class cmenu { private: int so_cn,cao,rong,posx,posy; int chon; char **nd; private: void hiendc(char *dc,int x,int y, int mau); void hien_menu(int x,int y,int mau_nen,int mau_chon); public: cmenu(int so_cn_menu,char **nd_menu); int menu(int x,int y,int mau_nen,int mau_chon); }; cmenu::cmenu(int so_cn_menu,char **nd_menu) { cao=so_cn=so_cn_menu; nd=nd_menu; rong=0; chon=1; int d; for(int i=0;i rong) rong=d; } 515 void cmenu::hiendc(char *dc,int x,int y, int mau) { VP ptr; int i; byte m=16*mau+15; //chu trang for(i=0;ih.mau=m ; ptr->h.ma=32; } for(i=0;ih.ma=dc[i]; } } void cmenu::hien_menu(int x,int y,int mau_nen,int mau_chon) { 516 for(int i=0;inext = new listnode; if(tail->next == NULL) errhandler(); tail = tail->next; } 529 tail->dataptr= temp->dataptr; tail->next=NULL; temp = temp->next; } } // constructor s_list::s_list() : container() { head=NULL; tail=NULL; } s_list::s_list(const s_list &s1):container(s1) 530 { copy(s1); } s_list::~s_list() { this->empty(); } void s_list::operator=(const s_list &s1) { this->empty(); count=s1.count; copy(s1); } void s_list::empty() { listnode *q,*p; p = head; head=NULL; tail=NULL; while (p!=NULL) { q=p; p=p->next; delete q; } } // Lop stack class stack:public s_list { public: stack(); 531 stack(const stack &st); void operator=(const stack &st); virtual int store(void *item); // Cat mot phan tu vao thung virtual void *examine(); // Xem gia tri mot phan tu virtual void *retrieve(); // Lay mot pt }; stack::stack():s_list() { } stack::stack(const stack &st):s_list(st) { } void stack::operator=(const stack &st) { this->s_list::operator=(st); //Dung toan tu gan cua s_list } int stack::store(void *item) // Cat mot phan tu vao thung { //Dua vao dau danh sach listnode *p; p= new listnode ; if(p==NULL) return 1; count++; p->dataptr=item; p->next=head; head=p; return 0; } void *stack::examine() // Xem gia tri mot phan tu { if(count==0) return NULL; else return head->dataptr; } void *stack::retrieve() // Lay mot pt 532 { if(count==NULL) return NULL; else { listnode *p; void *value; value = head->dataptr; p=head; head = p->next; delete p; count ; return value; } } // Lop queue class queue:public stack { public: queue(); queue(const queue &q); void operator=(const queue &q); virtual int store(void *item); // Cat mot phan tu vao thung }; queue::queue(): stack() { } queue::queue(const queue &q):stack(q) { 533 } void queue::operator=(const queue &q) { this->stack::operator=(q); //Dung toan tu gan cua stack } int queue::store(void *item) { // Dat vao cuoi listnode *q; q=new listnode; if(q==NULL)return 1; // Bo sung q->next=NULL; q->dataptr=item; if(count==0) { { head=q; tail=q; } else { tail->next=q; tail=q; } count++; return 0; } class TS { private: char ht[25]; int sobd; float td; public: 534 void nhap() { cout sobd; cout > td; } void xuat() cout