离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】集合运算2.【实验目的】编程实现集合的交、并、差和补运算。
3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
4. 【实验要求】通过以下界面提示实现相应的集合运算**************************************************************** 请分别输入集合A与集合B的元素:请选择(1—5)要进行的集合运算:1.集合的交运算(A⋂B)2.集合的并运算(A⋃B)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}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。
C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
C语言算法:for (j=0;j<m;j++){ for (i=0;i<n;i++){ if (A[j]= =B[i]){ C[k]=A[j];k++;break; }if (j= =n){ C[k]=A[i];k++; } }(5)集合的补运算:~A=E-A={x|x∈E且x∉A}将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
求补集是一种特殊的集合差运算。
C语言算法:k=0;for (i=0;i<M;i++){ for (j=0;j<N;j++){ if (E[i]= =A[j])break; }if (j= =N){ C[k]=E[i];k++; }6. 【源程序(带注释)】#include <iostream>#include <stdlib.h>#include <string.h>using namespace std;void out() //打印星号的子函数{cout<<"****************************************************************\n";}int main(){for(;;){int a[100],b[100],c[100],e[100],jj[100],bj[100],cha[100],bu[100];//定义数组ABCE,以及jj,bj,cha,bu保存四种运算的数组intsizea,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 w[30]; //用于判断字符串是否相等时使用char y[30];//用于判断字符串是否相等时使用char str[100];//用于临时接收输入进的数组char *v;//指针,用于拆散字符串使用out();cout<<"\t请选择(1-5)要进行的集合运算:"<<endl<<"\t1. 集合的交运算(A∩B)"<<endl<<"\t2. 集合的并运算(A∪B)"<<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;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<<"继续/退出(y/n):";gets(y);if(strcmp(y,"y")==0) continue;else if(strcmp(y,"n")==0) exit(1);}default:{cout<<"输入错误,请重新输入!\n";fflush(stdin);}}if(x>0 && x<5)break;}cout<<"请输入集合A中的元素:\n按回车结束输入(元素用逗号隔开)A=";for(;;){gets(str);if(str[0]==0) {sizea=0;p1=1;break;}//若接收进来的字符串第一个字符ASC II码为0(null),跳出循环for(;;){t=1;for(i=0;i<strlen(str);i++){if(str[i]!=',')if(str[i]<'0' || str[i]>'9')//判断除逗号和数字以外是否还有其他字符{printf("输入的只能为数字!请重新输入(元素用逗号隔开)A=");gets(str);t=0;break;}}if (t==1) break;}v=strtok(str, ",");//以逗号拆分字符串a[0]=atoi(v);//将拆分的第一份字符串利用atoi函数,把整型数字赋值给a[0]i=1;while (v=strtok(NULL, ","))//继续拆分字符串,直到字符串结尾{a[i]=atoi(v);i++;//把拆分的字符串变为整型数组,赋值给a[i]}sizea=i;for(j=0;j<sizea-1;j++)//给A数组进行排序{for(i=0;i<sizea-1-j;i++){if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}}}t=1;for (i=0;i<sizea-1;i++){if(a[i]==a[i+1]){cout<<"提示:数字重复!请重新输入A数组的元素"<<endl<<"A=";t=0;break;}}if(t==1) break;}out();cout<<"A数组为:{ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;out();cout<<"请输入集合B中的元素:\n按回车结束输入(元素用逗号隔开)B=";for(;;){gets(str);if(str[0]==0) {sizeb=0;p2=1;break;}////若接收进来的字符串第一个字符ASC II码为0(null),跳出循环for(;;){t=1;for(i=0;i<strlen(str);i++){if(str[i]!=',')if(str[i]<'0' || str[i]>'9'){printf("输入的只能为数字!请重新输入(元素用逗号隔开)B=");gets(str);t=0;break;}}if (t==1) break;}v=strtok(str, ",");b[0]=atoi(v);i=1;while (v=strtok(NULL, ",")){b[i]=atoi(v);i++;}sizeb=i;for(j=0;j<sizeb-1;j++){for(i=0;i<sizeb-1-j;i++){if(b[i]>b[i+1]){t=b[i];b[i]=b[i+1];b[i+1]=t;}}}t=1;for (i=0;i<sizeb-1;i++){if(b[i]==b[i+1]){cout<<"提示:数字重复!请重新输入B数组的元素"<<endl<<"B=";t=0;break;}}if(t==1) break;}out();cout<<"B数组为:{ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;out();//给A,B做并集Cfor(i=0;i<sizea;i++)c[i]=a[i];for(j=0;j<sizeb;j++){for(i=0;i<sizea;i++){if(c[i]==b[j])p=1;}if(p!=1){c[sizea+k]=b[j];k++;}p=0;}sizec=sizea+k;for(j=0;j<sizec-1;j++){for(i=0;i<sizec-1-j;i++){if(c[i]>c[i+1]){t=c[i];c[i]=c[i+1];c[i+1]=t;}}}//并集C里的内容放进bj数组for(i=0;i<sizec;i++)bj[i]=c[i];sizebj=sizec;//给A、B做交集,结果放进jj k=0;for(i=0;i<sizea;i++){for(j=0;j<sizeb;j++){if(a[i]==b[j]){jj[k]=a[i];k++;}}}sizejj=k;//给A、B做差集k=0;for(i=0;i<sizea;i++){for(j=0;j<sizeb;j++){if(a[i]==b[j])break;}if(j==sizeb){cha[k]=a[i];k++;}}sizecha=k;cout<<"请输入全集E中的元素:\n按回车结束输入(元素用逗号隔开)E=";for(;;){gets(str);if (p1==1 && p2==1)////若接收进来的字符串第一个字符ASC II码为0(null),判断A数组和B数组是否都为空{sizee=0; break; }for(;;){t=1;for(i=0;i<strlen(str);i++){if(str[i]!=',')if(str[i]<'0' || str[i]>'9'){printf("输入的只能为数字!请重新输入(元素用逗号隔开)E=");gets(str);t=0;break;}}if (t==1) break;}v=strtok(str, ",");e[0]=atoi(v);i=1;while (v=strtok(NULL, ",")){e[i]=atoi(v);i++;}sizee=i;for(j=0;j<sizee-1;j++){for(i=0;i<sizee-1-j;i++){if(e[i]>e[i+1]){t=e[i];e[i]=e[i+1];e[i+1]=t;}}}t=1;for (i=0;i<sizee-1;i++){if(e[i]==e[i+1]){cout<<"提示:数字重复!请重新输入E数组的元素"<<endl<<"E=";t=0;break;}}if(t==1)for(i=0;i<sizebj;i++){t=0;for(j=0;j<sizee;j++){if(bj[i]==e[j]) t=1;}if(t==0){cout<<"提示:全集E没有真包含集合A和集合B!\n请重新输入E数组的元素"<<endl<<"E=";break;}}if(t==1) break;}out();cout<<"全集E数组为:{ ";for(i=0;i<sizee;i++)cout<<e[i]<<" ";//给A做补集k=0;for (i=0;i<sizee;i++){for (j=0;j<sizea;j++){if (e[i]==a[j])break;}if (j==sizea){bu[k]=e[i];k++;}}sizebu=k;if(x==1) //根据用户刚开始输入的想进行的运算,输出对应结果{out();cout<<"A、B集合的交运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"A∩B={ ";for(i=0;i<sizejj;i++)cout<<jj[i]<<" ";cout<<"}"<<endl;time++;}else if(x==2){ out();cout<<"A、B集合的并运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<"}"<<endl;cout<<"A∪B={ ";for(i=0;i<sizebj;i++)cout<<bj[i]<<" ";cout<<"}"<<endl;time++;}else if(x==3){out();cout<<"A、B集合的差运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"A-B={ ";for(i=0;i<sizecha;i++)cout<<cha[i]<<" ";cout<<"}"<<endl;time++;}else if(x==4){out();cout<<"A、E集合的补运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"全集E={ ";for(i=0;i<sizee;i++)cout<<e[i]<<" ";cout<<"}"<<endl;cout<<"~A=E-A { ";for(i=0;i<sizebu;i++)cout<<bu[i]<<" ";cout<<"}"<<endl;time++;}while(time>0){if(time==0) break;out();system("pause");cout<<"\t您还可以继续进行以下运算:"<<endl //当计算已经进行了一次之后,可继续进行运算<<"\t1.交运算(A∩B)"<<endl<<"\t2.并运算(A∪B)"<<endl<<"\t3.差运算(A-B)"<<endl<<"\t4.补运算(~A=E-A)"<<endl<<"\t5.继续/退出(y/n)"<<endl<<endl;for(;;){cout<<"请输入(1-5)要进行的集合运算\n重新运算请选择5选项的“继续”:";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();cout<<"A、B集合的交运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"A∩B={ ";for(i=0;i<sizejj;i++)cout<<jj[i]<<" ";cout<<"}"<<endl;time++;break;}case 2:{out();cout<<"A、B集合的并运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"A∪B={ ";for(i=0;i<sizebj;i++)cout<<bj[i]<<" ";cout<<"}"<<endl;time++;break;}case 3:{out();cout<<"A、B集合的差运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"A-B={ ";for(i=0;i<sizecha;i++)cout<<cha[i]<<" ";cout<<"}"<<endl;time++;break;}case 4:{out();cout<<"A、E集合的补运算结果如下:"<<endl;cout<<"A={ ";for(i=0;i<sizea;i++)cout<<a[i]<<" ";cout<<"}"<<endl;cout<<"B={ ";for(i=0;i<sizeb;i++)cout<<b[i]<<" ";cout<<"}"<<endl;cout<<"全集E={ ";for(i=0;i<sizee;i++)cout<<e[i]<<" ";cout<<"}"<<endl;cout<<"~A=E-A { ";for(i=0;i<sizebu;i++)cout<<bu[i]<<" ";cout<<"}"<<endl;time++;break;}case 5:{cout<<"继续/退出(y/n):";gets(y);if(strcmp(y,"y")==0) {time=0;break;}else if(strcmp(y,"n")==0) exit(1);}default:{cout<<"输入错误,请重新输入!\n";fflush(stdin);} }}}}7.【实验结果与分析总结(含运行结果截图)】界面测试错误输入:分析总结:要善于利用strcmp函数来判断字符串之间是否相等,避免接受进不必要的字符造成程序错误。