您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 集合的并交差集运算的设计
青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:刘文泽班级计算133学号:201207091题目:集合的并、交、差集运算的设计_____起迄日期:_2015.6.29~2015.7.10设计地点:计算机学院机房指导教师:巩玉玺、林孟达完成日期:2015年7月10日1目录一、需求分析1.选做此课题或项的目的2.程序所实现的功能3.问题解决方案二、内容设计1.根据所选题目,给出模块图2.编写程序关键代码三、调试分析1.实际完成的情况说明2.程序的性能分析。3.上机过程中出现的问题及其解决方案4.程序中可以改进的地方说明。四、用户手册五、设计总结六、参考文献七、附录2一、需求分析1.选做此课题或项的目的用c++实现集合的并、交、差集运算。2.程序所实现的功能(1)用户能够输入两个集合元素;(2)能够额按成集合的交、并、差运算;(3)集合的元素类型可以为整数、字符串和小数。(4)输入运算结果。(5)使用链表来表示集合,完成集合的合并,求交集等。3、问题解决方案根据系统功能需求,可以将问题解决分为以下步骤:(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及他们之间的关系;(3)根据问题描述,设计系统的类层次;(4)完成类层次中各个类的描述;(5)完成类中各个成员函数的定义;3二、内容设计1.根据所选题目,给出模块图通过对系统功能的分析,集合交并差系统功能如图所示:(一)集合的交集运算:分析:首先输出集合1与集合2的元素,然后输出集合1与集合2中相同的元素。流程图如图所示:(二)集合的并集运算:分析:首先输出集合1与集合2的元素,然后输出集合1与集合2中的全部元素。流程图如图所示:4(三)差集的运算首先输出集合1减去集合2的结果,然后输出集合2减去集合1中的结果。流程图如图所示:2.编写程序关键代码typedefstructnode{intdata;structnode*next;}lnode,*linklist;lnode*init_lnode();voidinput(linklistl);voidjiaoji(linklistA,linklistB,linklistC);voidheji(linklistA,linklistB,linklistC);voidchaji(linklistA,linklistB,linklistC);voidoutput(linklistl);voidmain(){lnode*A,*B,*C;A=init_lnode();B=init_lnode();C=init_lnode();printf(求AB集合的交集和并集\n);printf(请输入A集合的元素:);input(A);5printf(\n请输入B集合的元素:);input(B);printf(\n输入完成\n);printf(\n按任意键进入主菜单:);getch();intsel;do{charmenu[]={\n\n\n-----☆1.交集运算☆---------\n\n---------☆2和集运算☆---------\n\n---------☆3.差集运算☆---------\n\n---------☆0.退出☆---------\n\n};printf(%s,menu);printf(\n请在0-3中选择:);scanf(%d,&sel);switch(sel){case1:printf(AB集合的交集是:);jiaoji(A,B,C);output(C);C-next=NULL;break;case2:printf(AB的合集是:);heji(A,B,C);output(C);C-next=NULL;break;case3:chaji(A,B,C);break;case0:break;}}while(sel!=0);}/*主函数结束*//**********初始化函数***************/6lnode*init_lnode(){lnode*l;l=(lnode*)malloc(sizeof(lnode));l-next=NULL;returnl;}/***************录入函数********************/voidinput(linklistl){lnode*s;intx;scanf(%d,&x);while(x!=0){s=(lnode*)malloc(sizeof(lnode));s-data=x;s-next=l-next;l-next=s;scanf(%d,&x);}}/************交集函数*********************/voidjiaoji(linklistA,linklistB,linklistC){lnode*p,*q,*t;p=A-next;while(p!=NULL){q=B-next;while((q!=NULL)&&(q-data!=p-data))q=q-next;if((q!=NULL)&&(q-data==p-data)){t=(lnode*)malloc(sizeof(lnode));t-data=p-data;t-next=C-next;C-next=t;}p=p-next;}}/***********输出函数*****************/voidoutput(linklistl)7{lnode*s;s=l-next;while(s!=NULL){printf(%5d,s-data);s=s-next;}printf(\n);}/********并集函数*************************/voidheji(linklistA,linklistB,linklistC){lnode*p,*q,*t;p=A-next;while(p!=NULL){t=(lnode*)malloc(sizeof(lnode));t-data=p-data;t-next=C-next;C-next=t;p=p-next;}q=B-next;while(q!=NULL){p=A-next;while((p!=NULL)&&(p-data!=q-data))p=p-next;if(p==NULL){t=(lnode*)malloc(sizeof(lnode));t-data=q-data;t-next=C-next;C-next=t;}q=q-next;}}/*********************差集函数****************/voidchaji(linklistA,linklistB,linklistC){lnode*p,*q,*s,*t;8p=A-next;printf(A与B的差集是:\n);while(p!=NULL){q=B-next;while((q!=NULL)&&(p-data!=q-data))q=q-next;if(q==NULL){s=(lnode*)malloc(sizeof(lnode));s-data=p-data;s-next=C-next;C-next=s;}p=p-next;}output(C);C-next=NULL;q=B-next;printf(B与A的差集是:\n);while(q!=NULL){p=A-next;while((p!=NULL)&&(p-data!=q-data))p=p-next;if(p==NULL){t=(lnode*)malloc(sizeof(lnode));t-data=q-data;t-next=C-next;C-next=t;}q=q-next;}output(C);}9三、调试分析1.实际完成的情况说明(1)、有序表的抽象数据类型定义为:input(linklistl)初始条件:l是以l为头节点的空链表。操作结果:生成以l为头节点的非空链表。output(linklistl)初始条件:l是以l为头节点的非空链表。操作结果:将以l为头节点的链表中数据逐个输出。(2)、集合的抽象数据类型定义为:heji(linklistA,linklistB,linklistC)初始条件:链表A、B、C已存在操作结果:生成一个由A和B的并集构成的集合C。jiaoji(linklistA,linklistB,linklist,C)初始条件:链表A、B、C已存在操作结果:生成一个由A和B的交集构成的集合C。(3)、本程序抱含四个模块:1)节点结构单元模块——定义有序表的节点结构;2)有序表单元模块——实现有序表的抽象数据类型;3)集合单元模块——实现集合获得抽象数据类型;(4)主程序模块:Voidmain(){初始化;do{接受命令;处理命令;}while(“命令”!=“退出”);}2.程序的性能分析。101、本演示程序中,集合的元素限定为整形数据。集合输入的形式为一个以“0“为结束标志。2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。3、程序执行的命令包括:1)构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。“构造集合1”和“构造集合2”时,需以整形的形式键入集合元素。3.上机过程中出现的问题及其解决方案。出现的问题:1)中英文输入没有转换2)输入时由于粗心打错不少字母3)Node的应用问题不合理解决方案:长时间认真阅读程序;查看有关书籍以及请教同学4.程序中可以改进的地方说明。此程序只能实现集合的简单操作,运算量小,很多方面设计的不勾全面细致,集合的另外很多功能不能加以体现,除此之外,有些步骤重复化,但是又找不到简介明了的解决方法。11四、用户手册1、使用vc++6.02、按屏幕提示输入集合A的元素,输入完成后输入“0”,回车后输入集合B,并按“0”后,再按回车键,即出现运算选择页面,可根据自己的需求选择“1.交集运算”,“2.和集运算”,“3.差集运算”。3、按屏幕提示输入选择是否继续,如需继续则重复第二步,否则结束。4、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在其后。五、设计总结系统完成了执行计算集合的交集、并集以及差集的功能。系统虽然完整运行,但也有不足。系统的设计未能考虑到集合元素的唯一性,从键盘输入的集合元素在原样输出时,未能将重复元素剔除;再者,系统未能实现选择性操作,即输入集合1与集合2中的元素以后,按Enter便输出交集、并集与差集的全部结果。我的收获:通过课程设计,我学习到了许多内容。首先是对已学过的内容的尤其是上学期C++有了更深入的理解。其次,在程序编译过程中,我遇到了许许多多的问题,这些问题大多数都是小问题,主要是对问题思考的不够全面的结果。但是在自己的反复检查、实验,以及老师的帮助下,这些问题都一一解决了。而在解决问题的过程中,我能够了解到我设计中的不足之处。程序编辑过程中,我也认识到了自己的不足,对已学过的知识是有所理解,也能够合理地运用,但对细节方面有所忽略,这也正是刚开始时发现程序无法正常运行却不知错在哪的原因。因此这让我懂得了,在学习的过程中要认真仔细。最后,程序设计让我将以学过的知识综合运用,我感觉编译程序确实很有意思。因为它不仅是一门课程,也是一门语言,我们要学好这门语言,就要了解这门语言的“语法结构”,只有把话说清楚了,才能明白意思;也只有把“话”说正确了,程序才能执行。六、参考文献[1]李兰,任凤华.C++面向对象程序设计.西安:西安电子科技大学出版社,2010[2]李兰,任凤华.《C++面向对象程序设计》实验指导及习题解析.西安:西安电子科技大学出版社,20
本文标题:集合的并交差集运算的设计
链接地址:https://www.777doc.com/doc-2005803 .html