集合的运算 课程设计报告.docx

上传人:b****5 文档编号:8170814 上传时间:2023-01-29 格式:DOCX 页数:14 大小:213.62KB
下载 相关 举报
集合的运算 课程设计报告.docx_第1页
第1页 / 共14页
集合的运算 课程设计报告.docx_第2页
第2页 / 共14页
集合的运算 课程设计报告.docx_第3页
第3页 / 共14页
集合的运算 课程设计报告.docx_第4页
第4页 / 共14页
集合的运算 课程设计报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

集合的运算 课程设计报告.docx

《集合的运算 课程设计报告.docx》由会员分享,可在线阅读,更多相关《集合的运算 课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。

集合的运算 课程设计报告.docx

集合的运算课程设计报告

学号

2015-2016学年第二学期

1508020118

 

《高级语言程序设计》

课程设计报告

 

题目:

集合的运算

专业:

网络工程

班级:

15

(1)

姓名:

邱敏

指导教师:

代美丽

成绩:

计算机学院

2016年4月22日

目录

一、需求分析1

1、程序的实现1

(1)功能1

(2)实施1

2、设计的要求1

二、概要设计1

1、问题分析1

2、模块结构2

(1)结构分析2

(2)结构分析图2

三、详细设计3

1、解题思路3

(1)数据结构设计3

(2)逻辑结构存储结构3

2、算法设计3

四、调试分析和测试结果4

1、模块分析4

(1)定义单链表结点类型4

(2)运用尾插法建立单链表4

(3)建立有序链表5

2、结果分析5

五、总结6

1、解决的问题6

(1)集合的运算算法6

(2)解决方式7

2、心得体会7

六、参考文献(资料不得少于5篇)7

七、致谢7

八、附录(含程序源码)8

 

 

 

 

 

 

一、需求分析

1、程序的实现

(1)功能

使用链表来表示集合,完成集合的合并,求交集等操作。

(2)实施

1)初步完成总体设计,搭好框架,确定函数个数;

2)完成最低要求;

3)继续完成进一步要求。

2、设计的要求

(1)界面友好,函数功能要划分好;

(2)总体设计应画流程图;

(3)程序要加必要的注释;

(4)要提供程序测试方案;

(5)程序要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

二、概要设计

1、问题分析

该问题主要实现以下功能:

(1)利用尾插法建立单链表;

(2)对于输入的链表进行有序排列

(3)删除有序链表中不符合要求的元素

(4)调用函数对单链表进行交、并运算并输出

 

2、模块结构

(1)结构分析

程序以用户和计算机的对话方式执行,即在计算及终端显示提示信息之后,由用户在键盘输入演示程序中规定的运算命令;相应的输入数据(过滤输入中的非法字符)和运算结果闲时间在其后。

系统由以下几个模块组成,分别是:

1)单链表的建立

2)单链表的有序排列

3)删除单链表中不符合条件的元素

4)集合交集

5)集合并集

6)单链表输出

7)主函数

(2)结构分析图

 

三、详细设计

1、解题思路

(1)数据结构设计

创建三个带头结点的单链表,用来存储两个集合中的元素和最终的结果,为实现集合的交、并运算功能,应以有序链表表示集合。

为此,需要两个抽象数据类型:

有序表和集合。

(2)逻辑结构存储结构

逻辑结构:

创造一个带结点的单链表包括(头结点L、结点若干、尾结点);单链表中每个结点包括(*next表示指针data表示域)

2、算法设计

程序执行的命令包括:

(1)定义单链表结点类型typedefstructLNode

(2)运用尾插法建立单链表voidCreatListR(LinkList*&L,ElemTypea[],intn)

(3)创建头结点,为头结点分配空间

(4)创建新结点

(5)建立有序链表voidSort(LinkList*&head)

(6)将两个集合的元素进行比较while语句

(7)删除有序链表中的重复元素voidshanchu(LinkList*&head)

(8)求交集voidjiao(structLnode**L1,structLnode**L2,structLnode**L3)

(9)求并集voidbing(structLnode**L1,structLnode**L2,structLnode**L3)

