集合类的设计与实现(MFC)_第1页
集合类的设计与实现(MFC)_第2页
集合类的设计与实现(MFC)_第3页
集合类的设计与实现(MFC)_第4页
集合类的设计与实现(MFC)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

封封 皮皮 (按学校要求手工填写)(按学校要求手工填写) 课 程 设 计 任 务 书 学院专业 学生姓名学号 设计题目集合类的设计与实现 内容及要求: 1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 2.初步掌握程序设计过程中的结构化程序设计的一般方法,及数据类型在设 计中的应用。 3.能够利用所学的基本知识和技能,解决简单的程序设计问题; 通过类与对象的设计,编制一个能演示执行集合的并、交和差运算的程序, 要求如下: (1)集合的元素限定为小写字母字符a,z。 (2)演示程序以用户和计算机的对话方式执行。 (3)以有序链表表示集合。 (4)可进一步实现集合的元素判定和子集判定运算。 进度安排: 第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计; 第 18 周:程序的设计、调试与实现; 第 19 周:程序测试与分析,撰写课程设计报告,进行答辩验收。 指导教师(签字): 年 月 日 学院院长(签字) 年 月 日 目目 录录 1 需求分析 .- 1 - 2 算法基本原理 .- 1 - 3 类设计 .- 1 - 4 详细设计 .- 2 - 4.1 类的接口设计 .- 2 - 4.2 类的实现 .- 2 - 4.3 主函数设计 .- 4 - 5 DOS 界面程序运行结果及分析 .- 5- 5.1 程序运行结果 .- 5 - 5.2 运行结果分析.- 5 - 6 基于 MFC 的图形界面程序开发.- 6 - 6.1 基于 MFC 的图形界面程序设计.- 6 - 6.2 程序测试 .- 17 - 6.3 MFC 程序编写总结.- 19 - 7 参考文献 .- 19 - - 1 - 1 需求分析需求分析 1 问题描述:用有序单链表表示集合,实现集合的交、并、差运算,且空间复 杂度为 O(1) 2 基本功能:可快速的分别求出两个字符集合的交、并、差。 3 输入和输出: (1)输入:在 C+环境下编写的程序,其输入是简单、方便的,即 按提示分别输入两集合的元素。 输入字符的范围:小写字母 a,b,.,y,z,大写字母 A,B,.Y,Z,和数 字 0,1,.8,9; 输入形式:字符集合,按顺序大小排序输入,允许出现重复字符,程序 能自动滤去; (2)输出:程序采用单链表的存储结构,使得运算快捷简便,显示的结果 也明了。 输出结果不含重复或非法字符; 2 算法基本原理算法基本原理 Setla,b,x,w,Set2a,b,y,z, SetlSet2a,b,x,y,z,w SetlSet2a,b SetlSet2 x,w 3 类设计类设计 从上面的算法分析可以看到,本设计关键是集合的并,交,差运算。可以 定义一个类int_set,然后由该类定义出私有和公有成员函数,为主函数的执行 做好铺垫 4 详细设计详细设计 整个程序分为三大块,先是类的接口,定义出基类后再在类中定义出相关成员 函数:接着是累的实现部分,写出具体的函数代码,用以执行相关功能;最后 - 2 - 则是主函数,用一天调用各个函数并执行相应的输入输出功能 4.1 类的接口设计 #include class int_set private: int max_size; int cur_size; char *p; public: int_set(const int_set cur_size=a.cur_size; p=new chara.max_size; for(int i=0;icur_size;i+) pi=a.pi; int_set(int x) cur_size=0; max_size=x; p=new charx; int_set()delete p; 4.2 类的实现 int search(char x) /判断一个元素是否在集合中 for(int i=0;imax_size;i+) if(pi=x)return 1; return 0; void ifsearch(char x) - 3 - if(search(x)coutx在集合中!endl; else coutx不在集合中!=max_size)cout集合已满,不可再添加元素!endl; else if(!search(x) pcur_size=x; cur_size+; void dec(char x) / 从集合中去掉一个元素 for(int i=0;imax_size;i+) if(pi=x) for(i;ia.pi;/不能直接写 pi a.cur_size=a.max_size; return in; /in 可以换别的 /输出 friend ostream ia.cur_size;i+)couta.pi ; coutendl; return out; int_set jiao(int_set for(int i=0;ib.cur_size;i+) - 4 - I if(search(b.pi) temp.ptemp.cur_size=b.pi; temp.cur_size+; return temp; int_set bing(int_set for(int i=0;imax_size;i+)temp.pi=pi; temp.cur_size=cur_size; for( i=0;ib.cur_size;i+) if(!search(b.pi) temp.ptemp.cur_size=b.pi; temp.cur_size+; return temp; int_set cha(int_set for(int i=0;imax_size;i+)temp.pi=pi; temp.cur_size=cur_size; for(i=0;ib.cur_size;i+) I if(temp.search(b.pi)temp.dec(b.pi); return temp; /*/ ; 4.3 主函数设计 void main() int_set obj1(8); int_set obj2(6); cinobj1; /输入集合 cinobj1; obj1.add(7); /添加一个元素 coutobj1; obj1.add(8); /再添加一个元素 obj1.ifsearch(3); /判断元素是否在集合中 obj1.ifsearch(0); coutobj1.jiao(obj2); /求交集 /*若没拷贝构造函数,则指针被提 前释放了,输出大的随机数*/ coutobj1.bing(obj2); /求并集 coutobj1.cha(obj2); /差运算 5 DOS 界面程序运行结果及分析界面程序运行结果及分析 5.1 程序运行结果程序运行结果 - 6 - 5.2 运行结果分析 在程序运行过程中,前面的部分必须有拷贝构造函数,因为后续需要以对象为返回值,中 间的部分则需要注意在类内写友元的实现时不能直接使用类成员,最后的部分若没拷贝构造函 数,则指针被提前释放了,会输出大的随机数,则不符合题目要求。 6 基于基于 MFC 的图形界面程序开发的图形界面程序开发 MFC 的图形界面程序设计可在上述类设计的基础上进行改造,MFC 的图 形界面程序与 DOS 界面程序的主要不同点是:MFC 图形界面程序与 DOS 界面 程序的输入输出方式不同,DOS 界面程序采用字符交互式实现数据输入输出, 主要通过 cin,cout 等 I/O 流实现,而 MFC 的图形程序界面采用标准 Windows 窗口和控件实现输入输出,因此必须在 MFC 类的框架下加入上面所设计的矩阵 和方程组类,并通过图形界面的输入输出改造来完成。 6.1 基于 MFC 的图形界面程序设计 (1)界面设计)界面设计 首先在 VC 中建立 MFC AppWizard(exe)工程,名称为集合类集合类,并在向导的 Step1 中选择 Dialog based,即建立基于对话框的应用程 - 7 - 图 4 建立 MFC AppWizard(exe)工程 图 5 建立基于对话框的应用程序 将对话框资源中的默认对话框利用工具箱改造成如下界面,如图 6 所示。 - 8 - 图 6 方集合的并交差界面设计 图 6 所示的界面中包含了 3 个 Edit 控件,6 个 Button 控件,控件的基本信 息列表如下表 1 所示。 控件类别控件 ID控件 Caption说明 IDC_EDIT1集合 1 IDC_EDIT2集合 2Edit Box IDC_EDIT3所求集合 IDC_BUTTON1计算交集 IDC_BUTTON2计算并集 IDC_BUTTON3计算差集 A-B IDC_BUTTON4计算差集 B-A Botton IDC_BUTTON6验证集合关系 表 1 控件基本信息 (2)代码设计)代码设计 为了能够将对话框界面上的控件能够与代码联系起来,需要为 3 个 Edit Box 控件建立 Member Variables,按 Ctrl+w 键进入 MFC ClassWizard 界面,选 择 Member Variables 选项卡,可显示成员变量设置界面,如图 7 所示。 - 9 - 图 7 成员变量设置界面 通过该界面设置与 3 个 Edit Box 控件对应的成员变量,具体如表 2 所示。 表 2 控件基本信息 控件 ID成员变量类型成员变量名称 IDC_EDIT1Stringm_1 IDC_EDIT2Stringm_2 IDC_EDIT3Stringm_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(); - 10 - m_2 = _T(); m_3 = _T(); /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); void CJIHEDlg: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 运行代码 BOOL CJIHEDlg:OnInitDialog() CDialog:OnInitDialog(); - 11 - / Add About. menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE);/ Set big icon SetIcon(m_hIcon, FALSE);/ Set small icon / TODO: Add extra initialization here return TRUE; / return TRUE unless you set the focus to a control void CJIHEDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); / If you add a minimize button to your dialog, you will need the code below / to draw the icon. For MFC applications using the document/view model, / this is automatically done for you by the framework. void CJIHEDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else - 13 - CDialog:OnPaint(); / The system calls this to obtain the cursor to display while the user drags / the minimized window. HCURSOR CJIHEDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon; int CJIHEDlg:panduanCF() UpdateData(1); m_3.Empty(); CString m,n; for (int i=0;i=m_1.GetLength()/2;i+) AfxExtractSubString(m, (LPCTSTR)m_1, i, ); for (int j=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);return 1; for ( i=0;i=m_2.GetLength()/2;i+) AfxExtractSubString(m, (LPCTSTR)m_2, i, ); - 14 - for (int j=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);return 1; return 0; 5 求相应集合的运算代码 void CJIHEDlg:Onjiao() UpdateData(1); m_3.Empty(); if(panduanCF() return; CString tem,dem; if(m_1=0 m_3=0;return ; else if(m_1=0|m_2=0) m_3=空集; else for (int i=0;i=m_1.GetLength()/2;i+) for (int j=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) - 15 - m_3=tem; else m_3=m_3+ +tem; if(m_3=0) m_3=空集; UpdateData(0); void CJIHEDlg:Onbing() UpdateData(1); m_3.Empty(); UpdateData(0); if(m_1=0 return ; if(panduanCF() return; if(m_1=0 | m_2=0) m_3=m_1+m_2;UpdateData(0);return; m_3=m_1; CString tem; CString dem; for (int i=0;im_2.GetLength();i+) AfxExtractSubString(tem, (LPCTSTR)m_2, i, ); int flag=0;/没有一样的 for (int j=0;jm_1.GetLength();j+) - 16 - AfxExtractSubString(dem, (LPCTSTR)m_1, j, ); if(tem=dem) flag=1;break; if(flag=0) m_3=m_3+ +tem; UpdateData(0); void CJIHEDlg:Onbu() UpdateData(1); m_3.Empty(); UpdateData(0); if(m_1=0 return ; if(panduanCF() return; if(m_2=0) m_3=m_1;UpdateData(0);return; if(m_1=0) m_3=空集;UpdateData(0);return; CString tem; CString dem; for (int i=0;i=m_1.GetLength();i+) int pd=1; - 17 - for (int j=0;j=m_2.GetLength();j+) AfxExtractSubString(tem, (LPCTSTR)m_1, i, ); AfxExtractSubString(dem, (LPCTSTR)m_2, j, ); if(tem=dem) pd=0;break; if (pd=1) m_3=m_3+tem+ ; UpdateData(0); void CJIHEDlg:Oncha() UpdateData(1); m_3.Empty(); UpdateData(0); if(m_1=0 return ; if(panduanCF() return; if(m_1=0) m_3=m_2;UpdateData(0);return; if(m_2=0) m_3=空集;UpdateData(0);return; CString tem; CString dem; for (int i=0;i=m_2.GetLength();i+) int pd=1; for (int j=0;j=m_1.GetLength();j+) - 18 - AfxExtractSubString(tem, (LPCTSTR)m_2, i, ); AfxExtractSubString(dem, (LPCTSTR)m_1, j, ); if(tem=dem) pd=0;break; if (pd=1) m_3=m_3+tem+ ; UpdateData(0); void CJIHEDlg:Onduichencha() UpdateData(1); m_3.Empty(); UpdateData(0); if(m_1=0 return; if(panduanCF() return; if(m_1=0) m_3=m_2;UpdateData(0);return; if(m_2=0) m_3=m_1;UpdateData(0);return; CString tem; CString dem; for (int i=0;i=m_1.GetLength();i+) int pd=1; for (int j=0;j=m_2.GetLength();j+) AfxExtractSubString(tem, (LPCTSTR)m_1, i, ); AfxExtractSubString(dem, (LPCTSTR)m_2, j, ); if(tem=dem) pd=0;break; - 19 - if (pd=1) m_3=m_3+tem+ ; for (i=0;i=m_2.GetLength();i+) int pd=1; for (int j=0;j=m_1.GetLength();j+) AfxExtractSubString(tem, (LPCTSTR)m_2, i, ); AfxExtractSubString(dem, (LPCTSTR)m_1, j, ); if(tem=dem) pd=0;break; if (pd=1) m_3=m_3+tem+ ; UpdateData(0); void CJIHEDlg:Onbaohan() UpdateData(1); m_3.Empty(); if(m_1=0return; if(panduanCF() return; if(m_1=0) AfxMessageBox(A 为空集,B 包含 A);return; if(m_2=0) AfxMessageBox(B 为空集,A 包含 B);return; - 20 - if(m_1=m_2) AfxMessageBox(A B 相等);return; / CString m_4,tem,dem;/交 for (int i=0;i=m_1.GetLength()/2;i+) AfxExtractSubString(tem, (LPCTSTR)m_1, i, ); for (int j=0;j=m_2.GetLength()/2;j+) AfxExtractSubString(dem, (LPCTSTR)m_2, j, ); if(tem=dem) if(m_4=0) m_4=tem; else m_4=m_4+ +tem; break; if(m_4.GetLength()=0) AfxMessageBox(A B 互斥);return; if(m_4.GetLength()/2=m_1.GetLeng

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论