资源描述
封 皮
(按学校规定手工填写)
课 程 设 计 任 务 书
学院
专业
学生姓名
学号
设计题目
集合类设计与实现
内容及规定:
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问题描述:用有序单链表表达集合,实现集合交、并、差运算,且空间复杂度为O(1)
2基本功能:可迅速分别求出两个字符集合交、并、差。
3输入和输出:
(1)输入:在C++环境下编写程序,其输入是简朴、以便,即 按提示分别输入两集合元素。
l 输入字符范畴:小写字母a,b,...,y,z,大写字母A,B,...Y,Z,和数字0,1,...8,9;
l 输入形式:字符集合,按顺序大小排序输入,容许浮现重复字符,程序能自动滤去;
(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<iostream.h>
class int_set
{
private:
int max_size;
int cur_size;
char *p;
public:
int_set(const int_set & a)
{ //必要有拷贝构造函数,由于下面以对象为返回值
max_size=a.max_size;
cur_size=a.cur_size;
p=new char[a.max_size];
for(int i=0;i<cur_size;i++)
p[i]=a.p[i];
}
int_set(int x)
{
cur_size=0;
max_size=x;
p=new char[x];
}
~int_set(){delete []p;}
4.2 类实现
int search(char x){ // 判断一种元素与否在集合中
for(int i=0;i<max_size;i++)
if(p[i]==x){return 1;}
return 0;
}
void ifsearch(char x)
{
if(search(x))cout<<x<<"在集合中!"<<endl;
else cout<<x<<"不在集合中!"<<endl;
}
void add(char x)
{ // 增长一种整数到集合中
if(cur_size>=max_size)cout<<"集合已满,不可再添加元素!"<<endl;
else if(!search(x)){
p[cur_size]=x;
cur_size++;
}
}
void dec(char x){ // 从集合中去掉一种元素
for(int i=0;i<max_size;i++)
if(p[i]==x)
{
for(i;i<max_size-1;i++)p[i]=p[i+1];
cur_size--;}
}
//输入
friend istream & operator<<(istream & in,int_set & a)//注旨在类内写友元实现时不能直接使用类成员
{
cout<<"请输入集合("<<a.max_size<<"个小写字母(a~z)):";
for(int i=0;i<a.max_size;i++)cin>>a.p[i];//不能直接写p[i]
a.cur_size=a.max_size;
return in;//in可以换别
}
//输出
friend ostream & operator>>(ostream & out,int_set & a)
{
for(int i=0;i<a.cur_size;i++)cout<<a.p[i]<<' ';
cout<<endl;
return out;
}
int_set jiao(int_set & b )//交集
{int_set temp(max_size);
for(int i=0;i<b.cur_size;i++)
I if(search(b.p[i])){
temp.p[temp.cur_size]=b.p[i];
temp.cur_size++;}
return temp;
}
int_set bing(int_set & b )//并集
{
int_set temp(max_size+b.max_size);
for(int i=0;i<max_size;i++)temp.p[i]=p[i];
temp.cur_size=cur_size;
for( i=0;i<b.cur_size;i++)
if(!search(b.p[i])){
temp.p[temp.cur_size]=b.p[i];
temp.cur_size++;}
return temp;
}
int_set cha(int_set & b )//求差
{
int_set temp(max_size);
for(int i=0;i<max_size;i++)temp.p[i]=p[i];
temp.cur_size=cur_size;
for(i=0;i<b.cur_size;i++)
I if(temp.search(b.p[i]))temp.dec(b.p[i]);
return temp;
}
/**/
};
4.3 主函数设计
void main()
{
int_set obj1(8);
int_set obj2(6);
cin<<obj1; //输入集合
cin<<obj2;
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); //差运算
}
5 DOS界面程序运营成果及分析
5.1程序运营成果
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,即建立基于对话框应用程
图4 建立MFC AppWizard(exe)工程
图5 建立基于对话框应用程序
将对话框资源中默认对话框运用工具箱改导致如下界面,如图6所示。
图6 方集合并交差界面设计
图6所示界面中包括了3个Edit控件,6个Button控件,控件基本信息列表如下表1所示。
控件类别
控件ID
控件Caption
阐明
Edit Box
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个Edit Box控件建立Member Variables,按Ctrl+w键进入MFC ClassWizard界面,选取Member Variables选项卡,可显示成员变量设立界面,如图7所示。
图7 成员变量设立界面
通过该界面设立与3个Edit Box控件相应成员变量,详细如表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
// 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();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's 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 & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
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(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
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,' ');
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_2=="\0") {AfxMessageBox("交集为空,请输入元素");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)
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" && 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;
CString tem;
CString dem;
for (int i=0;i<m_2.GetLength();i++)
{
AfxExtractSubString(tem,(LPCTSTR)m_2,i,' ');
int flag=0;//没有同样
for (int j=0;j<m_1.GetLength();j++)
{
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" && m_2=="\0") {AfxMessageBox("差集为空,请输入元素");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;
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" && m_2=="\0") {AfxMessageBox("差集为空,请输入元素");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++)
{
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" && m_2=="\0") {AfxMessageBox("对称差为空,请输入元素");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;}
}
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=="\0"&&m_2=="\0") {AfxMessageBox("A B为空集");return;}
if(panduanCF()) return;
if(m_1=="\0") {AfxMessageBox("A为空集,B包括A");return;}
if(m_2=="\0") {AfxMessageBox("B为空集,A包括B");return;}
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.GetLength()/2) {AfxMessageBox("B包括A");return;}
if(m_4.GetLength()/2==m_2.GetLength()/2) {AfxMessageBox("A包括B");return;}
else {AfxMessageBox("A B相交");return;}
}
6.2 程序测试
运营程序后,一方面浮现界面如图8所示。
图8 程序初始运营界面
输入集合A,B,如图9所示
图9 读入数据后界面
单击交,并,差按钮显示出所求成果,如图10所示。
图10集合运算后界面
6.3 MFC程序编写总结
MFC程序与DOS界面程序编写最大不同是程序员需要将编程精力放在图形界面设计、图形界面输入输出以及界面元素和代码相应转换等问题上,而这些问题在DOS界面程序中是不存在,因而,初学MFC编程者会对此感到困难,然而,当你编写出一种基于Windows界面程序时,所获得满足限度远远不不大于简朴DOS界面程序,况且基于Windows图形界面程序设计已成为主流,作为程序员而言,是非学会不可。
本次课程设计作为编写Windows程序初步尝试,可以实现程序重要功能,可以说是获得了成功,然而好程序绝不但仅是只有功能性这一种指标,本此编写MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计规定来说,尚存在局限性,重要涉及如下几种方面。
(1)使用全局变量存储矩阵系数、方程组右端向量和解向量自身有悖面向对象程序设计理念,需要将其改进,运用局部变量和其他方式实现存储,作者以为最抱负方式是使用文献。
(2)将类定义与实现放在同一种头文献Linequ.h中也违背了面向对象程序设计理念,需要将两者分开成定义文献和实现文献。
(3)图10所示界面中对解显示没有格式化,导致界面看起来不够规范,需要对解输出进行小数点固定位数显示。
7 参照文献
[1]Bjarne Stroustrup.C++程序设计语言。特别版。裘宗燕译。北京:机械工业出版社
[2]郑莉,董渊,张瑞丰. C++语言程序设计(第3版). 北京:清华大学出版社,
[3]钱能. C++程序设计教程(第二版). 北京:清华大学出版社,
[4]陈志泊,王春玲. 面向对象程序设计语言—C++. 北京:人民邮电出版社,
[5]李庆扬,王能超,易大义. 数值分析. 湖北:华中理工大学出版社,1986
【6】张俊,张彦铎。C++面向对象程序设计。北京:中华人民共和国铁道出版社,
展开阅读全文