集合类的设计与实现MFCWord格式.docx

上传人:b****5 文档编号:21775037 上传时间:2023-02-01 格式:DOCX 页数:25 大小:347.50KB
下载 相关 举报
集合类的设计与实现MFCWord格式.docx_第1页
第1页 / 共25页
集合类的设计与实现MFCWord格式.docx_第2页
第2页 / 共25页
集合类的设计与实现MFCWord格式.docx_第3页
第3页 / 共25页
集合类的设计与实现MFCWord格式.docx_第4页
第4页 / 共25页
集合类的设计与实现MFCWord格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

集合类的设计与实现MFCWord格式.docx

《集合类的设计与实现MFCWord格式.docx》由会员分享,可在线阅读,更多相关《集合类的设计与实现MFCWord格式.docx(25页珍藏版)》请在冰豆网上搜索。

集合类的设计与实现MFCWord格式.docx

输出结果不含重复或非法字符;

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1