您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 离散数学上机实验报告
离散数学实验报告姓名:学号:专业:实验一、真值运算一、实验内容从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值,并输出。二、实验步骤编写程序,将P,Q以不同真值带入,观察程序运行结果,调式程序。三、实验代码#includestdio.hintmain(){intp,q;chart;while(t){printf(是否运算程序(y/n):\n);scanf(%c,&t);if('y'==t){printf(输入p,q的真值(0或1):);scanf(%d%d,&p,&q);if((p!=1)&&(p!=0)){printf(请重新输入p值);scanf(%d,&q);}if((q!=1)&&(q!=0)){printf(请重新输入q值);scanf(%d,&q);}if(q==0&&p==0){printf(﹁p=1\n);printf(﹁q=1\n);printf(p∧q=0\n);printf(p∨q=0\n);printf(p→q=1\n);printf(p-q=1\n);}elseif(p==0&&q==1){printf(﹁p=1\n);printf(﹁q=0\n);printf(p∧q=0\n);printf(p∨q=1\n);printf(p→q=1\n);printf(p-q=0\n);}elseif(p==1&&q==0){printf(﹁p=0\n);printf(﹁q=1\n);printf(p∧q=0\n);printf(p∨q=1\n);printf(p→q=0\n);printf(p-q=0\n);}elseif(p==1&&q==1){printf(﹁p=0\n);printf(﹁q=0\n);printf(p∧q=1\n);printf(p∨q=1\n);printf(p→q=1\n);printf(p-q=1\n);}continue;}if('n'==t)break;}return0;}四、实验体会求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。实验二、关系的复合一、实验内容从键盘输入两个关系,求它们的复合关系,并输出。二、实验步骤编写程序,从键盘输入几种不同的二元关系,如果是关系矩阵,则关系矩阵应能够相乘,然后观察它们的复合结果,调试程序。三、实验代码#includestdio.hintmain(){intk,m,n,i,j,sum=0,a[10][10],b[10][10],c[10][10];printf(输入X集合中元素个数:);scanf(%d,&k);printf(输入X中二元关系R的关系矩阵:\n);for(i=0;ik;i++)for(j=0;jk;j++){scanf(%d,&a[i][j]);}printf(输入X中二元关系S的关系矩阵:\n);for(m=0;mk;m++)for(n=0;nk;n++){scanf(%d,&b[m][n]);}printf(输出X中二元关系R的关系矩阵:\n);for(i=0;ik;i++){for(j=0;jk;j++){printf(%d,a[i][j]);if(j==k-1)printf(\n);}}printf(输出X中二元关系S的关系矩阵:\n);for(m=0;mk;m++)for(n=0;nk;n++){printf(%d,b[m][n]);if(n==k-1)printf(\n);}for(i=0;ik;i++)for(n=0;nk;n++){for(j=0,m=0;jk,mk;j++,m++){sum+=a[i][j]*b[m][n];if(sum1)sum=1;}c[i][n]=sum;sum=0;}printf(输出RοS的关系矩阵:\n);for(i=0;ik;i++)for(j=0;jk;j++){printf(%d,c[i][j]);if(j==k-1)printf(\n);}}四、实验体会在求关系的复合中,先求出其关系矩阵,关系矩阵的运算和普通矩阵的运算一样,但是值得注意的是,关系矩阵中只有0和1,所以当大于1时,应该返回1,其余不变。实验三、用沃尔算法求传递闭包一、实验内容从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。二、实验步骤熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,用另一种算法算出结果,与其比较,调试程序。三、实验代码#includestdio.hintmain(){intn,i,j,k,a[10][10];printf(输入一个X集合中的元素:);scanf(%d,&n);printf(输入一个关系矩阵:\n);for(i=0;in;i++)for(j=0;jn;j++)scanf(%d,&a[i][j]);for(j=0;jn;j++){for(i=0;in;i++){if(a[i][j]==1)for(k=0;kn;k++){a[i][k]=a[j][k]+a[i][k];if(a[i][k]1)a[i][k]=1;}}}printf(输出传递闭包:\n);for(i=0;in;i++)for(j=0;jn;j++){printf(%d,a[i][j]);if(j==n-1)printf(\n);}return0;}四、实验体会熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。实验四、三种闭包运算一、实验内容从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。二、实验步骤编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。三、实验代码#includestdio.hvoidoutput(ints[][100]);voidzifan(ints2[][100]);voidduichen(ints2[][100]);voidchuandi1(ints2[][100]);voidaa();ints[100][100],z;intd,n,i,j;intmain(){charch;aa();printf(是否开始新的运算?(Y/N)\n);do{ch=getchar();}while(ch!='N'&&ch!='Y');if(ch=='Y')aa();return0;}voidaa(){charc;printf(请输入矩阵的行数(必须小于10)\n);scanf(%d,&n);printf(请输入矩阵的列数(必须小于10)\n);scanf(%d,&d);printf(请输入关系矩阵\n);for(i=0;in;i++){printf(\n);printf(请输入矩阵的第%d行元素,i+1);for(j=0;jd;j++)scanf(%d,&s[i][j]);}do{printf(输入对应序号选择算法\n1:自反闭包\n2:传递闭包\n3:对称闭包\n);scanf(%d,&z);switch(z){case1:zifan(s);break;case2:chuandi1(s);break;case3:duichen(s);break;}printf(您选择继续吗(Y/N)?\n);do{c=getchar();}while(c!='N'&&c!='Y');}while(c=='Y');}voidoutput(ints[][100]){printf(所求关系矩阵为:\n);for(i=0;in;i++){for(j=0;jd;j++)printf(%3d,s[i][j]);printf(\n);}}voidzifan(ints2[][100]){for(i=0;in;i++)s2[i][i]=1;output(s2);}voidduichen(ints2[][100]){ints1[100][100];for(i=0;in;i++)for(j=0;jd;j++)s1[j][i]=s2[i][j];for(i=0;in;i++)for(j=0;jd;j++){s2[i][j]=s2[i][j]+s1[i][j];if(s2[i][j]1)s2[i][j]=1;}output(s2);}voidchuandi1(ints2[][100]){intm[100][100],a[100][100],k,h;intt[100][100];for(i=0;in;i++)for(j=0;jd;j++){a[i][j]=0;t[i][j]=s2[i][j];m[i][j]=s2[i][j];}for(h=0;hn;h++){for(i=0;in;i++)for(j=0;jd;j++)if(m[i][j]==1){for(k=0;kn;k++)if(s2[j][k]==1)a[i][k]=1;}for(i=0;in;i++)for(j=0;jd;j++){m[i][j]=a[i][j];t[i][j]+=a[i][j];a[i][j]=0;if(t[i][j]1)t[i][j]=1;}}output(t);}四、实验体会此程序要求的算法较多,所以应该用函数调用来实现每一个算法的功能,这样易于管理,自反闭包和传递闭包相对简单一些,在编写对称闭包时,并不运用沃尔算法,应注意返回的只有0和1。实验五、邻接矩阵判断可达矩阵一、实验内容从键盘输入一个邻接矩阵,用其判断出它的可达矩阵,并输出。二、实验步骤编写程序,从键盘输入一个邻接矩阵,求出它的可达矩阵,并输出,观察程序运行结果,调试程序。三、实验代码#includestdio.hvoidmain(){inta[100][100],b[100][100],c[100][100],d[100][100],i,j,k,t,p,q,n;printf(请输入邻接矩阵的阶数\n);scanf(%d,&n);printf(请输入此邻接矩阵\n);for(i=0;in;i++){for(j=0;jn;j++){scanf(%d,&a[i][j]);c[i][j]=a[i][j];d[i][j]=a[i][j];b[i][j]=0;}}for(t=0;tn;t++){for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++)b[i][j]+=c[i][k]*a[k][j];}}for(p=0;pn;p++){for(q=0;qn;q++){c[p][q]=b[p][q];b[p][q]=0;d[p][q]+=c[p][q];}}}printf(该关系矩阵的可达型矩阵为\n);for(i=0;in;i++){for(j=0;jn;j++){if(d[i][j]=1)d[i][j]=1;elsed[i][j]=0;printf(%4d,d[i][j]);}printf(\n);}}四、实验体会用邻接矩阵应先判断出两个节点有没有路,然后返回给可达矩阵,有路返回1,没有返回0,然后根据其关系输出可达矩阵。
本文标题:离散数学上机实验报告
链接地址:https://www.777doc.com/doc-4796261 .html