(10)输出单链表voidDisplay(LinkList*L)

 

四、调试分析和测试结果

1、模块分析

(1)定义单链表结点类型

typedefstructLNode

{ElemTypedata;

structLNode*next;

}LinkList;

(2)运用尾插法建立单链表

voidCreatListR(LinkList*&L,ElemTypea[],intn)

{LinkList*s,*r;intI;

L=(LinkList*)malloc(sizeof(LinkList));//创建并为头结点分配空间

L->next=NULL;

r=L;

for(i=0;i

{s=(LinkList*)malloc(sizeof(LinkList));//创建新结点

s->data=a[i];

r->next=s;

r=s;

}

r->next=NULL;//尾结点指向空

(3)建立有序链表

voidSort(LinkList*&head)

{LinkList*p=head->next,*q,*r;if(p!

=NULL)

{r=p->next;

p->next=NULL;p=r;

while(p!

=NULL)//后续元素与第一个元素进行比较

{r=p->next;q=head;while(q->next!

=NULL&&q->next->datadata)q=q->next;p->next=q->next;q->next=p;p=r;}

}

}

2、结果分析

选择数字1,进行排序输出;

选择数字2,输出集合1与集合2的交集;

选择数字3,输出集合1与集合2的并集。

可以看出,该程序成功是实现了集合的排序和两个集合的交集运算,而两个集合的并集运算显然还存在问题,在以后的学习与操作中,我们要更加注重程序的运行,尽量做到零问题出现。

五、总结

1、解决的问题

(1)集合的运算算法

由于对集合的两种运算的算法推敲不足,在链表类型及其尾指针的设置时出现错误,导致程序低效。

刚开始时曾忽略了一些变量参数的标识”&”,使调试程序浪费时间不少。

今后应重视确定参数的变量和赋值属性的区分和标识。

(2)解决方式

开始时输入集合后,程序只能进行一次运算,后来加入switch语句,成功解决了这一难题。

本程序的模块划分比较合理,且尽可能的将指针的操作封装在节点和链表的两个模块中,致使集合模块的调试比较顺利。

 

2、心得体会

通过实践才发现程序设计的掌握直接关系到上机实验效果。

对各个知识点的熟练掌握是在课程中理解理论算法和完成上机实验的重要保证。

本课程设计采用数据抽象的程序设计方案,将程序化分为四个层次结构,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。

六、参考文献(资料不得少于5篇)

[1]催俊凯。

计算机软件基础。

机械工业出版社。

2007.7

[2]唐发根。

数据结构教程(第二版)。

北京航空航天大学出版社。

2005.5.

[3]严尉敏,吴伟民.数据结构(C语言版)[M].清华大学出版社,2011年11月

[4]谭浩强。

C程序设计(第三版)。

清华大学出版社。

2005.

[5]李建学,李光元,吴春芳。

数据结构课程设计案例精编(用C/C++描述)。

北京:

清华大学出版社。

2007.2

[6]王宏生,宋继红。

数据结构。

北京:

国防工业出版社,2006.1

七、致谢

感谢辅导我们的老师在这个学期细心耐心的指导我们的基础课学习,为我们的课程设计打下良好的基础。

在这次课程设计中,代老师给我很多的指导和帮助,让我能够使程序正常运行且实现实验的要求。

八、附录(含程序源码)

#include

#include

usingnamespacestd;

typedefcharElemType;

typedefstructLNode//定义单链表结点类型

{ElemTypedata;

structLNode*next;

}LinkList;

voidCreatListR(LinkList*&L,ElemTypea[],intn)//运用尾插法建立单链表

{LinkList*s,*r;inti;

L=(LinkList*)malloc(sizeof(LinkList));//创建头结点,为头结点分配空间

L->next=NULL;

r=L;//r先指向头结点后指向尾结点,开始时指针指向头结点

for(i=0;i

{s=(LinkList*)malloc(sizeof(LinkList));//创建新结点

s->data=a[i];

r->next=s;

r=s;

}

r->next=NULL;//尾结点指向空

}

voidSort(LinkList*&head)//建立有序链表

{LinkList*p=head->next,*q,*r;

if(p!

=NULL)

{r=p->next;

p->next=NULL;

p=r;

while(p!

=NULL)//后续元素与第一个元素进行比较

{r=p->next;

q=head;

while(q->next!

=NULL&&q->next->datadata)

q=q->next;

p->next=q->next;

q->next=p;

p=r;

}

}

}

voidshanchu(LinkList*&head)//删除有序链表中重复的元素及非小写字母的元素

{LinkList*p=head->next,*r=head,*q,*f;

while(p->next)

{if(p->data==p->next->data||((p->next->data>'z')||(p->next->data<'a')))

{q=p->next;

p->next=q->next;

free(q);

}

else

p=p->next;

}

if(r->next->data>'z'||r->next->data<'a')

{f=r->next;

r->next=f->next;

free(f);

}

}

voidbing(LinkList*ha,LinkList*hb,LinkList*hc)//求并集hc

{LinkList*pa,*pb,*pc;

pa=ha->next;

while(pa!

=NULL)

{pc=(LinkList*)malloc(sizeof(LinkList));

pc->data=pa->data;

pc->next=hc->next;

hc->next=pc;

pa=pa->next;

}

pb=hb->next;

while(pb!

=NULL)

{pa=ha->next;

while((pa!

=NULL)&&(pa->data!

=pb->data))

pa=pa->next;

if(pa==NULL)

{pc=(LinkList*)malloc(sizeof(LinkList));

pc->data=pb->data;

pc->next=hc->next;

hc->next=pc;

}

pb=pb->next;

}

}

voidjiao(LinkList*ha,LinkList*hb,LinkList*&hc)//求交集hc

{LinkList*pa=ha->next,*pb,*s,*tc;

hc=(LinkList*)malloc(sizeof(LinkList));//定义hc的头结点

tc=hc;

while(pa)

{pb=hb->next;

while(pb&&pb->datadata)

pb=pb->next;

if(pb&&pb->data==pa->data)

{s=(LinkList*)malloc(sizeof(LinkList));

s->data=pa->data;

tc->next=s;

tc=s;

}

pa=pa->next;

}

tc->next=NULL;

}

voidcha(LinkList*ha,LinkList*hb,LinkList*&hc)//求差集hc

{LinkList*pa=ha->next,*pb,*s,*tc;

hc=(LinkList*)malloc(sizeof(LinkList));//定义hc的头结点

tc=hc;

while(pa)

{pb=hb->next;

while(pb&&pb->datadata)

pb=pb->next;

if(!

(pb&&pb->data==pa->data))

{s=(LinkList*)malloc(sizeof(LinkList));

s->data=pa->data;

tc->next=s;

tc=s;

}

pa=pa->next;

}

tc->next=NULL;

}

voidDispList(LinkList*L)//输出单链表L

{LinkList*p=L->next;

while(p!

=NULL)

{cout<data;

p=p->next;

}

cout<

}

intmain()

{LinkList*ha,*hb,*hc;

ElemTypea[100],b[100];//建立两个数组存储集合

intla,lb,x;

cout<<"请输入集合1:

";

cin.getline(a,100);

cout<<"请输入集合2:

";

cin.getline(b,100);

la=strlen(a);

lb=strlen(b);

CreatListR(ha,a,la);

CreatListR(hb,b,lb);

Sort(ha);

Sort(hb);

shanchu(ha);

shanchu(hb);

cout<<"1.输出有序集合2.求集合交集3.求集合并集4.求集合并集"<

while(x!

=0)

{//循环对运算的选择

cout<<"请选择运算:

(选0退出)";

cin>>x;

switch(x)

{case1:

cout<<"有序1集合:

";

DispList(ha);

cout<<"有序2集合:

";

DispList(hb);//输出有序集合

break;

case2:

jiao(ha,hb,hc);

cout<<"交集合:

";DispList(hc);//调用求交集函数

break;

case3:

bing(ha,hb,hc);

cout<<"并集合:

";DispList(hc);//调求用并集函数

break;

case4:

cha(ha,hb,hc);

cout<<"差集合:

";DispList(hc);//调用求差集函数

break;

}

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1