面向对象课设范例通信工程.docx
《面向对象课设范例通信工程.docx》由会员分享,可在线阅读,更多相关《面向对象课设范例通信工程.docx(26页珍藏版)》请在冰点文库上搜索。
面向对象课设范例通信工程
成绩评定表
学生姓名
谢鑫华
班级学号
1303060229
专业
通信工程
课程设计题目
集合类的设计与设计
评
语
组长签字:
成绩
日期
20年月日
课程设计任务书
学院
信息科学与工程学院
专业
通信工程
学生姓名
谢鑫华
班级学号
1303060229
课程设计题目
集合类的设计与实现
实践教学要求与任务
本课程设计主要是集合的交、并和差运算的研究与实现,用有序单链表表示集合,实现集合的交、并和差运算。
研究表明,采用有序存储的运算简单、方便。
通过类与对象的设计,编制一个能演示执行集合的并、交和差运算的程序,要求如下:
(1)集合的元素限定为小写字母字符[‘a’,…,’z’]。
(2)演示程序以用户和计算机的对话方式执行。
(3)以有序链表表示集合。
(4)可进一步实现集合的元素判定和子集判定运算。
工作计划与进度安排
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
摘要
现实生活中许多数据的处理依赖于哈希表的应用,通过应用哈希表使复杂问题更加简单化。
通过实用类模板,使用开放地址法和除留余数法来实现对哈希表的建立、插入、删除等功能,采用VisualC++6.0的控制台工程和MFC工程分别实现了哈希表的应用。
关键词:
除留余数法;哈希表;开放地址法;MFC工程
目录
1需求分析1
2算法基本原理……………1
图2-1单链表流程图2
3类设计3
4详细设计3
4.1类的设计和实现3
4.2主函数设计9
5DOS界面程序运行结果及分析10
5.1程序运行结果10
5.2运行结果分析11
6基于MFC的图形界面程序开发12
6.1基于MFC的图形界面程序设计12
6.2程序测试15
6.3MFC程序编写总结19
7参考文献20
1需求分析
(1)本演示程序中,集合的元素限定为小写字母字符[‘a’..‘z’],集合
的大小n<27。
集合输入的形式为一个以“#”为结束标志的字符串,串中字
符顺序不限,且允许出现重复字符及非法字符,程序应能自动滤去。
输出的
运行结果字符串将不含重复字符及非法字符。
(2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示
“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应
的输入数据(滤去输入中的非法字符)和运算结果显示在其后。
(1)
(3)程序执行的命令包括:
1).构造集合1;2).构造集合2;3).求并集;4).求交集;5).求差集;6).结
束。
“构造集合1”和“构造集合2”时,需以字符串的形式键入集合元素。
(4)测试数据
1).head1=”merry”,head2=”Christmas”,head1∪head2=”acehimrsty”,
head1∩head2=”mr”,head1-head2=”ey”;
2).head1=”012abcde”,head2=”123cdefg”,head1∪head2=”abcdefg”,
head1∩head2=”cde”,head1-head2=”ab”。
2算法基本原理
本课题采用数据抽象的程序设计方法,将程序划分为四个层次结构:
元素节点,有序链表,有序集和主控模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。
建立集合类,在类的成员函数中,通过尾插法生成一个有N个结点的单链表。
单链表是集合存储的基础,单链表建立算法需要一个计数循环语句,为每个元素建立一个结点,插入头结点之后。
算法流程图如下2-1所示。
否
是
图2-1单链表流程图
集合运算系统,是将两单链表进行交、并和差的集合运算,其流程图如图2-2所示。
图2-2集合运算系统流程图
3类设计
从上面的算法分析可以看到,本设计面临的计算问题的关键是集合运算。
可以定义一个线性表类Linklist作为基类,从问题的需要来看,在线性表类应包括对两单链表的操作的成员函数。
在集合的求解过程中,在线性表类Linklist的成员函数initLinklist(LinkListHead)中需要初始化类Linklist的数据成员,再利用成员函数LinkListMerge(LinkListHead1,LinkListHead2),LinkListInsection(LinkListHead1,LinkListHead2),LinkListDeprive(LinkListHead1,LinkListHead2)分别求得两集合的并,交,差运算结果。
4基于控制台的应用程序
整个程序分为两个独立的文档,Linklist.cpp包含了单链表的定义和对两集合运算的成员函数;main.cpp文件包括程序的主函数,主函数中定义了一个类Linklist的对象,通过这个对象求解两集合的交,并,差运算结果。
4.1类的设计和实现
#include
usingnamespacestd;
typedefstructNode
{
chardata;
Node*next;
}Node,*LinkList;
#defineSIZEsizeof(Node)
#defineFALSE0
#defineTRUE1
classLinklist
{
public:
initLinklist(LinkListHead)
{
charch;
Node*p=Head;
Head->next=NULL;
Head->data='\0';
cin>>ch;
while(ch!
='#')
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=ch;
p->next=newNode;
p=p->next;
cin>>ch;
}
p->next=NULL;
}
intCheck(charch,LinkListHead)
{
Node*temp=Head->next;
intflag=TRUE;
while(temp!
=NULL)
{
if(temp->data==ch)
{
flag=FALSE;
returnflag;
}
temp=temp->next;
}
returnflag;
}//合并两个集合
LinkListMerge(LinkListHead1,LinkListHead2)
{
LinkListHead=(Node*)malloc(SIZE);
Head->data='\0';Head->next=NULL;
Node*p1=Head1->next;
Node*p2=Head2->next;
Node*p=Head;
while(p1!
=NULL&&p2!
=NULL)
{
if(p1->data==p2->data)
{
if((Check(p1->data,Head)==TRUE)&&(p1->data>=97&&p1->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p1->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
}
else
{
if((Check(p1->data,Head)==TRUE)&&(p1->data>=97&&p1->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p1->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
if((Check(p2->data,Head)==TRUE)&&(p2->data>=97&&p2->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p2->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
}
p1=p1->next;
p2=p2->next;
}
while(p1!
=NULL)
{
if((Check(p1->data,Head)==TRUE)&&(p1->data>=97&&p1->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p1->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
p1=p1->next;
}
while(p2!
=NULL)
{
if((Check(p2->data,Head)==TRUE)&&(p2->data>=97&&p2->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p2->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
p2=p2->next;
}
returnHead;
}//集合A中的元素,B中是否存在
intIsExist(chardata,LinkListHead)
{
Node*p=Head->next;
intflag=FALSE;
while(p!
=NULL)
{
if(p->data==data)
returnflag=TRUE;
p=p->next;
}
returnflag;
}
intIsExist2(chardata,LinkListHead)
{
Node*p=Head->next;
intflag=FALSE;
while(p!
=NULL)
{
if(p->data==data)
returnflag;
p=p->next;
}
returnflag=TRUE;
}//两个集合的差集
LinkListDeprive(LinkListHead1,LinkListHead2)
{
LinkListHead=(Node*)malloc(SIZE);
Node*p=Head;
Node*p1=Head1->next;
while(p1!
=NULL)
{
if((IsExist2(p1->data,Head2)==1)&&(p1->data>=97&&p1->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p1->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
p1=p1->next;
}
returnHead;
}//两个集合交集
LinkListInsection(LinkListHead1,LinkListHead2)
{
Node*p1=Head1->next;
LinkListHead=(Node*)malloc(SIZE);
Head->data='\0';
Head->next=NULL;
Node*p=Head;
while(p1!
=NULL)
{
if((IsExist(p1->data,Head2)==1)&&(p1->data>=97&&p1->data<=122))
{
Node*newNode=(Node*)malloc(SIZE);
newNode->data=p1->data;
p->next=newNode;
p=newNode;
p->next=NULL;
}
p1=p1->next;
}
returnHead;
}//打印集合元素
voidPrintLinkList(LinkListHead)
{
Node*p=Head->next;
while(p!
=NULL)
{
cout<data;
p=p->next;
}
cout<<"\n";
}
};
在程序的类声明部分,先由类的成员函数initLinklist(LinkListHead)生成单链表,然后由各成员函数对其进行集合的并,交,差运算。
4.2主函数设计
intmain()
{
charcmd;
LinklistList;
do
{
cout<<"***************************************************\n";
cout<<"*********************集合运算系统******************\n";cout<<"***************************************************\n";
cout<<"输入两个集合的元素,输完一个集合的元素,按#结束\n";
LinkListhead1=(Node*)malloc(SIZE);
LinkListhead2=(Node*)malloc(SIZE);
List.initLinklist(head1);
List.initLinklist(head2);
Node*Head1=List.Merge(head1,head2);
cout<<"两个集合并集为\n";
List.PrintLinkList(Head1);
Node*Head2=List.Insection(head1,head2);
cout<<"两个集合交集为\n";
List.PrintLinkList(Head2);
Node*Head3=List.Deprive(head1,head2);
cout<<"两个集合差集为\n";
List.PrintLinkList(Head3);
cout<<"按y/Y继续,否则结束\n";
cin>>cmd;
}
while(cmd=='y'||cmd=='Y');
return0;
}
在程序的主函数部分,先由类生成一个对象,再由此对象调用类的各成员函数,求出集合的并,交,差运算结果并输出。
5DOS界面程序运行结果及分析
5.1程序运行结果
测试数据一运行结果如图5-1所示。
图5-1程序运行结果
测试数据二运行结果如图5-2所示。
图5-2程序运行结果
5.2基于MFC的应用程序测试
整个程序中的集合存储采用的是动态内存分配方式。
由Linklist类生成一个对象用来存放集合,然后由此对象调用成员函数,对集合进行各种并,交,差运算。
并运算,是生成一个新的单链表,然后利用尾插法将两个集合的元素顺序插入到新表的表头之后。
若待插字符串为非小写字母,则跳过不插。
交运算,是生成一个新的单链表,然后利用尾插法将两个集合的相同元素顺序插入到新表的表头之后。
若待插字符串为非小写字母,则跳过不插。
差运算,是生成一个新的单链表,然后利用尾插法将集合一中不同于集合二的元素顺序插入到新表的表头之后。
若待插字符串为非小写字母,则跳过不插。
在主函数中对两集合进行测试,运算完成后,设置一个循环,若输入y/Y则继续运算,否则结束程序。
6基于MFC的图形界面程序开发
MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:
MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。
6.1基于MFC的图形界面程序设计
(1)界面设计
首先在VC中建立MFCAppWizard(exe)工程,名称为MFC,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图6-1所示。
图6-1建立MFCAppWizard(exe)工程
图6-2建立基于对话框的应用程序
将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6-3所示。
图6-3集合运算程序界面设计
图6-3所示的界面中包含了3个StaticText控件,4个Button控件,和1个EditBox控件,控件的基本信息列表如下表1所示。
表1控件基本信息
控件类别
控件ID
控件Caption
说明
StaticText
IDC_STATIC
输入
操作记录
功能
Botton
IDC_BUTTON_Def
确定
IDC_BUTTON_Jiao
交集
IDC_BUTTON_Bing
并集
IDC_BUTTON_Cha
差集
EditBox
IDC_EDIT_A00~IDC_EDIT_A100
集合的元素
(2)代码设计
为了能够将对话框界面上的控件能够与代码联系起来,需要为1个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图6-4所示。
图6-4成员变量设置界面
通过该界面设置与1个EditBox控件对应的成员变量,具体如表2所示。
表2控件基本信息
控件ID
成员变量类型
成员变量名称
IDC_EDIT_A00~IDC_EDIT_A100
char
m_A00~m_A100
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
①将Linklist.h文件和Linklist.cpp文件合并成一个文件,重新命名为Linklist.h,并将其加入MFC工程。
②修改Linklist.h文件。
③在对话框类的实现文件MFCDlg.cpp中加入#include,以实现在该文件中可使用Linklist类。
④在MFCDlg.cpp文件中加入全局变量的定义,以实现MFCDlg类和Linklist类之间的通信。
⑤编写读入元素按钮的消息处理函数,实现将集合的元素刷新到界面上。
⑥编写集合交,并,差及确定按钮的消息处理函数,
6.2程序测试
运行程序后,首先出现的界面如图6-5所示。
图6-5程序初始运行界面
输入集合一的元素后单击确定按钮后,可将集合一的元素在界面上显示出来,同理,可现示集合二的元素,如图6-6所示。
图6-6输入集合元素后的界面
单击交集求解按钮,实现操作并将操作结果显示出来,如图6-7所示。
图6-7实现交运算后的界面
同理可实现并集,差集运算,如图6-8所示。
图6-8实现并,差运算后的界面
6.3MFC程序编写总结
MFC程序与DOS界面程序编写的最大不同是程序员需要将编程精力放在图形界面设计、图形界面输入输出以及界面元素和代码对应转换等问题上,而这些问题在DOS界面程序中是不存在的,因此,初学MFC的编程者会对此感到困难,然而,当你编写出一个基于Windows界面的程序时,所获得的满足程度远远大于简单的DOS界面程序,况且基于Windows的图形界面的程序设计已成为主流,作为程序员而言,是非学会不可的。
本次课程设计作为编写Windows程序的初步尝试,能够实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。
(1)功能不完全,可增进集合的元素判定和子集判定运算
(2)将类的定义与实现放在同一个头文件Linklist.h中也违背了面向对象程序设计理念,需要将二者分开成定义文件和实现文件。
(3)图6-8所示的界面中没有退出程序按钮,显得程序不够规范。
7参考文献
[1]李爱华,程磊.面向对象程序设计(C++语言).北京:
清华大学出版社,2010
[2]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2011
[3]严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京:
清华大学出版社,2011
[4]徐士良.C常用算法程序集.北京:
清华大学出版社,1995
[5]钱能.C++程序设计教程(第二版).北京:
清华大学出版社,2007