1、离散数学实验报告专业班级: 姓名: 学号: 实验成绩:1【实验题目】集合运算2【实验目的】编程实现集合的交、并、差和补运算。3【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。4. 【实验要求】通过以下界面提示实现相应的集合运算*请分别输入集合A与集合B的元素:请选择(15)要进行的集合运算:1. 集合的交运算(AB)2. 集合的并运算(AB)3. 集合的差运算(A-B)4. 集合的补运算(A=E-A)5. 继续/退出(y/n)*5. 【算法描述】(1)用数组A,B,C,E表示集合。假定A=1,3,4,5,6,7,9,10,B=2,,3,4,7,8,10,
2、 E=1,2,3,4,5,6,7,8,9,10,输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。以下每一个运算都要求先将集合C置成空集。(2)二个集合的交运算:AB=x|xA且xB把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。C语言算法:for(i=0;im;i+)for(j=0;jn;j+)if(ai= =bj) ck+=ai;(3)二个集合的并运算:AB=x|xA或xB把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到
3、数组C中,数组C便是集合A和集合B的并。C语言算法:for(i=0;im;i+)ci=ai;for(i=0;in;i+)for(j=0;jm;j+)if(bi= =cj) break;if(j= =m) cm+k=bi;k+;(4)二个集合的差运算:A-B=x|xA且xB将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。C语言算法:for (j=0;jm;j+)for (i=0;in;i+)if (Aj= =Bi)Ck=Aj;k+;break;if (j= =n) Ck=Ai; k+;(5)集合的补运算: A=E-A=x
4、xE且xA将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。求补集是一种特殊的集合差运算。C语言算法:k=0;for (i=0;iM;i+)for (j=0;jN;j+)if (Ei= =Aj)break; if (j= =N)Ck=Ei; k+;6. 【源程序(带注释)】#include #include #include using namespace std;void out() /打印星号的子函数 cout*n;int main() for(;) int a100,b100,c100,e100,jj100,bj100,cha
5、100,bu100;/定义数组ABCE,以及jj,bj,cha,bu保存四种运算的数组 int sizea,sizeb,sizec,sizee,sizejj,sizebj,sizecha,sizebu,i=0,j=0,t,x,p=0,k=0,ri=0,time=0,p1=0,p2=0;/定义数组长度,以及控制变量 char w30; /用于判断字符串是否相等时使用 char y30;/用于判断字符串是否相等时使用 char str100;/用于临时接收输入进的数组 char *v;/指针,用于拆散字符串使用 out(); coutt请选择(1-5)要进行的集合运算:endl t1.集合的交运算
6、AB)endl t2.集合的并运算(AB)endl t3.集合的差运算(A-B)endl t4.集合的补运算(A=E-A)endl t5.继续/退出(y/n)endl; out(); for(;) for(;) cout请输入(1-5)要进行的集合运算:; gets(w); if(strcmp(w,1)=0) x=1;break;/strcmp 用于判断字符串是否相等,相等时则把x赋对应的值,否则提示出错 else if(strcmp(w,2)=0) x=2;break; else if(strcmp(w,3)=0) x=3;break; else if(strcmp(w,4)=0) x=4
7、break; else if(strcmp(w,5)=0) x=5;break; else cout提示:输入有误!n;fflush(stdin); switch(x)/使用switch函数提示不同功能 case 1:out();cout您要进行集合的交运算endl;out();break; case 2:out();cout您要进行集合的并运算endl;out();break; case 3:out();cout您要进行集合的差运算endl;out();break; case 4:out();cout您要进行集合的补运算endl;out();break; case 5: cout继续/退出
8、y/n):; gets(y); if(strcmp(y,y)=0) continue; else if(strcmp(y,n)=0) exit(1); default:cout0 & x5) break; cout请输入集合A中的元素:n按回车结束输入(元素用逗号隔开)A=;for(;) gets(str); if(str0=0) sizea=0;p1=1;break;/若接收进来的字符串第一个字符ASC II码为0(null),跳出循环 for(;) t=1; for(i=0;istrlen(str);i+) if(stri!=,) if(stri9)/判断除逗号和数字以外是否还有其他字符
9、 printf(输入的只能为数字!请重新输入(元素用逗号隔开)A=); gets(str); t=0; break; if (t=1) break; v=strtok(str, ,);/以逗号拆分字符串 a0=atoi(v);/将拆分的第一份字符串利用atoi函数,把整型数字赋值给a0 i=1; while (v=strtok(NULL, ,)/继续拆分字符串,直到字符串结尾 ai=atoi(v);i+;/把拆分的字符串变为整型数组,赋值给ai sizea=i; for(j=0;jsizea-1;j+)/给A数组进行排序 for(i=0;iai+1) t=ai; ai=ai+1; ai+1=t
10、 t=1; for (i=0;isizea-1;i+) if(ai=ai+1) cout提示:数字重复!请重新输入A数组的元素endlA=; t=0; break; if(t=1) break; out(); coutA数组为: ; for(i=0;isizea;i+) coutai ; coutendl; out();cout请输入集合B中的元素:n按回车结束输入(元素用逗号隔开)B=;for(;) gets(str); if(str0=0) sizeb=0;p2=1;break;/若接收进来的字符串第一个字符ASC II码为0(null),跳出循环 for(;) t=1; for(i=0
11、istrlen(str);i+) if(stri!=,) if(stri9) printf(输入的只能为数字!请重新输入(元素用逗号隔开)B=); gets(str); t=0; break; if (t=1) break; v=strtok(str, ,); b0=atoi(v); i=1; while (v=strtok(NULL, ,) bi=atoi(v);i+; sizeb=i; for(j=0;jsizeb-1;j+) for(i=0;ibi+1) t=bi; bi=bi+1; bi+1=t; t=1; for (i=0;isizeb-1;i+) if(bi=bi+1) cout
12、提示:数字重复!请重新输入B数组的元素endlB=; t=0; break; if(t=1) break; out(); coutB数组为: ; for(i=0;isizeb;i+) coutbi ; coutendl; out();/给A,B做并集C for(i=0;isizea;i+) ci=ai; for(j=0;jsizeb;j+) for(i=0;isizea;i+)if(ci=bj)p=1; if(p!=1)csizea+k=bj;k+; p=0;sizec=sizea+k; for(j=0;jsizec-1;j+) for(i=0;ici+1) t=ci; ci=ci+1; ci
13、1=t; /并集C里的内容放进bj数组 for(i=0;isizec;i+) bji=ci; sizebj=sizec;/给A、B做交集,结果放进jjk=0;for(i=0;isizea;i+)for(j=0;jsizeb;j+)if(ai=bj)jjk=ai;k+;sizejj=k;/给A、B做差集 k=0;for(i=0;isizea;i+) for(j=0;jsizeb;j+) if(ai=bj)break;if(j=sizeb)chak=ai;k+; sizecha=k;cout请输入全集E中的元素:n按回车结束输入(元素用逗号隔开)E=; for(;) gets(str); if
14、p1=1 & p2=1)/若接收进来的字符串第一个字符ASC II码为0(null),判断A数组和B数组是否都为空 sizee=0; break; for(;) t=1; for(i=0;istrlen(str);i+) if(stri!=,) if(stri9) printf(输入的只能为数字!请重新输入(元素用逗号隔开)E=); gets(str); t=0; break; if (t=1) break; v=strtok(str, ,); e0=atoi(v); i=1; while (v=strtok(NULL, ,) ei=atoi(v);i+; sizee=i; for(j=0;
15、jsizee-1;j+) for(i=0;iei+1) t=ei; ei=ei+1; ei+1=t; t=1; for (i=0;isizee-1;i+) if(ei=ei+1) cout提示:数字重复!请重新输入E数组的元素endlE=; t=0; break; if(t=1) for(i=0;isizebj;i+) t=0; for(j=0;jsizee;j+) if(bji=ej) t=1; if(t=0) cout提示:全集E没有真包含集合A和集合B!n请重新输入E数组的元素endlE=; break; if(t=1) break; out(); cout全集E数组为: ; for(i
16、0;isizee;i+) coutei ; coutendl; /给A做补集 k=0; for (i=0;isizee;i+) for (j=0;jsizea;j+) if (ei=aj) break; if (j=sizea) buk=ei; k+; sizebu=k; if(x=1) /根据用户刚开始输入的想进行的运算,输出对应结果 out(); coutA、B集合的交运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; cout
17、AB= ; for(i=0;isizejj;i+) coutjji ; coutendl; time+; else if(x=2) out(); coutA、B集合的并运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; coutAB= ; for(i=0;isizebj;i+) coutbji ; coutendl; time+; else if(x=3) out(); coutA、B集合的差运算结果如下:endl; coutA= ;
18、 for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; coutA-B= ; for(i=0;isizecha;i+) coutchai ; coutendl; time+; else if(x=4) out(); coutA、E集合的补运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; cout全集E= ; for(i
19、0;isizee;i+) coutei ; coutendl; coutA=E-A ; for(i=0;isizebu;i+) coutbui ; cout0) if(time=0) break; out(); system(pause); coutt您还可以继续进行以下运算:endl /当计算已经进行了一次之后,可继续进行运算 t1.交运算(AB)endl t2.并运算(AB)endl t3.差运算(A-B)endl t4.补运算(A=E-A)endl t5.继续/退出(y/n)endlendl; for(;) cout请输入(1-5)要进行的集合运算n重新运算请选择5选项的“继续”:;
20、fflush(stdin); gets(w); if(strcmp(w,1)=0) x=1;break; else if(strcmp(w,2)=0) x=2;break; else if(strcmp(w,3)=0) x=3;break; else if(strcmp(w,4)=0) x=4;break; else if(strcmp(w,5)=0) x=5;break; else cout提示:输入有误!n; switch(x) case 1: out(); coutA、B集合的交运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coute
21、ndl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; coutAB= ; for(i=0;isizejj;i+) coutjji ; coutendl; time+; break; case 2: out(); coutA、B集合的并运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; coutAB= ; for(i=0;isizebj;i+) coutbji ; coutendl; t
22、ime+; break; case 3: out(); coutA、B集合的差运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; coutA-B= ; for(i=0;isizecha;i+) coutchai ; coutendl; time+; break; case 4: out(); coutA、E集合的补运算结果如下:endl; coutA= ; for(i=0;isizea;i+) coutai ; coutendl; coutB= ; for(i=0;isizeb;i+) coutbi ; coutendl; cout全集E= ; for(i=0;isizee;i+) coutei ; coutendl; coutA=E-A ; for(i=0;isizebu;i+) coutbui ; coutendl; time+; break; case 5: cout继续/退出(y/n