离散实验.docx
《离散实验.docx》由会员分享,可在线阅读,更多相关《离散实验.docx(15页珍藏版)》请在冰豆网上搜索。
离散实验
离散数学
实
验
报
告
学院:
计算机科学与软件学院
指导老师:
班级:
姓名:
学号:
实验一真值计算
一、实验目的
熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容
从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
三、实验步骤
1根据要求用C语言进行编程。
2上机进行测试,看编程是否正确,并运行。
四、源程序
#include
voidmain()
{
inta,b,c,d,p,q;
charT=1,F=0;
printf("输入两个数p,q");
scanf("%d,%d",&p,&q);
if(p==F&q==F)
a=F,b=F,c=T,d=T;
elseif(p==F,q==T)
a=F,b=T,c=T,d=F;
elseif(p==T,q==F)
a=F,b=T,c=F,d=F;
elseif(p==T,q==T)
a=T,b=T,c=T,d=T;
else
printf("wrong");
printf("a合取=%d\nb析取=%d\nc条件=%d\nd双条件=%d\n",a,b,c,d);
}
五、运行结果
实验二关系闭包计算
一、实验目的
熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
二、实验内容
从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。
用C语言或MATLAB实现。
三、实验步骤
1根据要求用C语言进行编程。
2上机进行测试,看编程是否正确,并运行。
四、源程序
#include
usingnamespacestd;
intmain()
{
constn=4;
intp[n][n]={0},q[n][n]={0},w[n][n]={0},m[n][n]={0};
inta=0;
for(inti=0;i{
for(intj=0;j{
cin>>a;
p[i][j]=a;
q[i][j]=a;
w[i][j]=a;
m[i][j]=a;
}
}
intfan[n][n]={0};
cout<<"zifanbibao:
"<for(inti1=0;i1{
for(intj1=0;j1{if(p[i1][j1]==0)
fan[i1][j1]=1;
elsefan[i1][j1]=0;}
}
for(inti2=0;i2{
for(intj2=0;j2cout<cout<}
intdui[n][n]={0};//对称闭包
cout<<"duichenbibao:
"<for(inti3=0;i3{
for(intj3=0;j3dui[i3][j3]=p[j3][i3];
}
for(inti4=0;i4{
for(intj4=0;j4cout<cout<}
intchuan1[n][n]={0};//warshall算法
cout<<"chuandi1bibao:
"<for(intu=0;ufor(intf=0;fchuan1[u][f]=p[u][f];
for(inti5=0;i5for(intj5=0;j5if(chuan1[j5][i5]==1)
for(intk=0;kchuan1[j5][k]=chuan1[j5][k]||chuan1[i5][k];
for(inti6=0;i6{
for(intj6=0;j6{
cout<}
cout<}
intchuan2[n][n]={0};//r+算法
cout<<"chuandi2bibao:
"<for(intt=0;t<=n-2;t++)
{
for(inti8=0;i8for(intj8=0;j8{chuan2[i8][j8]=0;
for(ints=0;schuan2[i8][j8]=chuan2[i8][j8]||(q[i8][s]*m[s][j8]);}
for(inti=0;ifor(intj=0;j{w[i][j]=w[i][j]||chuan2[i][j];
q[i][j]=chuan2[i][j];}
}
for(inti7=0;i7{
for(intj7=0;j7{if(w[j7][i7]!
=0)
chuan2[i7][j7]=1;
elsechuan2[i7][j7]=0;
cout<cout<}
return0;
}
五、运行结果
实验三计算两结点间长度为m的路的数目
一、实验目的
熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。
二、实验内容
从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。
考虑有向图和无向图。
用C语言实现。
实现可达性矩阵。
三、实验步骤
1根据要求用C语言进行编程。
2上机进行测试,看编程是否正确,并运行。
四、实验程序:
#include
voidmain(void)
{
intx[10][10],r[10][10],q[10][10],l[10][10];
intp,m,n,i,j,k,g,h;
printf("输入图的邻接矩阵的维数:
");
scanf("%d",&n);
printf("输入结点两两长度m:
");
scanf("%d",&m);
printf("输入图的邻接矩阵:
\n");
for(i=0;i{
for(j=0;j{
scanf("%d",&x[i][j]);
r[i][j]=x[i][j];
}
}
for(p=1;p{
for(i=0;ifor(j=0;j{
q[i][j]=0;
for(k=0;kq[i][j]+=x[i][k]*r[k][j];
l[i][j]=q[i][j];
}
for(g=0;g{
for(h=0;hr[g][h]=l[g][h];
}
}
printf("结点之间两两长度为%d的路的数目矩阵如下:
\n",m);
for(i=0;i{
for(j=0;jprintf("%d",l[i][j]);
printf("\n");
}
printf("此图的可达性矩阵为:
\n");
for(i=0;i{
for(j=0;j{
r[i][j]=x[i][j];
q[i][j]=x[i][j];
}
}
for(p=0;pfor(i=0;ifor(j=0;j{
for(m=0;mr[i][j]+=x[i][m]*r[m][j];
q[i][j]+=r[i][j];
}
for(i=0;i{
for(j=0;j{
if(q[i][j]>0)
q[i][j]=1;
printf("%d",q[i][j]);
}
printf("\n");
}
}
五、实验结果
实验四最优树的构造
一、实验目的
熟悉最优树的构造算法,掌握最优树的构造过程。
二、实验内容
从键盘输入一组权值,构造出对应的最优树,列出构造过程。
用C语言实现。
三、实验步骤
1根据要求用C语言进行编程。
2上机进行测试,看编程是否正确,并运行。
四、实验程序
#include
voidmain(void)
{
intv,e,i,j,m,p,q,a,b,number=0;
intx[20][20],E[20],E1[20],row[20];
printf("请输入树的结点数:
V=");
scanf("%d",&v);
printf("请输入树的边数:
E=");
scanf("%d",&e);
printf("请输入边e1-e%d权值:
",e);
for(i=0;i{
scanf("%d",&E[i]);
E1[i]=E[i];//将边存储起来,便于之后排列边与结点的相互对应关系
row[i]=0;
}
printf("请输入图的完全关联矩阵:
\n");
printf("");
for(i=1;i<=e;i++)
printf("e%d",i);
printf("\n");
for(i=1;i<=v;i++)
{
printf("v%d",i);
for(j=0;jscanf("%d",&x[i-1][j]);
}
for(i=0;ifor(j=i+1;j{
if(E[i]>E[j])
{
a=E[i];//冒泡法排列权值
E[i]=E[j];
E[j]=a;
for(m=0;m{
b=x[m][i];
x[m][i]=x[m][j];
x[m][j]=b;
}
}
}
printf("按权值大小排列为:
\n");
for(i=0;iprintf("%d",E[i]);
printf("\n");
for(i=0;i{
for(j=0;j{
if(E[i]==E1[j