Chương 10 Một số chương trình hướng đối tượng trên C++

Chia sẻ: Men Men | Ngày: | Loại File: DOC | Số trang:25

0
89
lượt xem
29
download

Chương 10 Một số chương trình hướng đối tượng trên C++

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'chương 10 một số chương trình hướng đối tượng trên c++', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Chương 10 Một số chương trình hướng đối tượng trên C++

  1. Chương 10 void pop(); // Tháo gỡ cửa sổ và khôi phục màn hình Một số chương trình hướng đối tượng trên C++ int get_ra_mh(); Chương này trình bầy thêm một số chương trình hướng đối + Lớp stack (dùng để quản lý một dẫy cửa sổ) tượng trên C++. Đây là các chương trình tương đối phức tạp, hữu ích và sử dụng các công cụ mạnh của C++ như: Cách Thuộc tính gồm: truy nhập trực tiếp bộ nhớ màn hình, kỹ thuật đồ hoạ, con trỏ int max; //Số cửa sổ cực đại có thể quản lý void, tính kế thừa, lớp cơ sở trừu tượng, tương ứng bội, int num; //Số cửa sổ hiện có trong stack phương thức ảo. cua_so **pcs; //Con trỏ trỏ đến vùng nhớ chứa § 1. Lớp cửa sổ //địa chỉ của các đối tượng cua_so Chương trình gồm lớp cua_so và lớp stack Phương thức gồm: stack(); + Lớp cửa sổ stack(int max_cs); Thuộc tính gồm: int accept(cua_so *cs,int x,int y); //Đưa một cửa sổ char *noidung; // Trỏ đến vùng nhớ chứa nội dung //vào stack, nó sẽ hiện lên màn // soạn thảo trên cửa sổ hình int cao,rong ; // Chiều cao và chiều rộng cửa sổ void del(); // Loại cửa sổ khỏi stack, nó sẽ bị xoá int mau; // mau = 16*mau_nen + mau_chu // khỏi màn hình int ra_mh; // Cho biết cửa sổ đã được đưa ra màn hình Nội dung chương trình: chưa? int posx,posy; // Vị trí trên trái của cửa sổ trên màn hình + Đầu tiên hiện cửa sổ thứ nhất nền GREEN chữa WHITE. Có thể soạn thảo trên đó. word *pluu; // Trỏ đến vùng nhớ chứa nội dung + Nếu bấm ESC kết thúc chương trình, nếu bấm F6 thì // phần màn hình bị cửa sổ đè lên hiện thêm cửa sổ thứ hai nền CYAN chữ MAGENTA. Có thể Phương thức gồm: soạn thảo trên đó. cua_so(); + Nếu bấm ESC kết thúc chương trình, nếu bấm F6 thì hiện thêm cửa sổ thứ ba nền RED chữ YELLOW. Có thể cua_so(int c,int r,byte mau_nen, byte mau_chu); soạn thảo trên đó. int push(int x,int y); // Đưa cửa sổ ra màn hình tại (x,y) + Đang ở một cửa sổ, nếu bấm ESC thì kết thúc chương // cho phép soạn thảo trên cửa sổ trình, nếu bấm F6 thì hiện cửa sổ tiếp theo (theo thứ tự vòng // Bấm F6 chuyển sang cửa sổ khác quanh: 1 -> 2 -> 3 -> 1). // Bấm ESC kết thúc 504 505
  2. Chương trình sử dụng phương pháp truy nhập trực tiếp private: bộ nhớ màn hình trình bầy trong chương 9. char *noidung; // CT10_01.CPP int cao, rong; // lop cua_so int mau; // mau = 16*mau_nen + mau_chu #include int ra_mh; #include int posx,posy; #include 506 word *pluu; 507 #include public: typedef unsigned int word; cua_so(); typedef unsigned char byte; cua_so(int c,int r,byte mau_nen, byte mau_chu); struct kt_word int push(int x,int y); { void pop(); word kt; int get_ra_mh(); }; }; struct kt_byte { cua_so::cua_so() byte ma, mau; { }; cao=rong=mau=ra_mh=posx=posy=0; union ky_tu noidung=NULL; pluu=NULL; { } struct kt_byte h; cua_so::cua_so(int c,int r,byte mau_nen, byte mau_chu) struct kt_word x; { }; cao=c; rong=r; typedef union ky_tu far *VP; mau= 16*mau_nen+mau_chu; VP vptr=(VP)MK_FP(0xb800,0); ra_mh=posx=posy=0; // Vi tri x,y tren man hinh noidung = (char*)malloc(cao*rong); #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) for (int i=0;i
  3. } if ((ch1=getch())==0) ch2=getch(); int cua_so::push(int x,int y) if (ch1==27)break; // ESC Ket Thuc Soan Thao { else if (ch1==0&&ch2==64)break; //F6 word *p= pluu; char *pnd=noidung; else if (ch1==13) VP ptr; { int i,j; ++yy; xx=posx; if(yy>=posy+cao) break; // Luu man hinh } if (ra_mh==0) else if (ch1!=0) { 508 { 509 ra_mh=1; posx=x;posy=y; ptr=VPOS(xx,yy); for (i=posx;ih.ma=ch1; for (j=posy;j=posx+rong) {++yy; xx=posx;} ptr=VPOS(i,j); *p=ptr->x.kt; ++p; if (yy>=posy+cao) break; } } } else if (ch2==72||ch2==80||ch2==75||ch2==77) // Hien noi dung dang soan thao tren cua so { for (i=posx;i=posx+rong) {++yy; xx=posx;} } if (yy=posy+cao) break; int xx=posx,yy=posy,ch1,ch2; } while (1) } { // Luu ket qua soan thao gotoxy(xx,yy); pnd=noidung;
  4. for (i=posx;i
  5. gt=cs->push(x,y); s.del(); s.del(); s.del(); return gt; } } void stack::del() § 2. Lớp menu { Lớp cmenu có 2 phương thức để tạo lập và sử dụng menu: if (num==0) return; 1. Hàm tạo --num; cmenu(int so_cn_menu,char **nd_menu); pcs[num]->pop(); dùng để tạo một menu (đối tượng kiểu cmenu). Hàm tạo pcs[num]=NULL; chứa 2 đối là: } + Biến so_cn_menu chứa số chức năng của menu main() + Con trỏ nd_menu trỏ tới một vùng nhớ chứa địa chỉ các { chuỗi ký tự dùng làm tiêu đề menu và tiêu đề các chức năng 512 menu. 513 int ch; Ví dụ các câu lệnh: cua_so w1(10,40,GREEN,WHITE), char *nd[]={"Quản lý vật tư", "Nhập số liệu", w2(12,42,CYAN,MAGENTA), "Tìm kiếm","Kết thúc"}; w3(14,44,RED,YELLOW); cmenu mc(3,nd); stack s(4); sẽ tạo một menu mc gồm 3 chức năng: Nhập số liệu, Tìm clrscr(); kiếm và Kết thúc. Menu có tiêu đề là: Quản lý vật tư while(1) 2. Phương thức { int menu(int x,int y,int mau_nen,int mau_chon); ch=s.accept(&w1,5,5); thực hiện các việc sau: if(ch==1)break; + Hiển thị menu tại vị trí (x,y) trên màn hình. Menu có mầu ch=s.accept(&w2,8,8); nền xác định bởi đối mau_nen và mầu chức năng định chọn if(ch==1)break; (hộp sáng) xác định bởi đối mau_chon. ch=s.accept(&w3,11,11); + Cho phép sử dụng các phím mũi tên lên, xuống để di if(ch==1)break; chuyển hộp sáng và dùng phím Enter để thoát khỏi phương } thức.
  6. + Sau khi thoát khỏi, phương thức trả về giá trị bằng số thứ }; tự (tính từ 1) của chức năng được chọn. typedef union ky_tu far *VP; Chương trình dưới đây xây dựng lớp cmenu và minh hoạ VP vptr=(VP)MK_FP(0xb800,0); cách sử dụng lớp này. // Vi tri x,y tren man hinh /* CT10_02.CPP #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) menu.cpp class cmenu lop cmenu { */ private: #include int so_cn,cao,rong,posx,posy; #include int chon; #include char **nd; #include private: #include void hiendc(char *dc,int x,int y, int mau); typedef unsigned int word; void hien_menu(int x,int y,int mau_nen,int typedef unsigned char byte; mau_chon); 514 struct kt_word public: 515 { cmenu(int so_cn_menu,char **nd_menu); word kt; int menu(int x,int y,int mau_nen,int mau_chon); }; }; struct kt_byte cmenu::cmenu(int so_cn_menu,char **nd_menu) { { byte ma, mau; cao=so_cn=so_cn_menu; nd=nd_menu; }; rong=0; union ky_tu chon=1; { int d; for(int i=0;i rong) rong=d; struct kt_word x; }
  7. void cmenu::hiendc(char *dc,int x,int y, int mau) //Bat phim { while(1) VP ptr; int i; { byte m=16*mau+15; //chu trang if( (ch1=getch())==0 ) ch2=getch(); for(i=0;ih.mau=m ; { ptr->h.ma=32; //Di chuyen hop sang } chonluu=chon; for(i=0;icao) chon=1; } if(chon!=chonluu) } { void cmenu::hien_menu(int x,int y,int mau_nen,int hiendc(nd[chonluu],x,y+chonluu,mau_nen); mau_chon) hiendc(nd[chon],x,y+chon,mau_chon); { } 516 517 for(int i=0;i
  8. while(1) } { } chon=mc.menu(5,5,BLUE,MAGENTA); if(chon==1) § 3. Lớp hình học { clrscr(); Chương trình dưới đây gồm: puts("TAM GIAC"); + Lớp “hinh” là lớp cơ sở trừu tượng getch(); clrscr(); + Và 3 lớp dẫn suất từ lớp “hình” là: } - Lớp “khoihop” biểu thị các khối hộp lập phương else if(chon==2) - Lớp “duong” biểu thị các đoạn thẳng qua 2 điểm { - Lớp “tron” biểu thị các đường tròn clrscr(); Chương trình minh hoạ cách dùng tượng ứng bội và puts("HINH TRON"); phương thức ảo. Nội dung chương trình như sau: getch();clrscr(); + Khi chạy chương trình sẽ thấy xuất hiện một khối hộp } lập phương. else if(chon==3) + Có thể di chuyển khối hộp bằng các phím mũi tên. { + Bấm phím Q sẽ xuất hiện một đoạn thẳng. clrscr(); + Có thể di chuyển đoạn thẳng bằng các phím mũi tên. puts("CHU NHAT"); + Bấm phím Q sẽ xuất hiện một đường tròn. getch();clrscr(); + Có thể di chuyển đường tròn bằng các phím mũi tên. } + Bấm phím Q sẽ kết thúc chương trình. else if(chon==4) /* { 518 CT10_03.CPP 519 clrscr(); LOP hinh hoc puts("HINH VUONG"); Minh hoa cach dung: getch(); clrscr(); + lop co so truu tuong } + Tuong ung boi va phuong thuc ao else break; */
  9. #include x=y=a=0; #include } #include khoihop(int m,int x1,int y1, int a1):hinh(m) #include { char getkey(int &dx,int &dy); x=x1; class hinh y=y1; { a=a1; protected: } int mau; virtual void dchuyen(int b); public: void hien(void) hinh(void) { { setfillstyle(1,mau); mau=0; bar3d(x,y,x+a,y+a,a/2,1); } } hinh(int m) { void an(void) mau=m; { } setfillstyle(1,getbkcolor()); virtual void dchuyen(int b)=0; bar(x,y-a/2,x+a+a/2,y+a+a/2); }; } class khoihop : public hinh }; { class duong:public hinh private: { int x,y; private: 520 521 int a ; int x1,y1,x2,y2; public: public: khoihop(void):hinh() duong(void):hinh() { {
  10. x1=x2=y1=y1=0; { } x=a; y=b; r=d; duong(int m,int a,int b,int c,int d):hinh(m) } { virtual void dchuyen(int b); x1=a;y1=b;x2=c;y2=d; void hien(void) } { setcolor(mau); virtual void dchuyen(int b); circle(x,y,r); void hien(void) } { void an(void) setcolor(mau); { line(x1,y1,x2,y2); setcolor(getbkcolor()); } circle(x,y,r); void an(void) } { }; setcolor(getbkcolor()); char getkey(int &dx,int &dy) line(x1,y1,x2,y2); { } int ch1,ch2; }; dx=dy=0; class tron:public hinh while (1) { { private: ch1=getch(); int x,y,r; if (ch1==0) public: ch2=getch(); tron(void):hinh() if (ch1=='q'||ch1=='Q') return('q'); { if ((ch1==0&&(ch2==80||ch2==72||ch2==75|| x=y=r=0; ch2==77))) 522 } { 523 tron(int m,int a,int b,int d):hinh(m) if (ch2==80) dy=1;
  11. else if (ch2==72) dy=-1; x2+=b*dx; else if (ch2==77) dx=1; y1+=b*dy; else dx=-1; y2+=b*dy; return(0); } } } } void tron::dchuyen(int b) } { void khoihop::dchuyen(int b) int dx,dy; { while (1) int dx,dy; { while (1) hien(); if (getkey(dx,dy)=='q') break; { an(); hien(); x+=b*dx; if (getkey(dx,dy)=='q') break; y+=b*dy; an(); } x+=b*dx; } y+=b*dy; void main() } { } int mh=0,mode=0; void duong::dchuyen(int b) initgraph(&mh,&mode,""); { if (graphresult()) int dx,dy; { while (1) printf("\n LOI"); { getch(); hien(); exit(0); if (getkey(dx,dy)=='q') break; } an(); setbkcolor(0); x1+=b*dx; 524 525
  12. // setwritemode(0); tử. Do ở đây dùng kiểu con trỏ void nên có thể đưa vào lớp hinh *h[3]; s_list các phần tử có kiểu bất kỳ. khoihop M(4,300,200,15); 3. Lớp stack thừa kế từ lớp s_list duong D(10,10,10,60,60); 4. Lớp queue thừa kế từ lớp stack tron T(14,200,200,50); Các lớp stack và queue không có các thuộc tính riêng. Hai h[0]=&M; h[1]=&D;h[2]=&T; phương thức quan trọng của các lớp này là: for(int i=0;idchuyen(10); virtual void *retrieve () ; // Lấy ra một phần tử closegraph(); Chú ý là: Lớp stack hoạt động theo nguyên tắc LIFO (vào } sau ra trước) còn lớp queue hoạt động theo nguyên tắc FIFO (vào trước ra trước) . Chương trình sau minh hoạ cách dùng liên kết bội, phương § 4. Các lớp ngăn xếp và hàng đợi thức ảo và con trỏ kiểu void để quản lý các kiểu dữ liệu khác Chương trình tổ chức thành 4 lớp chính: nhau. Hoạt động của chương trình như sau: 1. Lớp container (thùng chứa) gồm 2 thuộc tính: + Trước tiên lần lượt đưa địa chỉ của biến đối tượng ts1, unsigned long count; //Số phần tử trong thùng chứa chuỗi “HA NOI”, biến nguyên a, biến đối tượng ts2 và biến void (*errhandler)(); //Con trỏ tới hàm xử lý lỗi thực x vào ngăn xếp s1 và hàng đợi q1. 2. Lớp s_list thừa kế từ lớp container, có thêm 2 thuộc + Thực hiện phép gán các biến đối tượng: tính các con trỏ kiểu cấu trúc listnode: s2 = s1 ; struct listnode q2 = q1 ; { + Lấy các phần tử trong ngăn xếp s2 theo trình tự ngược void *dataptr; với lúc đưa vào. listnode *next; + Lấy các phần tử trong hàng đợi q2 theo trình tự như lúc }; đưa vào. listnode *head; // Trỏ tới đầu danh sách /* listnode *tail; // Trỏ tới cuối danh sách CT10_05.CPP Các phần tử được chứa trong lớp s_list dưới dạng một Lop vat chua (container) danh sách móc nối đơn. Mỗi nút chứa địa chỉ của một phần Lop danh sach moc noi
  13. Lop ngan xep // 4 phuong thuc thuan ao Lop hang doi virtual int store(void *item)=0;//Cat mot phan tu vao Chu y: thung 1. constructor sao chep cua lop dan suat virtual void *examine()=0; // Xem gia tri mot phan tu 2. toan tu gan cua lop dan suat virtual void *retrieve ()=0; // Lay mot pt ra 3. co the dung cac phuong thuc khac virtual void empty()=0; // Lam cho thung tro nen rong 526 }; 527 de viet constructor va destructor 4. Dung con tro this // Cai dat */ // Ham xl loi mac dinh #include void defaulthandler(); void defaulthandler() #include { #include puts("\nContainer error: memory allocation failure"); #include } #include container::container () #include { //Lop container count=0; errhandler= defaulthandler; class container } { container::container(const container &c) protected: { unsigned long count; //so pt trong thung chua count=c.count; errhandler=c.errhandler; void (*errhandler)(); } public: // Gan container(); void container::operator=(const container &c) container(const container &c); // Ham tao sao chep { void operator=(const container &c); // Gan count=c.count; errhandler=c.errhandler; unsigned long getcount(); // Cho biet so phan tu } // Dinh ham xl loi // Cho biet so pt void seterrorhandler(void (*userhandler)()); unsigned long container::getcount()
  14. { void operator=(const s_list &s1); return count; // 4 phuong thuc ao } virtual int store(void *item)=0; // Cat mot phan tu vao // Dinh ham xl loi // thung void container::seterrorhandler(void (*userhandler)()) virtual void *examine()=0; // Xem gia tri mot phan tu { virtual void *retrieve ()=0; // Lay mot pt ra errhandler=userhandler; } virtual void empty(); // Lam cho thung tro nen rong // Lop danh sach moc noi don }; 528 //Cai dat 529 class s_list:public container void s_list::copy(const s_list &s1) { { protected: head=NULL; tail=NULL; //Cau truc mot nut trong ds listnode *temp = s1.head; struct listnode while(temp!=NULL) { { void *dataptr; if(head==NULL) listnode *next; { }; head= new listnode; listnode *head; if(head==NULL) errhandler(); listnode *tail; tail=head; private: } // phuong thuc sao chep else void copy(const s_list &s1); { public: tail->next = new listnode; s_list(); if(tail->next == NULL) errhandler(); s_list(const s_list &s1); tail = tail->next; ~s_list(); }
  15. tail->dataptr= temp->dataptr; while (p!=NULL) tail->next=NULL; { temp = temp->next; q=p; p=p->next; } delete q; } } // constructor } s_list::s_list() : container() // Lop stack { class stack:public s_list head=NULL; tail=NULL; { } public: s_list::s_list(const s_list &s1):container(s1) stack(); 530 531 { stack(const stack &st); copy(s1); void operator=(const stack &st); } virtual int store(void *item); // Cat mot phan tu vao thung s_list::~s_list() virtual void *examine(); // Xem gia tri mot phan tu { virtual void *retrieve(); // Lay mot pt ra this->empty(); }; } stack::stack():s_list() void s_list::operator=(const s_list &s1) { { } this->empty(); stack::stack(const stack &st):s_list(st) { count=s1.count; } copy(s1); void stack::operator=(const stack &st) } { void s_list::empty() this->s_list::operator=(st); //Dung toan tu gan cua s_list { } listnode *q,*p; int stack::store(void *item) // Cat mot phan tu vao thung p = head; head=NULL; tail=NULL; {
  16. //Dua vao dau danh sach class queue:public stack listnode *p; { p= new listnode ; public: if(p==NULL) return 1; queue(); count++; queue(const queue &q); p->dataptr=item; p->next=head; head=p; return 0; void operator=(const queue &q); } virtual int store(void *item); // Cat mot phan tu vao void *stack::examine() // Xem gia tri mot phan tu thung { }; if(count==0) return NULL; queue::queue(): stack() else { return head->dataptr; } } queue::queue(const queue &q):stack(q) void *stack::retrieve() // Lay mot pt ra { 532 } 533 { if(count==NULL) return NULL; void queue::operator=(const queue &q) else { { this->stack::operator=(q); //Dung toan tu gan cua stack listnode *p; void *value; } value = head->dataptr; int queue::store(void *item) p=head; { head = p->next; // Dat vao cuoi delete p; listnode *q; count--; q=new listnode; return value; if(q==NULL)return 1; } // Bo sung } q->next=NULL; q->dataptr=item; // Lop queue if(count==0)
  17. { { head=q; tail=q; cout
  18. y = *((float*)s2.retrieve()); § 5. Các lớp sắp xếp cout
  19. // n phần tử chứa trong vùng nhớ a1, mỗi + Các phương thức: phần tử private: // có độ dài itemsize, thứ tự tăng được quy định void shift(int i, int n); // bởi hàm ss_nho_hon public: virtual void sapxep(void *a1,int n,int itemsize, 2. Lớp select_sort dẫn xuất từ lớp sort. Lớp này sẽ thực int (*ss_nho_hon)(void* ,void* )) ; // thực hiện việc sắp xếp theo phương pháp chon (xem mục §7 hiện chương 6). // sắp xếp theo phương pháp heap + Các phương thức: sort public: Dưới đây là nội dung tệp C_SORT.H virtual void sapxep(void *a1,int n,int itemsize, //C_SORT.H // Lop co so truu tuong int (*ss_nho_hon)(void* ,void* )) ; // thực hiện // Lop sort // sắp xếp theo phương pháp chọn #include 3. Lớp quick_sort dẫn xuất từ lớp sort. Lớp này sẽ thực #include hiện việc sắp xếp theo phương pháp quick sort (xem mục §7 #include chương 6) #include + Các phương thức: #include #include private: class sort void q_sort(int l, int r); { public: protected: virtual void sapxep(void *a1,int n,int itemsize, void *a; int (*ss_nho_hon)(void* ,void* )) ; // thực hiện int size; // sắp xếp theo phương pháp quick sort int (*nho_hon)(void*,void*); void* dia_chi(int m) 4. Lớp heap_sort dẫn xuất từ lớp sort. Lớp này sẽ thực { 538 539 hiện việc sắp xếp theo phương pháp heap sort (xem mục §7 return (void*) ((char*)a + size*(m-1)); chương 6). }
  20. void hoan_vi(int i, int j) int i,j,r; { sort::sapxep(a1,n,itemsize,ss_nho_hon); 540 void *tg, *di, *dj; for(i=1; i

CÓ THỂ BẠN MUỐN DOWNLOAD

Đồng bộ tài khoản