实验报告
题目:集合的并、交和差运算班级:班姓名:学号:
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 { list for (iter = aSet.begin( ); iter != aSet.end( ); iter++) { if (*iter == iElement) { return true; } } return false; } void Trim(list list list for (iter = aSet.begin( ); iter != aSet.end( ); iter++) { if (!IsElementInList(newSet, *iter)) { newSet.push_back(*iter); } } aSet = newSet; } void func1(list list list 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 list list 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 list list 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 list 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退出"< 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; }