当前位置:文档之家› 集合的并、交和差运算

集合的并、交和差运算

实验报告

题目:集合的并、交和差运算班级:班姓名:学号:

1.需求分析

设计一个程序,要求实现集合的并、交和差运算

(1)输入的形式为字符型或者整型,输入的范围:小写字母字符。

输出的形式:字符型或者整型。

(2)程序所能达到的功能:实现集合的并、交和差运算

(3)测试数据:正确:set1=”magazine”,set2=”paper”set1∪set2=”aegimnprz”,set1∩set2=”ae”,set1-set2=”gimnz”。错误:set1=”012oper4a6tion89”,set2=”error data”set∪set2=”adeinoprt”,set1∩set2=”aeort”,set1-set2=”inp”。

2.概要设计

为实现上述程序功能,应以有序链表表示集合。为此,需要两个抽象数据类型:有序表和集合

(1)有序表的抽象数据类型定义为:

ADT OrderedList{

数据对象:D={ ai丨ai∈CharSet,i=1,2,…,n>=o}

数据关系:R1={ < ai-1,ai>丨ai-1,ai∈D,ai-1

基本操作:

InitList(&L) // 结构初始化

LocateElem(L, e, compare()) // 查找

ListInsert(&L, i, e) // 插入元素

ListDelete(&L, i,&e) // 删除元素

等。

(2) 集合的抽象数据类型定义为:

ADT Set{

数据对象:D={ai丨ai为小写英文字母且互不相同,i=1,2,…,n,0<=n<=26}

数据关系:R1={}

基本操作:

CreatSet(&T,Str) //生成集合T

DestroySet(&T ) //销毁集合T的结构。

等。

各程序模块之间用for循环和while语句来实现调用。

3.调试分析:

调试过程中遇到的一些问题是通过网络查询,咨询老师等来解决。

通过这次实验,懂得了如何生成一个集合,并用有序链表的方式来实现。我觉得,让我们来做这些实验好像真的有点困难。

1.本程序的模块划分比较合理,且尽可能的将指针的操作封装在结

点和链表的两个模块中,致使集合模块的调试比较成功。

2.将数据存入数组再转入链表,可以忽略输入集合的长度,设计

更加巧妙,便于用户使用。

3.采用数据抽象的程序设计方法,将程序划分为两个次:元素结

点、有序链表,使得设计思路清晰,实现时调试顺利,各模块具有较好的可重复性,确实得到了一次良好的程序设计训练。

4.用户使用说明

本程序的运行环境为DOS操作系统,可执行文件为:集合的并交差运算.exe

5.测试结果

6.附录:

#include

#include

using namespace std;

#ifdef USE_INT

#define MYTYPE int

#else

#define MYTYPE char

#endif

bool IsElementInList(list aSet, MYTYPE iElement)//查看一个元素是否在集合中

{

list::iterator iter;

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

{

if (*iter == iElement)

{

return true; }

}

return false;

}

void Trim(list &aSet)//去除集合中的重复元素{

list newSet;

list::iterator iter;

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

{

if (!IsElementInList(newSet, *iter))

{

newSet.push_back(*iter);

}

}

aSet = newSet;

}

void func1(list set1, list set2)//并{

list newSet = set1;

list::iterator iter;

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

{

if (IsElementInList(newSet, *iter))

{

continue;}

else

{

newSet.push_back(*iter);

}

}

Trim(newSet);

newSet.sort( );

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

cout<<"{";

for (iter = newSet.begin( ); iter != newSet.end( ); iter++) { cout<<*iter<<" "; }

cout<<"}"<

}

void func2(list set1, list set2)//交{

list newSet;

list::iterator iter;

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

{

if (IsElementInList(set2, *iter)){

newSet.push_back(*iter);

}

else

{

continue;

}

}

Trim(newSet);

newSet.sort( );

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

cout<<"{";

for (iter = newSet.begin( ); iter != newSet.end( ); iter++) {

cout<<*iter<<" ";

}

cout<<"}"<

}

void func3(list set1, list set2)//差{

list newSet;

list::iterator iter;

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

{

if (IsElementInList(set2, *iter))

{

continue;

}

else

{

newSet.push_back(*iter);

}

}

Trim(newSet);

newSet.sort( );

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

cout<<"{";

for (iter = newSet.begin( ); iter != newSet.end( ); iter++) {

cout<<*iter<<" "; }

cout<<"}"<

int main(void)

{

cout<<"输入集合1的元素,按0结束"<

list set1, set2;

list::iterator iter;

MYTYPE iIn = -1;

#ifdef USE_INT

while (0 != iIn)

#else

while ('0' != iIn)

#endif

{

cin>>iIn;

set1.push_back(iIn);

}

set1.pop_back( );

Trim(set1);

set1.sort( );

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

cout<<"{";

for (iter = set1.begin( ); iter != set1.end( ); iter++) {

cout<<*iter<<" ";

}

cout<<"}"<

////////////////////////////////////////////////////////////////////////// cout<<"输入集合2的元素,按0结束"<

#ifdef USE_INT

while (0 != iIn)

#else

while ('0' != iIn)

#endif

{

cin>>iIn;

set2.push_back(iIn);

}

set2.pop_back( );

Trim(set2);

set2.sort( );

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

cout<<"{";

for (iter = set2.begin( ); iter != set2.end( ); iter++) {

cout<<*iter<<" ";

}

cout<<"}"<

////////////////////////////////////////////////////////////////////////// here:

cout<<"选择操作1并,2交,3差,0退出"<>iIn;

switch(iIn)

{

#ifdef USE_INT case 1:

func1(set1, set2);

break;

case 2:

func2(set1, set2);

break;

case 3:

func3(set1, set2);

break;

case 0:

return 0;

break;

#else

case '1':

func1(set1, set2);

break;

case '2':

func2(set1, set2);

break;

case '3':

func3(set1, set2);

break;

case '0':

return 0;

break;

#endif

default:

break;

}

goto here;

}

相关主题
文本预览
相关文档 最新文档