数据结构.docx

上传人:b****3 文档编号:12901232 上传时间:2023-04-22 格式:DOCX 页数:15 大小:188.58KB
下载 相关 举报
数据结构.docx_第1页
第1页 / 共15页
数据结构.docx_第2页
第2页 / 共15页
数据结构.docx_第3页
第3页 / 共15页
数据结构.docx_第4页
第4页 / 共15页
数据结构.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构.docx

《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构.docx

数据结构

 

 

数据结构课程设计

 

集合的交、并和差运算

 

班级学号

2123227

学生姓名

刘红廷

提交日期

2014年7月18日

成绩

 

 

计算机与通信工程学院

实验题目:

集合的交、并、差运算

一、需求分析

本程序主要实现对两个集合进行求交、并、差集的运算。

1.集合的元素限制在小写字母‘a’-‘z’之间。

集合的大小不限制,集合的输入形式为一个以“#”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。

2.演示程序以用户和计算机对话的形式进行,即计算机显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;,相应输入数据(滤出输入中的非法字符)和运算结果在其后显示。

3.程序的执行命令有

1)选择操作;2)程序结束

4.测试数据

1)Set1=“magazine”,set2=“paper”,

Set1∪set2=“aegimnprz”,set1∩set2=“ae”,set1-set2=“gimnz”;

2)Set1=“012oper4a6tion89”,set2=“errordata”,

Set1∪set2=“adeinoprt”,set1∩set2=“aeort”,set1-set2=“inp”;

二、详细设计

●首先对于用户输入的字符进行筛选和过滤,若用户输入的内容不合法,即包括不为字母的其他字符,可以根据字符输入后在计算机中的存储形式为ASCⅡ,完成操作。

●设有集合A、B,A与B的交集为A∩B。

A∩B指既属于集合A又属于集合B的元素。

因为要求另外申请存储空间,可另找一个新的集合C,C中存储A和B共同的元素。

问题即变为求:

C=A∩B。

算法思想为:

以A为标准,对B进行遍历,把B中和A相同的元素存储到C中。

具体过程如下:

1.扫描A,对A中每个元素执行2

2.在B中查找该元素

1)如果B中有,则保留到C中

2)否则,继续查找

3.显示C=A∩B

●求集合的并就是求A和B中所有的元素,先定义两个集合的并,设计思路如下:

1.把A中的元素全部放到一个集合C中

2.以A每一个元素为基准,对B进行循环

1)B中存在元素与该元素不同,则把该元素放到C中

2)B中存在元素与该元素相同,继续循环

3.显示C=A+B

●我们定义两个集合的差,设计思路如下:

1.假定A大于B,计算C=A-B

2.以A每一个元素为基准,对B进行循环

1)B中元素都与该元素不同,则把该元素放到C中

2)B中存在元素与该元素相同,继续循环

3.显示C=A-B

 

三、调试分析

1、本实习作业采用数据抽象的程序设计方法,将程序划分为三个层次:

结构体定义、操作函数、主控模块,使得设计思路清晰,实现时调试顺利,各模块具有较好的可重复性,确实得到了一次良好的程序设计训练。

2、在设计中为了实现对输入字符串的筛选功能,使用了布尔类型定义,判断真假。

3、通过查阅书籍,对顺序表,链表有了更清晰的认识

四、用户手册

根据界面的提示信息进行输入即可,当用户的输入出现非小写字母,如数字、特殊符号等,程序会根据运算的要求自动过滤与集合运算无关的字符,不用的担心出现错误的输入。

1.本程序的运行环境为DOS操作系统,可执行文件为:

未命名2.exe

2.为了界面更加友好特将背景颜色设计为黑色,字体为白色。

3.进入演示程序后的用户界面(见下,测试结果截图)。

五、测试结果

●Set1=“magazine”,set2=“paper”,

Set1∪set2=“aegimnprz”,set1∩set2=“ae”,set1-set2=“gimnz”;

●Set1=“012oper4a6tion89”,set2=“errordata”,

Set1∪set2=“adeinoprt”,set1∩set2=“aeort”,set1-set2=“inp”;

1.输入字符串中无重复元素,对两集合进行的运算结果如下:

2.当某一集合中出现重复的元素时,程序自动将重复的元素过滤后在进行运算

 

3.当用户输入的字符包括数字、特殊符号时,运算结果如下

 

4.当输入的两个集合为相同元素时,运算如下:

 

六、源代码

#include//C++输入输出流,预处理指令

#include//链表类

usingnamespacestd;//使用C++的命名空间std

#defineDataTpyechar//定义数据类型

boolIsElementInList(listaSet,DataTpyeiElement)

//使用布尔函数,判断iElement元素是否在aSet集合中

{list:

:

iteratoriter;

for(iter=aSet.begin();iter!

=aSet.end();iter++)

//遍历aSet单链表中的所有元素,直到找到与iElement元素相同的元素,返回true表明存在iElement元素

{if(*iter==iElement)

//在单链表中找到了与iElement元素相同的元素,此时开始执行if语句块

{returntrue;

}

}

returnfalse;

//由于不满足for中的条件表明iElement元素在aSet中不存在

}

