2022年离散数学上机实验报告.docx
精选学习资料 - - - - - - - - - 离散数学试验报告:学号:班级:名师归纳总结 - - - - - - -第 1 页,共 14 页精选学习资料 - - - - - - - - - 试验一 连结词规律运算一. 试验目的实现二元合取、 析取、蕴涵和等价表达式的运算;实现规律这几种规律运算;熟识连接词规律运算规章,利用程序语言从键盘输入两个命题变元 P 和 Q的真值,求它们的合取、 析取、蕴涵和等价四种运算的真值;要求对输入内容进行分析,假如不符合 面;0、1 条件需要重新输入,程序有良好的输入输出界使用 Microsoft 为编程软件,采纳称C/C+语言为编程语言实现;四. 试验过程1. 算法分析 : 合取: p,q 都为 1 的时候为 1,其他为 0 析取: p,q 都为 0 的时候为 0,其他为 1 包蕴: p 为 1,q 为 0 时为 0,其他为 1 等价: p,q 同真同假 2. 程序代码 : #include<> int main int P,Q,a,b,c,d,p,q; printf" P 的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ printf"t%d",P; printf"n Q 的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ printf"t%d",Q; printf"n 非 P 的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ ifP=0/* 判定非 P 的值 */ 2 名师归纳总结 - - - - - - -第 2 页,共 14 页精选学习资料 - - - - - - - - - p=1; else p=0; printf"t%d",p; printf"n 非 Q的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ ifQ=1/* 判定非 Q的值 */ q=0; else q=1; printf"t%d",q; printf"n P 与 Q的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ ifQ=0|P=0/* 判定 P与 Q的值 */ a=0; else a=1; printf"t%d",a; printf"n P 或 Q的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ ifQ=1|P=1/* 判定 P或 Q的值 */ b=1; else b=0; printf"t%d",b; printf"nP 包蕴 Q的值 " forP=0;P<2;P+ 3 名师归纳总结 - - - - - - -第 3 页,共 14 页精选学习资料 - - - - - - - - - forQ=0;Q<2;Q+ ifP=1&&Q=0/* 判定 P包蕴 Q的值 */ c=0; else c=1; printf"t%d",c; printf"nP 等价 Q的值 " forP=0;P<2;P+ forQ=0;Q<2;Q+ ifP=Q/* 判定 P 等价 Q的值 */ d=1; else d=0; printf"t%d",d; printf"n" return 0; : 4 名师归纳总结 - - - - - - -第 4 页,共 14 页精选学习资料 - - - - - - - - - 试验二 关系的复合运算及逆运算一. 试验目的熟识关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法;利用矩阵求解有限集上的复合关系和逆关系;1. 算法分析 : 复合运算就将两个用矩阵表示的关系进行复合,即在第一个矩阵中查找值为 1 的元素坐标 i ,j ,在其次个矩阵第 j 行查找值为 1 的元素,假设有,且坐标为 j ,k ,就产生的新的关系的矩阵中坐标为 i ,k 的元素值为 1;逆运算就是将用矩阵中值为 1 的元素坐标 i ,j 对调,产生新的关系的矩阵中坐标为 j ,i 的元素值为 1;2. 程序代码 : / 关系的复合运算 #include<iostream> using namespace std; int main int a100100,b100100,c100100,i,j,k,n; cout<<" 请输入集合 X 中元素的个数 :" cin>>n; cout<<" 请输入关系矩阵 Mr 的格式 :"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cin>>aij; cout<<" 请输入关系矩阵 Ms的格式 :"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cin>>bij; fori=0;i<n;i+ / 进行复合运算 forj=0;j<n;j+ ifaij=1 fork=0;k<n;k+ ifbjk=1 cik=1; 5 名师归纳总结 - - - - - - -第 5 页,共 14 页精选学习资料 - - - - - - - - - fori=0;i<n;i+ forj=0;j<n;j+ ifcij.=1 cij=0; cout<<endl; cout<<" 关系矩阵 Mr 与 Ms的复合运算结果是 :"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cout<<cij<<" " cout<<endl; return 0; / 关系的逆运算 #include<> int main int a100100,b100100,n,i,j,index; printf"请输入集合X 中元素的个数 :" scanf"%d",&n; printf"请输入关系矩阵Mr 的格式 :n" fori=0;i<n;i+ forj=0;j<n;j+ scanf"%d",&aij; fori=0;i<n;i+/ 进行逆运算 forj=0;j<n;j+ ifaij=1 index=i; i=j; j=index; bij=1; fori=0;i<n;i+ 6 名师归纳总结 - - - - - - -第 6 页,共 14 页精选学习资料 - - - - - - - - - forj=0;j<n;j+ ifbij.=1 bij=0; printf"n 关系矩阵 M rc 为:n" fori=0;i<n;i+ forj=0;j<n;j+ printf"%d ",bij; printf"n" return 0; : 7 名师归纳总结 - - - - - - -第 7 页,共 14 页精选学习资料 - - - - - - - - - 试验三 关系的闭包运算一. 试验目的熟识关系的闭包运算,编程实现关系闭包运算算法;利用矩阵求解有限集上给定关系的自反、对称和传递闭包;1. 算法分析 : 在三种闭包中自反和对称闭包的求解很简单,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为 1 就可;对称闭包就加上关系的转置矩阵规律加法;传递闭包就直接依据 tR=R + ;2. 程序代码 : #include<iostream> using namespace std; void deliverint x100100,int y100100,int n; int main int i,j,n,R100100,r100100,s100100,t100100; cout<<" 请输入矩阵的阶 :" cin>>n; cout<<endl<<" 请输入 R的关系矩阵 :"<<endl; fori=0;i<n;i+ / 输入 R的关系矩阵 forj=0;j<n;j+ cin>>Rij; fori=0;i<n;i+ /将 R的关系矩阵赋值给r,s,t forj=0;j<n;j+ rij=Rij; sij=Rij; tij=Rij; fori=0;i<n;i+ / 自反闭包运算 ifrii=0 rii=1; cout<<endl<<" 自反闭包关系矩阵 rR:"<<endl; 8 名师归纳总结 - - - - - - -第 8 页,共 14 页精选学习资料 - - - - - - - - - fori=0;i<n;i+ / 输出 r 的关系矩阵 forj=0;j<n;j+ cout<<rij<<" " cout<<endl; fori=0;i<n;i+ / 对称闭包运算forj=0;j<i;j+ ifsij=1|sji=1 sij=1; sji=1; cout<<endl<<" 对称闭包关系矩阵 sR:"<<endl; fori=0;i<n;i+ / 输出 s 的关系矩阵 forj=0;j<n;j+ cout<<sij<<" " cout<<endl; delivert,R,n; / 关于传递闭包的函数 return 0; void deliverint x100100,int y100100,int n/ 数 int i,j,k,m,z100100; form=0;m<n;m+ fori=0;i<n;i+ forj=0;j<n;j+ ifxij=1 fork=0;k<n;k+ 关于传递闭包的函ifyjk=1 / 进行复合运算zik=1; 9 名师归纳总结 - - - - - - -第 9 页,共 14 页精选学习资料 - - - - - - - - - fori=0;i<n;i+ forj=0;j<n;j+ ifzij.=1 zij=0; fori=0;i<n;i+ forj=0;j<n;j+ xij=xij+zij; / 进行传递闭包运算 fori=0;i<n;i+ forj=0;j<n;j+ ifxij.=0 xij=1; cout<<endl<<" 传递闭包关系矩阵 tR:"<<endl; fori=0;i<n;i+ / 输出 x 的关系矩阵 forj=0;j<n;j+ cout<<xij<<" " cout<<endl; 10 名师归纳总结 - - - - - - -第 10 页,共 14 页精选学习资料 - - - - - - - - - : 11 名师归纳总结 - - - - - - -第 11 页,共 14 页精选学习资料 - - - - - - - - - 试验四 图的矩阵表示一. 试验目的熟识图的矩阵表示方法邻接矩阵、可达矩阵和关联矩阵;利用邻接矩阵得到的可达矩阵来求解图的连通性质;1. 算法分析 : 可达矩阵表示图中任意两个节点间的可达关系,而邻接矩阵表示图中任意两个节点的邻接关系;求解邻接矩阵 .1,.2,.3 .可知任意两个节点之间是否存在相互连通的路,从而 判定是否可达;2. 程序代码 : #include<iostream> using namespace std; void main int i,j,k,n,m,a100100,b100100,c100100,d100100; cout<<" 请输入矩阵阶数 :" cin>>n; cout<<" 请输入邻接矩阵 a:"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cin>>aij; bij=aij; fori=0;i<n;i+ / 矩阵 d 为零矩阵 forj=0;j<n;j+ dij=0; form=0;m<n;m+ fori=0;i<n;i+ / 矩阵 c 为零矩阵 forj=0;j<n;j+ cij=0; fork=0;k<n;k+ 12 名师归纳总结 - - - - - - -第 12 页,共 14 页精选学习资料 - - - - - - - - - fori=0;i<n;i+ forj=0;j<n;j+ cki=cki+bkj*aji; / 矩阵的乘法运算 fori=0;i<n;i+ forj=0;j<n;j+ bij=cij; dij=dij+bij; cout<<"m 为"<<m+1<<", 矩阵 b 为:"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cout<<bij<<" " cout<<endl; fori=0;i<n;i+ forj=0;j<n;j+ ifdij.=0 dij=1; cout<<" 可达矩阵 d 为 :"<<endl; fori=0;i<n;i+ forj=0;j<n;j+ cout<<dij<<" " cout<<endl; 13 名师归纳总结 - - - - - - -第 13 页,共 14 页精选学习资料 - - - - - - - - - : 14 名师归纳总结 - - - - - - -第 14 页,共 14 页