集合类的设计与实现MFCWord格式.docx
《集合类的设计与实现MFCWord格式.docx》由会员分享,可在线阅读,更多相关《集合类的设计与实现MFCWord格式.docx(25页珍藏版)》请在冰豆网上搜索。
输出结果不含重复或非法字符;
2算法基本原理
Setl={a,b,x,w},Set2={a,b,y,z},
Setl∪Set2={a,b,,x,y,z,w}
Setl∩Set2={a,b}
Setl-Set2={x,w}
3类设计
从上面的算法分析可以看到,本设计关键是集合的并,交,差运算。
可以定义一个类int_set,然后由该类定义出私有和公有成员函数,为主函数的执行做好铺垫
4详细设计
整个程序分为三大块,先是类的接口,定义出基类后再在类中定义出相关成员函数:
接着是累的实现部分,写出具体的函数代码,用以执行相关功能;
最后则是主函数,用一天调用各个函数并执行相应的输入输出功能
4.1类的接口设计
#include<
iostream.h>
classint_set
{
private:
intmax_size;
intcur_size;
char*p;
public:
int_set(constint_set&
a)
{//必须有拷贝构造函数,因为下面以对象为返回值
max_size=a.max_size;
cur_size=a.cur_size;
p=newchar[a.max_size];
for(inti=0;
i<
cur_size;
i++)
p[i]=a.p[i];
}
int_set(intx)
{
cur_size=0;
max_size=x;
p=newchar[x];
~int_set(){delete[]p;
}
4.2类的实现
intsearch(charx){//判断一个元素是否在集合中
for(inti=0;
max_size;
if(p[i]==x){return1;
return0;
voidifsearch(charx)
if(search(x))cout<
<
x<
"
在集合中!
endl;
elsecout<
不在集合中!
voidadd(charx)
{//增加一个整数到集合中
if(cur_size>
=max_size)cout<
集合已满,不可再添加元素!
elseif(!
search(x)){
p[cur_size]=x;
cur_size++;
voiddec(charx){//从集合中去掉一个元素
for(inti=0;
if(p[i]==x)
for(i;
max_size-1;
i++)p[i]=p[i+1];
cur_size--;
}
//输入
friendistream&
operator<
(istream&
in,int_set&
a)//注意在类内写友元的实现时不能直接使用类成员
{
cout<
请输入集合("
a.max_size<
个小写字母(a~z)):
;
a.max_size;
i++)cin>
>
a.p[i];
//不能直接写p[i]
a.cur_size=a.max_size;
returnin;
//in可以换别的
}
//输出
friendostream&
operator>
(ostream&
out,int_set&
for(inti=0;
a.cur_size;
i++)cout<
a.p[i]<
'
'
cout<
returnout;
int_setjiao(int_set&
b)//交集
{int_settemp(max_size);
b.cur_size;
Iif(search(b.p[i])){
temp.p[temp.cur_size]=b.p[i];
temp.cur_size++;
returntemp;
int_setbing(int_set&
b)//并集
int_settemp(max_size+b.max_size);
i++)temp.p[i]=p[i];
temp.cur_size=cur_size;
for(i=0;
if(!
search(b.p[i])){
int_setcha(int_set&
b)//求差
int_settemp(max_size);
for(i=0;
Iif(temp.search(b.p[i]))temp.dec(b.p[i]);
/**/
};
4.3主函数设计
voidmain()
int_setobj1(8);
int_setobj2(6);
cin<
obj1;
//输入集合
obj2;
obj1.dec
(1);
//删除一个元素
cout>
obj1.add(7);
//添加一个元素
obj1.add(8);
//再添加一个元素
obj1.ifsearch(3);
//判断元素是否在集合中
obj1.ifsearch(0);
cout<
交集为:
cout>
obj1.jiao(obj2);
//求交集/*若没拷贝构造函数,则指针被提前释放了,输出大的随机数*/
并集为:
obj1.bing(obj2);
//求并集
差为:
obj1.cha(obj2);
//差运算
5DOS界面程序运行结果及分析
5.1程序运行结果
5.2运行结果分析
在程序运行过程中,前面的部分必须有拷贝构造函数,因为后续需要以对象为返回值,中间的部分则需要注意在类内写友元的实现时不能直接使用类成员,最后的部分若没拷贝构造函数,则指针被提前释放了,会输出大的随机数,则不符合题目要求。
6基于MFC的图形界面程序开发
MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:
MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。
6.1基于MFC的图形界面程序设计
(1)界面设计
首先在VC中建立MFCAppWizard(exe)工程,名称为集合类,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程
图4建立MFCAppWizard(exe)工程
图5建立基于对话框的应用程序
将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6所示。
图6方集合的并交差界面设计
图6所示的界面中包含了3个Edit控件,6个Button控件,控件的基本信息列表如下表1所示。
控件类别
控件ID
控件Caption
说明
EditBox
IDC_EDIT1
集合1
IDC_EDIT2
集合2
IDC_EDIT3
所求集合
Botton
IDC_BUTTON1
计算交集
IDC_BUTTON2
计算并集
IDC_BUTTON3
计算差集A-B
IDC_BUTTON4
计算差集B-A
IDC_BUTTON6
验证集合关系
表1控件基本信息
(2)代码设计
为了能够将对话框界面上的控件能够与代码联系起来,需要为3个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图7所示。
图7成员变量设置界面
通过该界面设置与3个EditBox控件对应的成员变量,具体如表2所示。
表2控件基本信息
成员变量类型
成员变量名称
String
m_1
m_2
m_3
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
1将JIHE.h文件和JIHE.cpp文件合并成一个文件,重新命名为JIHE.h,并将其加入MFC工程。
2在对话框类的实现文件JIHEDlg.cpp中加入#include"
Jihe.h"
,以实现在该文件中可使用Jihe类。
3在JIHEDlg.cpp文件中加入以下全局变量的定义,以实现JIHEDlg类和JIHE类之间的通信,具体代码如下:
CJIHEDlg:
:
CJIHEDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CJIHEDlg:
IDD,pParent)
//{{AFX_DATA_INIT(CJIHEDlg)
m_1=_T("
);
m_2=_T("
m_3=_T("
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
voidCJIHEDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CJIHEDlg)
DDX_Text(pDX,IDC_EDIT1,m_1);
DDX_Text(pDX,IDC_EDIT2,m_2);
DDX_Text(pDX,IDC_EDIT3,m_3);
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CJIHEDlg,CDialog)
//{{AFX_MSG_MAP(CJIHEDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,Onjiao)
ON_BN_CLICKED(IDC_BUTTON2,Onbing)
ON_BN_CLICKED(IDC_BUTTON3,Onbu)
ON_BN_CLICKED(IDC_BUTTON4,Oncha)
ON_BN_CLICKED(IDC_BUTTON5,Onduichencha)
ON_BN_CLICKED(IDC_BUTTON6,Onbaohan)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4运行代码
BOOLCJIHEDlg:
OnInitDialog()
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialog:
OnSysCommand(nID,lParam);
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
OnPaint();
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCJIHEDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
intCJIHEDlg:
panduanCF()
UpdateData
(1);
m_3.Empty();
CStringm,n;
for(inti=0;
=m_1.GetLength()/2;
{
AfxExtractSubString(m,(LPCTSTR)m_1,i,'
for(intj=i+1;
j<
j++)
AfxExtractSubString(n,(LPCTSTR)m_1,j,'
if(m==n){AfxMessageBox("
重复输入!
m_1="
\0"
m_2="
UpdateData(0);
return1;
for(i=0;
=m_2.GetLength()/2;
AfxExtractSubString(m,(LPCTSTR)m_2,i,'
AfxExtractSubString(n,(LPCTSTR)m_2,j,'
return0;
5求相应集合的运算代码
Onjiao()
if(panduanCF())return;
CStringtem,dem;
if(m_1=="
&
&
m_2=="
){AfxMessageBox("
交集为空,请输入元素"
m_3="
return;
else{if(m_1=="
||m_2=="
)m_3="
空集"
for(inti=0;
for(intj=0;
{
AfxExtractSubString(tem,(LPCTSTR)m_1,i,'
AfxExtractSubString(dem,(LPCTSTR)m_2,j,'
if(tem==dem)
if(m_3.GetLength()==0)
m_3=tem;
elsem_3=m_3+"
"
+tem;
}
if(m_3=="
UpdateData(0);
Onbing()
并集为空,请输入元素"
return;
if(panduanCF())return;
||m_2=="
){m_3=m_1+m_2;
return;
m_3=m_1;
CStringtem;
CStringdem;
for(inti=0;
m_2.GetLength();
AfxExtractSubString(tem,(LPCTSTR)m_2,i,'
intflag=0;
//没有一样的
m_1.GetLength();
AfxExtractSubString(dem,(LPCTSTR)m_1,j,'
{flag=1;
break;
if(flag==0)m_3=m_3+"
Onbu()
差集为空,请输入元素"
if(m_2=="
){m_3=m_1;
Upda