voidTrim(list&aSet)

//去除集合aSet中的重复元素

{listnewSet;

//在这里新创建一个单链表newSet,后面对aSet中的相同元素删除其仅剩一个为止,并放入newSet

list:

:

iteratoriter;

for(iter=aSet.begin();iter!

=aSet.end();iter++)

{if(!

IsElementInList(newSet,*iter)&&(*iter>=97&&*iter<=122))

//(*iter>=97&&*iter<=122)这是极其关键的一部分,它的作用是删除链表中的数字

//在存储的时候数字是以字符的形式存储的,此时通过使用小写英文字母的ASCII码来限制插入单链表的元素

{newSet.push_back(*iter);

}

}

aSet=newSet;

//操作进行完成将newSet有重新赋给aSet

}

voidUnion(listset1,listset2)

//实现集合的并集运算,找出Set,Set_2中的所有元素

{listnewSet=set1;

list:

:

iteratoriter;

for(iter=set2.begin();iter!

=set2.end();iter++)

{if(IsElementInList(newSet,*iter))

{continue;

//在newSet中查找与iter相同的元素,如果if语句条件成立,表明IsElementInList()操作完成后返回了true

//不做处理,跳出循环继续向后查找在newSet中查找与iter相同的元素

}

else

{newSet.push_back(*iter);

//if不满足条件表明是在set2中存在的元素而在set1中没有,此时插入到newSet

}

}

Trim(newSet);

newSet.sort();//类中的方法,将单链表中的元素按照升序排列

cout<<"集合的并操作结果是:

"<

cout<<"{";

for(iter=newSet.begin();iter!

=newSet.end();iter++)

{cout<<*iter<<"";

}

cout<<"}"<

}

voidInter(listset1,listset2)

//实现集合的交集运算,找出Set,Set中的相同元素

{listnewSet;

list:

:

iteratoriter;

for(iter=set1.begin();iter!

=set1.end();iter++)

{if(IsElementInList(set2,*iter))

{//在newSet中查找与iter相同的元素,如果if语句条件成立,表明IsElementInList()操作完成后返回了true

//if条件成立找到了set2与set1相同的元素此时插入到newSet

newSet.push_back(*iter);

}

else

{continue;

}

}

Trim(newSet);

newSet.sort();

cout<<"集合的交操作结果是:

"<

cout<<"{";

for(iter=newSet.begin();iter!

=newSet.end();iter++)

{cout<<*iter<<"";

}

cout<<"}"<

}

voidDiffer(listset1,listset2)

//实现集合的差集运算,其本质是:

在Set中找出与Set相同的元素将其删除

{listnewSet;

list:

:

iteratoriter;

for(iter=set1.begin();iter!

=set1.end();iter++)

{if(IsElementInList(set2,*iter))

{//在set2中找出与iter相同的元素,不做插入操作

continue;

}

else

{newSet.push_back(*iter);

//将set1中与set2不相同的元素插入到newSet,其意义就是作set1-set2

}

}

Trim(newSet);

newSet.sort();

cout<<"集合的差操作结果是:

"<

cout<<"{";

for(iter=newSet.begin();iter!

=newSet.end();iter++)

{cout<<*iter<<"";

}

cout<<"}"<

}

intmain(void)

{cout<<"输入集合Set1的元素,按'#'结束"<

listset1,set2;

//定义两个单链表set1,set2用来实现测试数据元素的输入

list:

:

iteratoriter;

DataTpyeiIn=-1;//初始化输入的元素

while('#'!

=iIn)//用#来作为结束输入的结束标志

{cin>>iIn;

set1.push_back(iIn);

}

set1.pop_back();

Trim(set1);

set1.sort();

cout<<"输入的集合set1是:

"<

cout<<"{";

for(iter=set1.begin();iter!

=set1.end();iter++)

{cout<<*iter<<"";

}

cout<<"}"<

cout<<"输入集合set2的元素,按'#'结束"<

iIn=-1;//回置数据标志

while('#'!

=iIn)

{cin>>iIn;

set2.push_back(iIn);

}

set2.pop_back();

Trim(set2);

set2.sort();

cout<<"输入的集合set2是:

"<

cout<<"{";

for(iter=set2.begin();iter!

=set2.end();iter++)

{cout<<*iter<<"";

}

cout<<"}"<

here:

cout<<"选择操作:

1并集,2交集,3差集,0退出"<

cin>>iIn;

switch(iIn)

{case'1':

Union(set1,set2);break;

case'2':

Inter(set1,set2);break;

case'3':

Differ(set1,set2);break;

case'0':

return0;

default:

break;

}

gotohere;

}

七、参考文献

  

《数据结构》(C语言版)严蔚敏、吴伟民著清华大学出版社出版

《数据结构题集》(C语言版)严蔚敏、吴伟民著清华大学出版社出版

《C++程序设计》谭浩强著清华大学出版社出版

《数据结构习题集与实验指导书》

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

当前位置:首页 > 求职职场 > 职业规划

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

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