Tải bản đầy đủ (.pdf) (7 trang)

Lập trình hướng đối tượng - Một số chương trình hướng đối tượng trên C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (109.51 KB, 7 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>Chương 10</b>


<b>M t s ch</b>

<b>ộ</b>

<b>ố</b>

<b>ươ</b>

<b>ng </b>

<b>trình h</b>

<b>ướ</b>

<b>ng đ i t</b>

<b>ố ượ</b>

<b>ng trên C++</b>


Chương này trình b y thêm m t s chầ ộ ố ương trình hướng đ iố
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ữ ử ụ ụ ạ ủ ư
truy nh p tr c ti p b nh màn hình, k thu t đ ho , con trậ ự ế ộ ớ ỹ ậ ồ ạ ỏ
void, tính k th a, l p c s tr u tế ừ ớ ơ ở ừ ượng, tương ng b i,ứ ộ
phương th c o. ứ ả


<b>§<sub> 1. L p c a s</sub><sub>ớ</sub></b> <b><sub>ử</sub></b> <b><sub>ổ</sub></b>


Chương trình g m l p cua_so và l p stackồ ớ ớ
<b>+ L p c a sớ</b> <b>ử</b> <b>ổ</b>


<b>Thu c tính g m:ộ</b> <b>ồ</b>


char *noidung; // Tr đ n vùng nh ch a n i dung ỏ ế ớ ứ ộ
// so n th o trên c a sạ ả ử ổ


int cao,rong ; // Chi u cao và chi u r ng c a sề ề ộ ử ổ
int mau; // mau = 16*mau_nen + mau_chu


int ra_mh; // Cho bi t c a s đã đế ử ổ ược đ a ra màn hìnhư
ch a?ư


int posx,posy; // V trí trên trái c a c a s trên màn hìnhị ủ ử ổ
word *pluu; // Tr đ n vùng nh ch a n i dungỏ ế ớ ứ ộ


// ph n màn hình b c a s đè lênầ ị ử ổ
<b>Phương th c g m:ứ</b> <b>ồ</b>



cua_so();


cua_so(int c,int r,byte mau_nen, byte mau_chu);
int push(int x,int y); // Đ a c a s ra màn hình t i (x,y)ư ử ổ ạ


// cho phép so n th o trên c a sạ ả ử ổ
// B m F6 chuy n sang c a s khácấ ể ử ổ
// B m ESC k t thúcấ ế


void pop(); // Tháo g c a s và khôi ph c màn hìnhỡ ử ổ ụ
int get_ra_mh();


<b>+ L p stack (dùng đ qu n lý m t d y c a s )ớ</b> <b>ể</b> <b>ả</b> <b>ộ</b> <b>ẫ</b> <b>ử</b> <b>ổ</b>
<b>Thu c tính g m:ộ</b> <b>ồ</b>


int max; //S c a s c c đ i có th qu n lýố ử ổ ự ạ ể ả
int num; //S c a s hi n có trong stackố ử ổ ệ


cua_so **pcs; //Con tr tr đ n vùng nh ch a ỏ ỏ ế ớ ứ
//đ a ch c a các đ i tị ỉ ủ ố ượng cua_so
<b>Phương th c g m:ứ</b> <b>ồ</b>


stack();


stack(int max_cs);


int accept(cua_so *cs,int x,int y); //Đ a m t c a sư ộ ử ổ


//vào stack, nó s hi n lên mànẽ ệ


hình


void del(); // Lo i c a s kh i stack, nó s b xoáạ ử ổ ỏ ẽ ị
// kh i màn hình ỏ


<b>N i dung chộ</b> <b>ương trình:</b>


+ Đ 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 đó. ể ạ ả


+ 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 hai n n CYAN ch MAGENTA. Có thệ ử ổ ứ ề ữ ể
so n th o trên đó.ạ ả


+ 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ệ ử ổ ứ ề ữ ể
so n th o trên đó.ạ ả


+ Đang m t c a s , n u b m ESC thì k t thúc chở ộ ử ổ ế ấ ế ương
trình, n u b m F6 thì hi n c a s ti p theo (theo th t vòngế ấ ệ ử ổ ế ứ ự
quanh: 1 -> 2 -> 3 -> 1).


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>Chương trình </b>s d ng phử ụ ương pháp truy nh p tr c ti pậ ự ế
b nh màn hình trình b y trong chộ ớ ầ ương 9.


// CT10_01.CPP
// lop cua_so
#include <stdio.h>
#include <conio.h>
#include <dos.h>


#include <alloc.h>


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;i<cao*rong;++i)


noidung[i]=32;


pluu= (word*)malloc(2*cao*rong);


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

}


int cua_so::push(int x,int y)
{


word *p= pluu; char *pnd=noidung;
VP ptr;


int i,j;


// Luu man hinh
if (ra_mh==0)



{


ra_mh=1; posx=x;posy=y;
for (i=posx;i<=posx+rong-1;++i)


for (j=posy;j<=posy+cao-1;++j)
{


ptr=VPOS(i,j); *p=ptr->x.kt; ++p;
}


}


// Hien noi dung dang soan thao tren cua so
for (i=posx;i<=posx+rong-1;++i)


for (j=posy;j<=posy+cao-1;++j)
{


ptr=VPOS(i,j);
ptr->h.mau=mau;


ptr->h.ma=*pnd; ++pnd;
}


// Soan thao


int xx=posx,yy=posy,ch1,ch2;
while (1)



{


gotoxy(xx,yy);


if ((ch1=getch())==0) ch2=getch();


if (ch1==27)break; // ESC Ket Thuc Soan Thao
else if (ch1==0&&ch2==64)break; //F6


else if (ch1==13)
{


++yy; xx=posx; if(yy>=posy+cao) break;
}


else if (ch1!=0)
{


ptr=VPOS(xx,yy);
ptr->h.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) xx=posx;


if (xx>=posx+rong) {++yy; xx=posx;}
if (yy<posy) yy=posy;


if (yy>=posy+cao) break;
}


}


