离散数学2集合论资料.docx
- 文档编号:11051503
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:12
- 大小:34.75KB
离散数学2集合论资料.docx
《离散数学2集合论资料.docx》由会员分享,可在线阅读,更多相关《离散数学2集合论资料.docx(12页珍藏版)》请在冰豆网上搜索。
离散数学2集合论资料
南京工程学院
实验报告
课程名称离散数学
实验项目名称集合论
实验学生班级K网络工程121
实验学生姓名王云峰
学 号240121525
实验时间11月8日
实验地点信息楼
实验成绩评定
指导教师签字 年 月 日
一、实验目的和要求
集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构、数据库理论、开关理论、自动机理论和可计算理论等领域都有广泛的应用。
集合的运算规则是集合论中的重要内容。
通过该组实验,目的是让学生更加深刻地理解集合的概念和性质,并掌握集合的运算规则等。
实验要是实现求任意两个集合的交集、并集、差集。
二、实验主要仪器和设备
计算机
三、实验方法与步骤(需求分析、算法设计思路、流程图等)
(1)求任意两个集合的交集、并集、差集。
(2)求任意一个集合的幂集。
(3)求任意一个集合的所有m元子集。
(4)求任意个元素的全排列。
集合的表示采用列举法,如A={a,b,c,d}。
(1)求任意两个集合的交集、并集、差集。
A∩B={x|x∈A∧x∈B}
A∪B={x|x∈A∨x∈B}
A-B={x|x∈A∧x∉B}
(2)求任意一个集合的幂集。
P(A)={Ai|i∈J},其中J={i|i是二进制数且
≤i≤
}。
(3)求任意一个集合的所有m元子集。
按照
(2)求出子集并判断是否符合要求。
(4)求任意个元素的全排列。
设S={1,2,3,…,n},(a1,a2,…,an)和(b1,b2,…,bn)是S的两个全排列,若存在i∈{1,2,…,n},使得对一切j=1,2,…,i有aj=bj且ai+1 记为(a1,a2,…,an)<(b1,b2,…,bn)。 若(a1,a2,…,an)<(b1,b2,…,bn),且不存在(c1,c2,…,cn)使得(a1,a2,…,an)<(c1,c2,…,cn)<(b1,b2,…,bn),则称(b1,b2,…,bn)为(a1,a2,…,an)的下一个排列。 求一个排列(a1,a2,…,an)的下一个排列的算法如下: (1)求满足关系式aj-1 (2)求满足关系式ai-1 (3)ai-1与aj互换得序列(b1,b2,…,bn) (4)将(b1,b2,…,bn)中部分bi,bi+1,…,bn的顺序逆转,得到(b1,b2,…,bi-1,bn,…,bi)便是所求得下一个排列。 四、实验原始纪录(源程序、数据结构等) #include #include #include #include voidSet_To_Array(char*Set,char*Array)//集合转化为一维字符数组 { inti,j; j=0; for(i=1;i<(int)strlen(Set)-1;i=i+2)Array[j++]=Set[i]; Array[j]='\0'; } voidArray_To_Set(char*Array,char*Set)//一维字符数组转化为集合 { inti,j; j=0; Set[j++]='{'; for(i=0;Array[i]! ='\0';i++){Set[j++]=Array[i];Set[j++]=',';} if(j>1){Set[j-1]='}';Set[j]='\0';} else{Set[j++]='}';Set[j]='\0';} } voidGet_ISet()//集合的交运算 { inti,j,k; char*A,*B,*C,*S1,*S2,*S; A=newchar;B=newchar;C=newchar; S1=newchar;S2=newchar;S=newchar; printf("请输入集合A="); scanf("%s",S1); Set_To_Array(S1,A); printf("请输入集合B="); scanf("%s",S2); Set_To_Array(S2,B); if(! strlen(A)||! strlen(B))printf("A∩B={}\n"); else { k=0; for(i=0;A[i]! ='\0';i++) for(j=0;B[j]! ='\0';j++) if(A[i]==B[j]){S[k++]=A[i];break;} S[k]='\0'; Array_To_Set(S,C); printf("A∩B=%s\n",C); } } voidGet_USet()//集合的并运算 { inti,j,k,flag; char*A,*B,*C,*S1,*S2,*S; A=newchar;B=newchar;C=newchar; S1=newchar;S2=newchar;S=newchar; printf("请输入集合A="); scanf("%s",S1); Set_To_Array(S1,A); printf("请输入集合B="); scanf("%s",S2); Set_To_Array(S2,B); S=A; k=strlen(S); for(i=0;B[i]! ='\0';i++) { flag=1; for(j=0;A[j]! ='\0';j++) if(A[j]==B[i]){flag=0;break;} if(flag)S[k++]=B[i]; } S[k]='\0'; Array_To_Set(S,C); printf("A∪B=%s\n",C); } voidGet_DSet()//集合的差运算 { inti,j,k,flag; char*A,*B,*C,*S1,*S2,*S; A=newchar;B=newchar;C=newchar; S1=newchar;S2=newchar;S=newchar; printf("请输入集合A="); scanf("%s",S1); Set_To_Array(S1,A); printf("请输入集合B="); scanf("%s",S2); Set_To_Array(S2,B); k=0; for(i=0;A[i]! ='\0';i++) { flag=1; for(j=0;B[j]! ='\0';j++) if(A[i]==B[j]){flag=0;break;} if(flag)S[k++]=A[i]; } S[k]='\0'; Array_To_Set(S,C); printf("A-B=%s\n",C); } voidGet_PSet()//求集合的幂集 { inti,j,k,n; char*A,*P,*S1,*S; A=newchar;P=newchar; S1=newchar;S=newchar; printf("请输入集合A="); scanf("%s",S1); Set_To_Array(S1,A); n=strlen(A); printf("P(A)={"); for(i=0;i<(int)pow(2,n);i++) { k=0; for(j=0;j if(i&(int)pow(2,j))S[k++]=A[j]; S[k]='\0'; Array_To_Set(S,P); if(strlen(S)==strlen(A))printf("%s",P); elseprintf("%s,",P); } printf("}\n"); } intf(intn,intm) { ints=1,i; for(i=n-m+1;i<=n;i++)s=s*i; returns; } voidGet_SubSet()//求集合指定元素个数的子集 { inti,j,m,k,ip,g; char*A,*S1,*S,*B; A=newchar; S1=newchar; S=newchar; B=newchar; printf("A=");scanf("%s",S1); printf("g=");scanf("%d",&g); Set_To_Array(S1,A); m=strlen(A); if(g<1||g>m){printf("输入的元数错误");return;} printf("集合A=%s的%d元子集如下: \n",S1,g); for(i=1;i<=f(m,g);i++) { k=0;ip=0; for(j=0;j if(i&(int)pow(2,j)){S[k++]=A[j];ip++;} S[k]='\0'; if(ip==g){Array_To_Set(S,B);printf("%s\n",B);} } } voidswap(int&a,int&b) { a=a+b; b=a-b; a=a-b; } voidswapc(char*A,inti,intj) { chartemp; temp=A[i]; A[i]=A[j]; A[j]=temp; } voidGet_SArrange() { inti,j,k,m,n,p,*C; char*A,*S; A=newchar; S=newchar; C=newint; printf("请输入集合A="); scanf("%s",S); Set_To_Array(S,A); n=strlen(A); for(k=1;k<=n;k++)C[k]=k; printf("全排列如下: \n"); printf("%s",A); p=1; for(k=1;k<=n;k++)p=p*C[k]; for(m=1;m { for(j=2;j<=n;j++)if(C[j-1]<=C[j])i=j; for(k=i;k<=n;k++)if(C[i-1] swap(C[i-1],C[j]); swapc(A,i-2,j-1); for(k=0;k<=n;k++) if(i+k { swap(C[i+k],C[n-k]); swapc(A,i+k-1,n-k-1); } printf("-->%s",A); } printf("\n"); } voidmain() { inti=1; while(i>0) { System(“cls”); printf("1、求两个集合的交集2、求两个集合的并集\n"); printf("3、求两个集合的差集4、求一个集合的幂集\n"); printf("5、求一个集合的m元子集6、求任意集合元素的全排列\n"); printf("0、退出\n"); printf("请选择要进行的操作: "); scanf("%d",&i); switch(i){ case1: Get_ISet();break; case2: Get_USet();;break; case3: Get_DSet();break; case4: Get_PSet();break; case5: Get_SubSet();break; case6: Get_SArrange();break; case0: exit(-2); default: printf("选择错误,请重新选择: \n\n"); } } } 5、实验结果及分析(计算过程与结果、数据曲线、图表等) 求任意两个集合的交集、并集、差集。 求任意一个集合的幂集。 求任意一个集合的所有m元子集。 求任意个元素的全排列。 集合的表示采用列举法,如A={a,b,c,d} 六、实验总结与思考 集合的表示采用列举法,如A={a,b,c,d}。 (1)求任意两个集合的交集、并集、差集。 A∩B={x|x∈A∧x∈B} A∪B={x|x∈A∨x∈B} A-B={x|x∈A∧x∉B} (2)求任意一个集合的幂集。 P(A)={Ai|i∈J},其中J={i|i是二进制数且 ≤i≤ }。 (3)求任意一个集合的所有m元子集。 按照 (2)求出子集并判断是否符合要求。 (4)求任意个元素的全排列。 设S={1,2,3,…,n},(a1,a2,…,an)和(b1,b2,…,bn)是S的两个全排列,若存在i∈{1,2,…,n},使得对一切j=1,2,…,i有aj=bj且ai+1 记为(a1,a2,…,an)<(b1,b2,…,bn)。 若(a1,a2,…,an)<(b1,b2,…,bn),且不存在(c1,c2,…,cn)使得(a1,a2,…,an)<(c1,c2,…,cn)<(b1,b2,…,bn),则称(b1,b2,…,bn)为(a1,a2,…,an)的下一个排列。 求一个排列(a1,a2,…,an)的下一个排列的算法如下: (1)求满足关系式aj-1 (2)求满足关系式ai-1 (3)ai-1与aj互换得序列(b1,b2,…,bn) (4)将(b1,b2,…,bn)中部分bi,bi+1,…,bn的顺序逆转,得到(b1,b2,…,bi-1,bn,…,bi)便是所求得下一个排列。 集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构、数据库理论、开关理论、自动机理论和可计算理论等领域都有广泛的应用。 集合的运算规则是集合论中的重要内容。 通过该组实验,目的是让学生更加深刻地理解集合的概念和性质,并掌握集合的运算规则等。 此实验课程,能有效地锻炼我们的逻辑思维能力,使我们更系统,逻辑思考能力得到锻炼,分析例子更为简单,所以,此次实验,使我了解集合论的各种基础,受益匪浅。 教师评语:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散数学 集合论 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)