当前位置:文档之家› 离散数学上机实验报告

离散数学上机实验报告

实验三、用沃尔算法求传递闭包
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
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,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
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);
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)
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 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 ");
}
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++)
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++)
{
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++)
}
}
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;
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(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];
for(k=0;k<n;k++)
{
a[i][k]=a[j][k]+a[i][k];
if(a[i][k]>1)
a[i][k]=1;
}
}
}
printf("输出传递闭包:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printfn-1)
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,其余不变。
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++)
相关主题