集合类的设计与实现MFC.docx
- 文档编号:8638826
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:347.50KB
集合类的设计与实现MFC.docx
《集合类的设计与实现MFC.docx》由会员分享,可在线阅读,更多相关《集合类的设计与实现MFC.docx(25页珍藏版)》请在冰豆网上搜索。
集合类的设计与实现MFC
封皮
(按学校要求手工填写)
课程设计任务书
学院
专业
学生姓名
学号
设计题目
集合类的设计与实现
内容及要求:
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握程序设计过程中的结构化程序设计的一般方法,及数据类型在设计中的应用。
3.能够利用所学的基本知识和技能,解决简单的程序设计问题;
通过类与对象的设计,编制一个能演示执行集合的并、交和差运算的程序,要求如下:
(1)集合的元素限定为小写字母字符[‘a’,…,’z’]。
(2)演示程序以用户和计算机的对话方式执行。
(3)以有序链表表示集合。
(4)可进一步实现集合的元素判定和子集判定运算。
进度安排:
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师(签字):
年月日
学院院长(签字)
年月日
1需求分析
1问题描述:
用有序单链表表示集合,实现集合的交、并、差运算,且空间复杂度为O
(1)
2基本功能:
可快速的分别求出两个字符集合的交、并、差。
3输入和输出:
(1)输入:
在C++环境下编写的程序,其输入是简单、方便的,即按提示分别输入两集合的元素。
●输入字符的范围:
小写字母a,b,...,y,z,大写字母A,B,...Y,Z,和数字0,1,...8,9;
●输入形式:
字符集合,按顺序大小排序输入,允许出现重复字符,程序能自动滤去;
(2)输出:
程序采用单链表的存储结构,使得运算快捷简便,显示的结果也明了。
输出结果不含重复或非法字符;
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
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 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;i if(p[i]==x){return1;} return0; } voidifsearch(charx) { if(search(x))cout< "< elsecout< "< } voidadd(charx) {//增加一个整数到集合中 if(cur_size>=max_size)cout<<"集合已满,不可再添加元素! "< elseif(! search(x)){ p[cur_size]=x; cur_size++; } } voiddec(charx){//从集合中去掉一个元素 for(inti=0;i if(p[i]==x) { for(i;i cur_size--;} } //输入 friendistream&operator<<(istream&in,int_set&a)//注意在类内写友元的实现时不能直接使用类成员 { cout<<"请输入集合("< "; for(inti=0;i a.cur_size=a.max_size; returnin;//in可以换别的 } //输出 friendostream&operator>>(ostream&out,int_set&a) { for(inti=0;i cout< returnout; } int_setjiao(int_set&b)//交集 {int_settemp(max_size); for(inti=0;i 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); for(inti=0;i temp.cur_size=cur_size; for(i=0;i if(! search(b.p[i])){ temp.p[temp.cur_size]=b.p[i]; temp.cur_size++;} returntemp; } int_setcha(int_set&b)//求差 { int_settemp(max_size); for(inti=0;i temp.cur_size=cur_size; for(i=0;i Iif(temp.search(b.p[i]))temp.dec(b.p[i]); returntemp; } /**/ }; 4.3主函数设计 voidmain() { int_setobj1(8); int_setobj2(6); cin< cin< obj1.dec (1);//删除一个元素 cout>>obj1; obj1.add(7);//添加一个元素 cout>>obj1; obj1.add(8);//再添加一个元素 obj1.ifsearch(3);//判断元素是否在集合中 obj1.ifsearch(0); cout<<"交集为: ";cout>>obj1.jiao(obj2);//求交集/*若没拷贝构造函数,则指针被提前释放了,输出大的随机数*/ cout<<"并集为: ";cout>>obj1.bing(obj2);//求并集 cout<<"差为: ";cout>>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控件基本信息 控件ID 成员变量类型 成员变量名称 IDC_EDIT1 String m_1 IDC_EDIT2 String m_2 IDC_EDIT3 String 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() { CDialog: : 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); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE);//Setbigicon SetIcon(m_hIcon,FALSE);//Setsmallicon //TODO: Addextrainitializationhere returnTRUE;//returnTRUEunlessyousetthefocustoacontrol } voidCJIHEDlg: : OnSysCommand(UINTnID,LPARAMlParam) { if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog: : OnSysCommand(nID,lParam); } } //Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow //todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel, //thisisautomaticallydoneforyoubytheframework. voidCJIHEDlg: : 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); } else { CDialog: : OnPaint(); } } //Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags //theminimizedwindow. HCURSORCJIHEDlg: : OnQueryDragIcon() { return(HCURSOR)m_hIcon; } intCJIHEDlg: : panduanCF() { UpdateData (1); m_3.Empty(); CStringm,n; for(inti=0;i<=m_1.GetLength()/2;i++) { AfxExtractSubString(m,(LPCTSTR)m_1,i,''); for(intj=i+1;j<=m_1.GetLength()/2;j++) { AfxExtractSubString(n,(LPCTSTR)m_1,j,''); if(m==n){AfxMessageBox("重复输入! ");m_1="\0";m_2="\0";UpdateData(0);return1;} } } for(i=0;i<=m_2.GetLength()/2;i++) { AfxExtractSubString(m,(LPCTSTR)m_2,i,''); for(intj=i+1;j<=m_2.GetLength()/2;j++) { AfxExtractSubString(n,(LPCTSTR)m_2,j,''); if(m==n){AfxMessageBox("重复输入! ");m_1="\0";m_2="\0";UpdateData(0);return1;} } } return0; } 5求相应集合的运算代码 voidCJIHEDlg: : Onjiao() { UpdateData (1); m_3.Empty(); if(panduanCF())return; CStringtem,dem; if(m_1=="\0"&&m_2=="\0"){AfxMessageBox("交集为空,请输入元素");m_3="\0";return;} else{if(m_1=="\0"||m_2=="\0")m_3="空集"; else for(inti=0;i<=m_1.GetLength()/2;i++) { for(intj=0;j<=m_2.GetLength()/2;j++) { 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=="\0")m_3="空集"; UpdateData(0); } voidCJIHEDlg: : Onbing() { UpdateData (1); m_3.Empty(); UpdateData(0); if(m_1=="\0"&&m_2=="\0"){AfxMessageBox("并集为空,请输入元素");return;} if(panduanCF())return; if(m_1=="\0"||m_2=="\0"){m_3=m_1+m_2;UpdateData(0);return;} m_3=m_1; CStringtem; CStringdem; for(inti=0;i { AfxExtractSubString(tem,(LPCTSTR)m_2,i,''); intflag=0;//没有一样的 for(intj=0;j { AfxExtractSubString(dem,(LPCTSTR)m_1,j,''); if(tem==dem) {flag=1;break;} } if(flag==0)m_3=m_3+""+tem; } UpdateData(0); } voidCJIHEDlg: : Onbu() { UpdateData (1); m_3.Empty(); UpdateData(0); if(m_1=="\0"&&m_2=="\0"){AfxMessageBox("差集为空,请输入元素");return;} if(panduanCF())return; if(m_2=="\0"){m_3=m_1;Upda
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 设计 实现 MFC