// Luu ket qua soan thao
pnd=noidung;


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

for (i=posx;i<=posx+rong-1;++i)
for (j=posy;j<=posy+cao-1;++j)


{


ptr=VPOS(i,j);


*pnd=ptr->h.ma; ++pnd;
}


if (ch1==0&&ch2==64) return 0; //F6
else return 1;



}


void cua_so::pop() // Khoi phuc vung nho bi cua so chiem
{


if (ra_mh==0) return;
ra_mh=0;


word *p=pluu;
VP ptr;


int i,j;


for (i=posx;i<=posx+rong-1;++i)
for (j=posy;j<=posy+cao-1;++j)


{


ptr=VPOS(i,j); ptr->x.kt=*p; ++p;
}


}


int cua_so::get_ra_mh()
{


return ra_mh;
}



//class stack
class stack


{


private:


int max,num;
cua_so **pcs;
public:


stack();


stack(int max_cs);


int accept(cua_so *cs,int x,int y);
void del();


};


stack::stack()
{


max=num=0; pcs=NULL;
}


stack::stack(int max_cs)
{


max=max_cs; num=0;



pcs=(cua_so**)malloc(max*sizeof(cua_so*));
for (int i=0;i<max;++i) pcs[i]=NULL;


}


int stack::accept(cua_so *cs,int x,int y)
{


int gt;


if (num==max)return 0;
if (!cs->get_ra_mh())


{


pcs[num]=cs; ++num;
}


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

gt=cs->push(x,y);
return gt;


}


void stack::del()
{


if (num==0) return;
--num;



pcs[num]->pop();
pcs[num]=NULL;
}


main()
{


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;


}



s.del(); s.del(); s.del();
}


<b>§<sub> 2. L p menu</sub><sub>ớ</sub></b>


L p cmenu có 2 phớ ương th c đ t o l p và s d ng menu:ứ ể ạ ậ ử ụ
<b>1. Hàm t oạ</b>


cmenu(int so_cn_menu,char **nd_menu);


dùng đ t o m t menu (đ i tể ạ ộ ố ượng ki u cmenu). Hàm t oể ạ
ch a 2 đ i là:ứ ố


+ Bi n so_cn_menu ch a s ch c năng c a menuế ứ ố ứ ủ


+ 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ỗ ự ề ề ứ
menu.


<b>Ví dụ</b> các 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);


s t o m t menu mc g m 3 ch c năng: Nh p s li u, Tìmẽ ạ ộ ồ ứ ậ ố ệ
ki m và K t thúc. Menu có tiêu đ là: Qu n lý v t tế ế ề ả ậ ư


<b>2. Phương th cứ</b>



int menu(int x,int y,int mau_nen,int mau_chon);
th c hi n các vi c sau:ự ệ ệ


+ Hi n th menu t i v trí (x,y) trên màn hình. Menu có m uể ị ạ ị ầ
n n xác đ nh b i đ i mau_nen và m u ch c năng đ nh ch nề ị ở ố ầ ứ ị ọ
(h p sáng) xác đ nh b i đ i mau_chon.ộ ị ở ố


+ Cho phép s d ng các phím mũi tên lên, xu ng đ diử ụ ố ể
chuy n h p sáng và dùng phím Enter đ thốt kh i phể ộ ể ỏ ương
th c.ứ


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

// Lop sort


#include "c_sort.h"


int ss_tang(void *i1,void *i2)
{


return *((int*)i1) < *((int*)i2);
}


int ss_giam(void *i1,void *i2)
{


return *((int*)i1) > *((int*)i2);
}


void main()
{



int i,n;


struct time t1,t2;


int b[20],a[20], k, tg, sec, hund;
n=10;


sort *s[3];
select_sort ss;
quick_sort qs;
heap_sort hs;


s[0]=&ss; s[1]=&qs; s[2]=&hs;
clrscr();


srand(5000);
for(i=1;i<=n;++i)
b[i]=rand();


cout<<"\nDay ban dau\n ";
for(i=1;i<=n;++i) cout <<b[i]<<" ";


cout<<"\n\nCac day tang sap xep theo ";


cout << "select_sort, quick_sort, heap_sort\n";
for(k=0; k<3; ++k)


{



for(i=1;i<=n;++i)
a[i]=b[i];


s[k]->sapxep (a+1,n,sizeof(int),ss_tang);
//In


for(i=1;i<=n;++i) cout <<a[i]<<" ";
cout<<"\n";


}


cout<<"\n\nCac day giam sap xep theo ";
cout << "select_sort, quick_sort, heap_sort\n";
for(k=0; k<3; ++k)


{


for(i=1;i<=n;++i)
a[i]=b[i];


s[k]->sapxep (a+1,n,sizeof(int),ss_giam);
//In


for(i=1;i<=n;++i) cout <<a[i]<<" ";
cout << "\n";


}
getch();
}



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7></div>

<!--links-->

×