集合的并交差操作课设说明书.docx
- 文档编号:5391170
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:18
- 大小:185.34KB
集合的并交差操作课设说明书.docx
《集合的并交差操作课设说明书.docx》由会员分享,可在线阅读,更多相关《集合的并交差操作课设说明书.docx(18页珍藏版)》请在冰豆网上搜索。
集合的并交差操作课设说明书
目录
摘要1
前言2
正文3
1.问题描述3
2.逻辑设计3
3.详细设计8
4.程序编码9
5.程序调试与测试11
6.结果分析15
7.软件安装和使用说明书16
设计总结17
参考文献18
致谢19
摘要
本程序通过算法实现集合的交、并、差操作。
集合采用链表表示,主要功能有:
求两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复。
关键词:
算法;集合;链表;交、并、差操作
前言
该设计要求学生设计程序,对集合中元素实现并、交、差等操作。
通过该题目的设计过程,可以进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
正文
1.问题描述
(1)集合采用链表表示,主要功能有:
求两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;
(2)利用随机函数产生随机整数作为测试数据,算法对于合法的输入数据都能产生满足规格说明要求的结果;
(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;
2.逻辑设计
链表算法实现:
实现代码:
classNode//节点
{
public:
doubledata;
Node*next;
Node()
{
this->next=NULL;
}
Node(doubledata,Node*next=NULL)
{
this->data=data;
this->next=next;
}
};
classSList//链表
{
public:
Node*head;
charname;
SList();
SList(charx)
{
name=x;
this->head=NULL;
cout< \n"; } ~SList(); boolisE()//判断空链表 { returnhead==NULL; } intlength(); Node*getNode(doublei); doubleget(doublei); friendostream&operator<<(ostream&out,SList&list); boolremove(inti,double&old); voidset(doublex); voidconcat(SList&list); voidclear(); voidcopy(SList&list); voidcom(); }; //构造函数 SList: : SList() { name=''; this->head=NULL; cout<<"创建成功! \n"; } //析构函数 SList: : ~SList() { clear(); } //返回第i个节点的指针 Node*SList: : getNode(doublei) { if((i-1)<0) returnNULL; intj=0; Node*p=head; while(p! =NULL&&j<(i-1)) { j++; p=p->next; } returnp; } //返回第i个元素 doubleSList: : get(doublei) { Node*p=getNode(i); returnp->data; } //删除第i个元素 boolSList: : remove(inti,double&old) { if(head! =NULL&&i>=0) if(i==1) { Node*q=head; old=q->data; head=head->next; deleteq; returntrue; } else { Node*p=getNode(i-1); if(p! =NULL&&p->next! =NULL) { Node*q=p->next; old=q->data; p->next=q->next; deleteq; returntrue; } } returnfalse; } //将LIST链接在当前单链表之后 voidSList: : concat(SList&list) { if(this->head==NULL) this->head=list.head; else { Node*p=head; while(p->next! =NULL) p=p->next; p->next=list.head; } list.head=NULL; } //输出单链表所有元素 ostream&operator<<(ostream&out,SList&list) { Node*p=list.head; out<<"{"; while(p! =NULL) { out< p=p->next; if(p! =NULL) out<<","; } out<<"}\n"; returnout; } //清空单链表 voidSList: : clear() { Node*p=head; while(p! =NULL) { Node*q=p; p=p->next; deleteq; } head=NULL; name=''; } //在末尾插入元素x voidSList: : set(doublex) { Node*q=NULL; if(head==NULL||length()<=0) { q=newNode(x,head); head=q; } else { intj=0; Node*p=head; while(p->next! =NULL&&j { j++; p=p->next; } q=newNode(x,p->next); p->next=q; } } //返回单链表长度 intSList: : length() { inti=0; Node*p=head; while(p! =NULL) { i++; p=p->next; } returni; } //复制单链表 voidSList: : copy(SList&list) { name=list.name; for(inti=1;i<=list.length();i++) this->set(list.get(i)); } voidSList: : com()//对链表排序 { doublet; for(inti=1;i<=length();i++) for(intj=i;j<=length();j++) { if(get(i)>=get(j)) { t=get(i); getNode(i)->data=get(j); getNode(j)->data=t; } } } 将实现代码写入头文件SList.h中。 3.详细设计 主程序设计: 4.程序编码 生成随机数: doublerandom(doublestart,doubleend)//生成start~end范围随机数 { returnstart+(end-start)*rand()/(RAND_MAX+1.0); } 手动生成集合元素: voidenter(SList&list)//手动输入集合元素 { cout<<"\n====请输入集合"< doublet; charn=','; for(inti=1;i<20;i++) { if(n=='.') i=20; else { cin>>t; cin>>n; list.set(t); } } } 随机生成集合元素: voidtest_enter(SList&list)//随机生成集合元素 { intn; cout<<"请输入集合"< "; cin>>n; for(inti=1;i<20;i++) { list.set(int(random(0,n)));//生成0~n范围的随机数 } } 对集合的并操作: lista.concat(listb); delsame(lista); (); 对集合的交操作: voidcomp(SList&a,SList&b)//比较2链表,得交集 { delsame(a); delsame(b); inttemp; doublen; for(inti=1;i<=a.length();i++) { temp=0; for(intj=1;j<=b.length();j++) { if(a.get(i)==b.get(j)) temp=1; } if(temp==0) { a.remove(i,n); i--; } } } 对集合的差操作: voidcoms(SList&a,SList&b)//比较2链表,得差集 { delsame(a); delsame(b); doublen; for(inti=1;i<=a.length();i++) { for(intj=1;j<=b.length();j++) { if(a.get(i)==b.get(j)) { a.remove(i,n); i--; } } } } 集合中元素的删除操作: voiddelsame(SList&list)//删除相同元素 { doubledel; for(inti=1;i<=list.length();i++) for(intj=i+1;j<=list.length();j++) { if(list.get(i)==list.get(j)) { list.remove(j,del); j--; } } } 5.程序调试与测试 测试程序: 进入界面: 初始化两个集合进行操作: 做并操作: 返回界面做交操作: 返回界面做差操作: 返回界面重新随机生成集合: 返回界面重新手动输入集合: 6.结果分析 对于节点类型中元素data定义为double,避免了用char类型只能输入0~9和各种符号;同时避免用int类型时,生成数大于128时储存空间不够而导致输出负数。 整个程序运用链表结构的基本实现方法去实现集合的交、并、差操作,使得程序简练。 不足之处: 当集合A、B中一个为另一个子集时,做差操作时会导致程序错误,无法调试找到原因。 7.软件安装和使用说明书 在进入界面时根据提示输入集合A与集合B生成元素的范围生成两个随机的集合 生成完成后根据提示选择需要的功能: 1、并操作,2、交操作,3、差操作,4、重新随机生成集合,5、重新手动生成集合,0、退出程序。 设计总结 通过为期两周的数据结构程序实训,扩展了自己的思路(作为一个程序员必须的素质)。 同时,在代码实现过程中,对照老师提供的参考文献,以及自己寻找的网络资源,进行的自我学习,也掌握了不少新知识。 在进一步开发此程序的过程中,从一开始拿到项目,参考实例,进行发散性思维想一些新的实现。 同时对新的想法做实际的开发测试(虽然其中有许多未实现)。 在开发测试过程中,对同一个问题的不同解答方式的实现,也是给自己在开发程序方面有一个很大的提高。 这次的课程设计使我获益良多,以后会珍惜类似的机会去锻炼自己。 参考文献 1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社. 2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社. 3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版). 4谭浩强.《c语言程序设计》.清华大学出版社. 5.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译 电子工业出版社2001年1月 致谢 通过这段时间的实训,使我获益良多。 在此,我非常感谢张其文老师在实训中对我提供的帮助。 对实训项目的指导,讲解使我学到了很多。 同时,我也感谢与我一同参加实训的同学们,你们一起维护了一个良好的学习氛围,使同学在一起实训时感觉颇为轻松。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 交差 操作 说明书