离散数学上机实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
for(t=0;t<n;t++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
b[i][j]+=c[i][k]*a[k][j];
}
}
for(p=0;p<n;p++)
{
for(q=0;q<n;q++)
{
c[p][q]=b[p][q];
b[p][q]=0;
三、实验代码
#include<stdio.h>
void output(int s[][100]);
void zifan(int s2[][100]);
void duichen(int s2[][100]);
void chuandi1(int s2[][100]);
void aa();
int s[100][100],z;
t[i][j]=1;
}
}
output(t);
}
四、实验体会
此程序要求的算法较多,所以应该用函数调用来实现每一个算法的功能,这样易于管理,自反闭包和传递闭包相对简单一些,在编写对称闭包时,并不运用沃尔算法,应注意返回的只有0和1。
实验五、邻接矩阵判断可达矩阵
一、实验内容
从键盘输入一个邻接矩阵,用其判断出它的可达矩阵,并输出。
}
}
四、实验体会
用邻接矩阵应先判断出两个节点有没有路,然后返回给可达矩阵,有路返回1,没有返回0,然后根据其关系输出可达矩阵。
离散数学实验报告
姓名:
学号:
专业:
实验一、真值运算
一、实验内容
从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值,并输出。
二、实验步骤
编写程序,将P,Q以不同真值带入,观察程序运行结果,调式程序。
三、实验代码
#include<stdio.h>
int main()
{
int p,q;
int d,n ,i,j;
int main()
{
char ch;
aa();
printf("是否开始新的运算?(Y/N)\n");
do
{
ch=getchar();
}while(ch!='N'&&ch!='Y');
if(ch=='Y')
aa();
return 0;
}
void aa()
{
char c;
printf("请输入矩阵的行数(必须小于10)\n ");
d[p][q]+=c[p][q];
}
}
}
printf("该关系矩阵的可达型矩阵为\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(d[i][j]>=1)
d[i][j]=1;
else
d[i][j]=0;
printf("%4d",d[i][j]);
}
printf("\n");
}
printf("您选择继续吗(Y/N)?\n");
do
{
c=getchar();
}while(c!='N'&&c!='Y');
} while(c=='Y');
}
void output(int s[][100])
{
printf("所求关系矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<d;j++)
if(sum>1)
sum=1;
}
c[i][n]=sum;
sum=0;
}
printf("输出RοS的关系矩阵:\n");
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
printf("%d ",c[i][j]);
if(j==k-1)
printf("\n");
}
}
四、实验体会
在求关系的复合中,先求出其关系矩阵,关系矩阵的运算和普通矩阵的运算一样,但是值得注意的是,关系矩阵中只有0和1,所以当大于1时,应该返回1,其余不变。
printf("%3d",s[i][j]);
printf("\n");
}
}
void zifan(int s2[][100])
{
for(i=0;i<n;i++)
s2[i][i]=1;
output(s2);
}
void duichen(int s2[][100])
{
int s1[100][100];
for(i=0;i<n;i++)
scanf("%d",&n);
printf("请输入矩阵的列数(必须小于10)\n ");
scanf("%d",&d);
printf("请输入关系矩阵\n");
for(i=0;i<n;i++)
{
printf("\n");
printf("请输入矩阵的第%d行元素",i+1);
for(j=0;j<d;j++)
for(k=0;k<n;k++)
{
a[i][k]=a[j][k]+a[i][k];
if(a[i][k]>1)
a[i][k]=1;
}
}Fra Baidu bibliotek
}
printf("输出传递闭包:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
if(j==n-1)
实验二、关系的复合
一、实验内容
从键盘输入两个关系,求它们的复合关系,并输出。
二、实验步骤
编写程序,从键盘输入几种不同的二元关系,如果是关系矩阵,则关系矩阵应能够相乘,然后观察它们的复合结果,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int k,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;i<k;i++)
for(j=0;j<k;j++)
{
scanf("%d",&a[i][j]);
}
printf("输入X中二元关系S的关系矩阵:\n");
for(m=0;m<k;m++)
char t;
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);
printf("p<->q=1\n");
}
else if(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");
}
二、实验步骤
编写程序,从键盘输入一个邻接矩阵,求出它的可达矩阵,并输出,观察程序运行结果,调试程序。
三、实验代码
#include<stdio.h>
void main()
{
int a[100][100],b[100][100],c[100][100],d[100][100],i,j,k,t,p,q,n;
for(n=0;n<k;n++)
{
scanf("%d",&b[m][n]);
}
printf("输出X中二元关系R的关系矩阵:\n");
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
printf("%d ",a[i][j]);
if(j==k-1)
printf("\n");
}
}
printf("输出X中二元关系S的关系矩阵:\n");
for(m=0;m<k;m++)
for(n=0;n<k;n++)
{
printf("%d ",b[m][n]);
if(n==k-1)
printf("\n");
}
for(i=0;i<k;i++)
for(n=0;n<k;n++)
{
for(j=0,m=0;j<k,m<k;j++,m++)
{
sum+=a[i][j]*b[m][n];
printf("请输入邻接矩阵的阶数\n");
scanf("%d",&n);
printf("请输入此邻接矩阵\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
c[i][j]=a[i][j];
d[i][j]=a[i][j];
b[i][j]=0;
for(j=0;j<d;j++)
s1[j][i]=s2[i][j];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
s2[i][j]=s2[i][j]+s1[i][j];
if(s2[i][j]>1)
s2[i][j]=1;
}
output(s2);
}
void chuandi1(int s2[][100])
for(j=0;j<d;j++)
if(m[i][j]==1)
{
for(k=0;k<n;k++)
if(s2[j][k]==1)
a[i][k]=1;
}
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
m[i][j]=a[i][j];
t[i][j]+=a[i][j];
a[i][j]=0;
if(t[i][j]>1)
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;
}
return 0;
}
四、实验体会
求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。
printf("\n");
}
return 0;
}
四、实验体会
熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
scanf("%d",&s[i][j]);
}
do
{
printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包\n3:对称闭包\n");
scanf("%d",&z);
switch(z)
{
case 1:zifan(s); break;
case 2:chuandi1(s);break;
case 3:duichen(s); break;
{
int m[100][100],a[100][100],k,h;
int t[100][100];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
a[i][j]=0;
t[i][j]=s2[i][j];
m[i][j]=s2[i][j];
}
for(h=0;h<n;h++)
{
for(i=0;i<n;i++)
printf("输入一个X集合中的元素:");
scanf("%d",&n);
printf("输入一个关系矩阵:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
if(a[i][j]==1)
实验三、用沃尔算法求传递闭包
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
}
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");
else if(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");
}
else if(p==1&&q==1)
{
printf("﹁p=0\n");
}
for(t=0;t<n;t++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
b[i][j]+=c[i][k]*a[k][j];
}
}
for(p=0;p<n;p++)
{
for(q=0;q<n;q++)
{
c[p][q]=b[p][q];
b[p][q]=0;
三、实验代码
#include<stdio.h>
void output(int s[][100]);
void zifan(int s2[][100]);
void duichen(int s2[][100]);
void chuandi1(int s2[][100]);
void aa();
int s[100][100],z;
t[i][j]=1;
}
}
output(t);
}
四、实验体会
此程序要求的算法较多,所以应该用函数调用来实现每一个算法的功能,这样易于管理,自反闭包和传递闭包相对简单一些,在编写对称闭包时,并不运用沃尔算法,应注意返回的只有0和1。
实验五、邻接矩阵判断可达矩阵
一、实验内容
从键盘输入一个邻接矩阵,用其判断出它的可达矩阵,并输出。
}
}
四、实验体会
用邻接矩阵应先判断出两个节点有没有路,然后返回给可达矩阵,有路返回1,没有返回0,然后根据其关系输出可达矩阵。
离散数学实验报告
姓名:
学号:
专业:
实验一、真值运算
一、实验内容
从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值,并输出。
二、实验步骤
编写程序,将P,Q以不同真值带入,观察程序运行结果,调式程序。
三、实验代码
#include<stdio.h>
int main()
{
int p,q;
int d,n ,i,j;
int main()
{
char ch;
aa();
printf("是否开始新的运算?(Y/N)\n");
do
{
ch=getchar();
}while(ch!='N'&&ch!='Y');
if(ch=='Y')
aa();
return 0;
}
void aa()
{
char c;
printf("请输入矩阵的行数(必须小于10)\n ");
d[p][q]+=c[p][q];
}
}
}
printf("该关系矩阵的可达型矩阵为\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(d[i][j]>=1)
d[i][j]=1;
else
d[i][j]=0;
printf("%4d",d[i][j]);
}
printf("\n");
}
printf("您选择继续吗(Y/N)?\n");
do
{
c=getchar();
}while(c!='N'&&c!='Y');
} while(c=='Y');
}
void output(int s[][100])
{
printf("所求关系矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<d;j++)
if(sum>1)
sum=1;
}
c[i][n]=sum;
sum=0;
}
printf("输出RοS的关系矩阵:\n");
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
printf("%d ",c[i][j]);
if(j==k-1)
printf("\n");
}
}
四、实验体会
在求关系的复合中,先求出其关系矩阵,关系矩阵的运算和普通矩阵的运算一样,但是值得注意的是,关系矩阵中只有0和1,所以当大于1时,应该返回1,其余不变。
printf("%3d",s[i][j]);
printf("\n");
}
}
void zifan(int s2[][100])
{
for(i=0;i<n;i++)
s2[i][i]=1;
output(s2);
}
void duichen(int s2[][100])
{
int s1[100][100];
for(i=0;i<n;i++)
scanf("%d",&n);
printf("请输入矩阵的列数(必须小于10)\n ");
scanf("%d",&d);
printf("请输入关系矩阵\n");
for(i=0;i<n;i++)
{
printf("\n");
printf("请输入矩阵的第%d行元素",i+1);
for(j=0;j<d;j++)
for(k=0;k<n;k++)
{
a[i][k]=a[j][k]+a[i][k];
if(a[i][k]>1)
a[i][k]=1;
}
}Fra Baidu bibliotek
}
printf("输出传递闭包:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
if(j==n-1)
实验二、关系的复合
一、实验内容
从键盘输入两个关系,求它们的复合关系,并输出。
二、实验步骤
编写程序,从键盘输入几种不同的二元关系,如果是关系矩阵,则关系矩阵应能够相乘,然后观察它们的复合结果,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int k,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;i<k;i++)
for(j=0;j<k;j++)
{
scanf("%d",&a[i][j]);
}
printf("输入X中二元关系S的关系矩阵:\n");
for(m=0;m<k;m++)
char t;
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);
printf("p<->q=1\n");
}
else if(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");
}
二、实验步骤
编写程序,从键盘输入一个邻接矩阵,求出它的可达矩阵,并输出,观察程序运行结果,调试程序。
三、实验代码
#include<stdio.h>
void main()
{
int a[100][100],b[100][100],c[100][100],d[100][100],i,j,k,t,p,q,n;
for(n=0;n<k;n++)
{
scanf("%d",&b[m][n]);
}
printf("输出X中二元关系R的关系矩阵:\n");
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
printf("%d ",a[i][j]);
if(j==k-1)
printf("\n");
}
}
printf("输出X中二元关系S的关系矩阵:\n");
for(m=0;m<k;m++)
for(n=0;n<k;n++)
{
printf("%d ",b[m][n]);
if(n==k-1)
printf("\n");
}
for(i=0;i<k;i++)
for(n=0;n<k;n++)
{
for(j=0,m=0;j<k,m<k;j++,m++)
{
sum+=a[i][j]*b[m][n];
printf("请输入邻接矩阵的阶数\n");
scanf("%d",&n);
printf("请输入此邻接矩阵\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
c[i][j]=a[i][j];
d[i][j]=a[i][j];
b[i][j]=0;
for(j=0;j<d;j++)
s1[j][i]=s2[i][j];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
s2[i][j]=s2[i][j]+s1[i][j];
if(s2[i][j]>1)
s2[i][j]=1;
}
output(s2);
}
void chuandi1(int s2[][100])
for(j=0;j<d;j++)
if(m[i][j]==1)
{
for(k=0;k<n;k++)
if(s2[j][k]==1)
a[i][k]=1;
}
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
m[i][j]=a[i][j];
t[i][j]+=a[i][j];
a[i][j]=0;
if(t[i][j]>1)
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;
}
return 0;
}
四、实验体会
求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。
printf("\n");
}
return 0;
}
四、实验体会
熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
scanf("%d",&s[i][j]);
}
do
{
printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包\n3:对称闭包\n");
scanf("%d",&z);
switch(z)
{
case 1:zifan(s); break;
case 2:chuandi1(s);break;
case 3:duichen(s); break;
{
int m[100][100],a[100][100],k,h;
int t[100][100];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
a[i][j]=0;
t[i][j]=s2[i][j];
m[i][j]=s2[i][j];
}
for(h=0;h<n;h++)
{
for(i=0;i<n;i++)
printf("输入一个X集合中的元素:");
scanf("%d",&n);
printf("输入一个关系矩阵:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
if(a[i][j]==1)
实验三、用沃尔算法求传递闭包
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
}
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");
else if(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");
}
else if(p==1&&q==1)
{
printf("﹁p=0\n");