数据结构C++课程设计题目: 集合的并、交和差运算一、设计题目集合的并、交和差运算二、小组成员分工说明一个人三、需求分析1)运行环境(软、硬件环境)软件环境:Microsoft Vista操作系统,Visual C++ 6.0硬件环境:2.0GB内存2)输入的形式和输入值的范围运行所给的测试数据,集合的元素限定为小写字符〔a. .z〕:第一组: Set1=magazine ,Set2=paper第二组: Set1=0120per4a6tion89,Set2=error data输出的形式描述程序运行并、交和差运算后得到数据,输出字符。
3)功能描述能演示执行集合的并、交和差运算。
4)测试数据(1) Set1=magazine ,Set2=paper,Set1∪Set2=aeginmprz,Set1∩Set2=ae,Set1-Set2=gimnz。
(2) Set1=0120per4a6tion89,Set2=error data,Set1∪Set2=adeinoprt,Set1∩Set2=aeort,Set1-Set2=inp。
四、概要设计1)抽象数据类型定义描述(顺序表的抽象数据类型描述)ADT Seqlist isData线性表的长度OperationSeqlist初始化值:无动作:置顺序表的长度为0Length输入:无前置条件:表已存在功能:求表的长度输出:返回表的长度,即表中数据元素的个数后置条件:表不变Get输入:元素的序号i前置条件:表已存在,i合法功能:在表中取序号为i的数据元素输出:若i合法,返回序号为i的元素值,否则抛出异常后置条件:表不变Locate输入:数据元素item前置条件:表已存在功能:在线性表中查找值等于item的元素输出:若查找成功,返回x在表中的序号,否则返回0 后置条件:表不变Insert输入:插入位置i;待插元素item前置条件:表已存在,i合法功能:在表的第i个位置处插入一个新元素x输出:若插入不成功,抛出异常后置条件:若插入成功,表中增加一个新元素Delete输入:删除位置i前置条件:表已存在功能:删除表中的第i个元素输出:若删除成功,返回被删元素,否则抛出异常后置条件:若删除成功,表中减少一个元素Empty输入:无前置条件:表已存在功能:判断表是否为空输出:若是空表,返回1,否则返回0后置条件:表不变Clear输入:无前置条件:无功能:清空顺序表输出:无后置条件:表的长度是0end ADT seqList2)功能模块设计(如主程序模块设计)集合的并、交和差运算集合的并运算集合的交运算集合的差运算3)模块层次调用关系图mainbin jiao cha五、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
1、顺序表存储结构的定义。
2、成员函数类的定义。
3、并、交和差三个操作函数的实现。
1)并运算:将B中的元素插到A后面后形成新的集合,定义字符i在a到z之间,并将新的集合中的个元素与i进行比较,若相同则将此时i的值插入C 中作为输出值,若不同则i++继续比较。
template <class T>SeqList<T> bin(SeqList<T> A,SeqList<T> B){SeqList<T> C;int m=1;int a=A.Length();for (int b=0;b<=B.Length();b++){A.Insert(a+b+1,B.Get(b));//将B的元素插到的A的后面成组合}for(char i='a';i<='z';i++)//定义字符i在a到z之间{for (int d=0;d<=A.Length();d++){if (A.Get(d)==i)//取组合后元素将元素与i进行比较{C.Insert(m,i);//相同的插入Cm++;//不相同继续break;}}}return C;}2)交运算:定义定义字符i在a到z之间,先将i与A中数据元素进行比较,再将i与B中元素进行比较,如果两次比较都有与i相同的元素,则将该i 值插入C中作为输出。
template <class T>SeqList<T> jiao(SeqList<T> A,SeqList<T> B){SeqList<T> C;int m=1;int flag=0;for(char i='a';i<='z';i++,flag=0)//定义字符i在a到z之间{for (int a=0;a<=A.Length();a++){if (A.Get(a)==i)//将i与A中元素进行比较{for (int b=0;b<=B.Length();b++){if (B.Get(b)==i)//将i与B中元素进行比较{C.Insert(m,i);//两次比较都有与i相同的元素,则将i 插入Cm++;flag=1;break;}}if (flag==1)break;}}}return C;}3)差运算:定义字符i在a到z之间,先将i与A中数据元素进行比较,如果相同,再将i与B中元素进行比较,,如果不同则将i插入C作为输出。
template <class T>SeqList<T> cha(SeqList<T> A,SeqList<T> B){SeqList<T> C;int m=1;int flag=0;for(char i='a';i<='z';i++,flag=0)//定义字符i在a到z之间{for (int a=0;a<=A.Length();a++){if (A.Get(a)==i)//将i与A中元素进行比较{for (int b=0;b<=B.Length();b++){if (B.Get(b)==i)//如果i与A中元素相同,则将i与a中元素进行比较{flag=m;}}if(flag==0){C.Insert(m,i);//如果不同则将i插入Cm++;break;}}}}return C;}4、main函数。
int main(){char a[50];char b[50];cout<<"Set1:";//输入set1数据cin.getline(b,'/0'); //所给数据中有空格,所以不能直接用cincout<<endl;cout<<"Set2:";//输入set2数据cin.getline(a,'/0');cout<<endl;SeqList<char> A(a,50),B(b,50),C,D,E;C=bin(A,B);//调用集合的并运算cout<<"Set1∪Set2=";C.display();cout<<endl;D=jiao(A,B);//调用集合的交运算cout<<"Set1∩Set2=";D.display();cout<<endl;E=cha(B,A);//调用集合的差运算cout<<"Set1-Set2=";E.display();cout<<endl;return 0;}六、调试分析包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。
七、用户使用说明详细列出每一步的操作说明。
1、输入Set1的数据2、输入Set2的数据3、分别输出Set1∪Set2=Set1∩Set2=Set1-Set2=八、测试结果九、附录:程序设计源代码#include <iostream>using namespace std;const int MaxSize=200; //MaxSize是顺序表中最大项数template <class T> //定义模板类SeqListclass SeqList{ public:SeqList( ); //无参构造函数SeqList(T a[], int n); //有参构造函数SeqList(const SeqList &A);//A中元素固定不变int Length(); //求线性表的长度T Get(int i); //按位查找,取线性表的第i个元素int Locate(T item);//查找元素itemvoid Insert(int i, T item); //在第i个位置插入元素item T Delete(int i); //删除线性表的第i个元素void display(); //遍历线性表,按序号依次输出各元素int empty(); //判断线性表是否为空表void clear(); //清空线性表private:T data[MaxSize]; //存放数据元素的数组int length; //线性表的长度};//存储结构定义template<class T>SeqList<T>::SeqList(){ length=0;}//无参构造函数实现,初始化表,置表的长度为0 template <class T>SeqList<T>::SeqList(T a[], int n){ if (n>MaxSize) throw "数组元素个数不合法";for (int i=0; i<n; i++)data[i]=a[i];length=n;}//有参构造函数实现template <class T>SeqList<T>::SeqList(const SeqList &A){ for (int i=0; i<A.length; i++)data[i]=A.data[i];length=A.length;}//A的元素长度不变template <class T>int SeqList<T>::Length(){ return length;}//求线性表的长度template <class T>T SeqList<T>::Get(int i){ return data[i];}//取序号为i的数据元素,返回序号为i的元素值template <class T>int SeqList<T>::Locate(T item){ for (int i=1;i<=length;i++)if (data[i]==item)return i+1 ; //下标为i的元素等于item,返回其序号i+1 return 0; //查找失败}//返回数据元素item在表中的位置template <class T>void SeqList<T>::Insert(int i, T item){ int j;if (length>=MaxSize) throw "溢出";if (i<1 || i>length+1) throw "i不合法!";for (j=length; j>=i; j--)data[j]=data[j-1];data[i-1]=item;length++;}//在线性表的第i个位置插入一个元素itemtemplate <class T>T SeqList<T>::Delete(int i){ int item,j;if (length==0) throw "表为空,无法删除元素!";if (i<1 || i>length) throw "i不合法!";item=data[i-1];for (j=i; j<length; j++)data[j-1]=data[j];length--;return item;}//删除线性表的第i个位置上的元素itemtemplate <class T>void SeqList<T>::display(){ for (int i=0;i<length;i++)cout<<data[i];}//遍历线性表,按序号依次输出各元素template <class T>int SeqList<T>::empty(){ if (length==0)return 1;return 0;}//判断线性表是否为空表template <class T>void SeqList<T>::clear(){ length=0;}//清空线性表template <class T>SeqList<T> bin(SeqList<T> A,SeqList<T> B){ SeqList<T> C;int m=1;int a=A.Length();for (int b=0;b<=B.Length();b++){A.Insert(a+b+1,B.Get(b));//将B的元素插到的A的后面成组合}for(char i='a';i<='z';i++)//定义字符i在a到z之间{for (int d=0;d<=A.Length();d++){if (A.Get(d)==i)//取组合后元素将元素与i进行比较{C.Insert(m,i);//相同的插入Cm++;//不相同继续break;}}}return C;}//并运算template <class T>SeqList<T> jiao(SeqList<T> A,SeqList<T> B){SeqList<T> C;int m=1;int flag=0;for(char i='a';i<='z';i++,flag=0)//定义字符i在a到z之间{for (int a=0;a<=A.Length();a++){if (A.Get(a)==i)//将i与A中元素进行比较{for (int b=0;b<=B.Length();b++){if (B.Get(b)==i)//将i与B中元素进行比较{C.Insert(m,i);//两次比较都有与i相同的元素,则将i插入Cm++;flag=1;break;}}if (flag==1)break;}}}return C;}//交运算template <class T>SeqList<T> cha(SeqList<T> A,SeqList<T> B){SeqList<T> C;int m=1;int flag=0;for(char i='a';i<='z';i++,flag=0)//定义字符i在a到z之间{for (int a=0;a<=A.Length();a++){if (A.Get(a)==i)//将i与A中元素进行比较{for (int b=0;b<=B.Length();b++){if (B.Get(b)==i)//如果i与A中元素相同,则将i与a中元素进行比较{flag=m;}}if(flag==0){C.Insert(m,i);//如果不同则将i插入Cm++;break;}}}}return C;}//减运算int main(){char a[50];char b[50];cout<<"Set1:";//输入set1数据cin.getline(b,'/0'); //所给数据中有空格,所以不能直接用cin cout<<endl;cout<<"Set2:";//输入set2数据cin.getline(a,'/0');cout<<endl;SeqList<char> A(a,50),B(b,50),C,D,E;C=bin(A,B);//调用集合的并运算cout<<"Set1∪Set2=";C.display();cout<<endl;D=jiao(A,B);//调用集合的交运算cout<<"Se t1∩Set2=";D.display();cout<<endl;E=cha(B,A);//调用集合的减法运算cout<<"Set1-Set2=";E.display();cout<<endl;return 0;}。