离散数学上机实验报告.docx
《离散数学上机实验报告.docx》由会员分享,可在线阅读,更多相关《离散数学上机实验报告.docx(19页珍藏版)》请在冰点文库上搜索。
![离散数学上机实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/28/7d52f828-323a-47b3-8187-02599a180699/7d52f828-323a-47b3-8187-02599a1806991.gif)
离散数学上机实验报告
离散数学上机实验报告
———————————————————————————————— 作者:
————————————————————————————————日期:
ﻩ
《离散数学》
实验报告
姓名:
学号:
班级:
ﻬ
实验一 连结词逻辑运算
一.实验目的
实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容
从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。
要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
三.实验环境
使用MicrosoftVisual C++6.0为编程软件,采用称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()
{
ﻩintP,Q,a,b,c,d,p,q;
printf("P的值");
for(P=0;P<2;P++)
ﻩ{
ﻩfor(Q=0;Q<2;Q++)
ﻩﻩprintf("\t%d",P);
ﻩ}
printf("\nQ的值");
for(P=0;P<2;P++)
ﻩ{
ﻩﻩfor(Q=0;Q<2;Q++)
ﻩprintf("\t%d",Q);
ﻩ}
printf("\n非P的值");
for(P=0;P<2;P++)
{
ﻩfor(Q=0;Q<2;Q++)
ﻩ{
ﻩﻩif(P==0)/*判断非P的值*/
ﻩﻩﻩp=1;
ﻩﻩelse
ﻩﻩp=0;
ﻩﻩﻩprintf("\t%d",p);
ﻩ}
ﻩ}
ﻩprintf("\n 非Q的值");
ﻩfor(P=0;P<2;P++)
ﻩ{
ﻩfor(Q=0;Q<2;Q++)
ﻩﻩ{
ﻩﻩif(Q==1)/*判断非Q的值*/
ﻩﻩﻩq=0;
ﻩelse
ﻩﻩq=1;
ﻩprintf("\t%d",q);
}
ﻩ}
ﻩprintf("\n P与Q的值");
for(P=0;P<2;P++)
ﻩ{
ﻩfor(Q=0;Q<2;Q++)
ﻩ{
ﻩﻩﻩif(Q==0||P==0)/*判断P与Q的值*/
ﻩa=0;
ﻩﻩelse
ﻩﻩa=1;
ﻩprintf("\t%d",a);
ﻩ}
ﻩ}
ﻩprintf("\nP或Q的值");
ﻩfor(P=0;P<2;P++)
ﻩ{
for(Q=0;Q<2;Q++)
ﻩﻩ{
ﻩif(Q==1||P==1)/*判断P或Q的值*/
ﻩﻩﻩb=1;
ﻩelse
ﻩﻩb=0;
ﻩprintf("\t%d",b);
}
ﻩ}
ﻩprintf("\nP蕴含Q的值");
ﻩfor(P=0;P<2;P++)
ﻩ{
ﻩfor(Q=0;Q<2;Q++)
ﻩﻩ{
ﻩﻩif(P==1&&Q==0)/*判断P蕴含Q的值*/
ﻩﻩc=0;
ﻩﻩelse
ﻩc=1;
printf("\t%d",c);
}
}
printf("\nP等价Q的值");
for(P=0;P<2;P++)
ﻩ{
ﻩﻩfor(Q=0;Q<2;Q++)
ﻩ{
ﻩﻩif(P==Q)/*判断P等价Q的值*/
ﻩd=1;
ﻩﻩelse
ﻩﻩd=0;
ﻩﻩprintf("\t%d",d);
}
ﻩ}
printf("\n");
return0;
}
3.实验数据及结果分析:
实验二关系的复合运算及逆运算
一.实验目的
熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
二.实验内容
利用矩阵求解有限集上的复合关系和逆关系。
三.实验过程
1.算法分析:
复合运算就将两个用矩阵表示的关系进行复合,即在第一个矩阵中寻找值为1的元素坐标(i,j ),在第二个矩阵第j行寻找值为1的元素,若有,且坐标为(j,k),则产生的新的关系的矩阵中坐标为(i,k)的元素值为1。
逆运算就是将用矩阵中值为1的元素坐标(i,j)对调,产生新的关系的矩阵中坐标为(j,i)的元素值为1。
2.程序代码:
//关系的复合运算
#include
usingnamespacestd;
intmain()
{
inta[100][100],b[100][100],c[100][100],i,j,k,n;
ﻩcout<<"请输入集合X中元素的个数:
";
cin>>n;
cout<<"请输入关系矩阵Mr的格式:
"<<endl;
for(i=0;i<n;i++)
ﻩ{
ﻩﻩfor(j=0;jﻩﻩﻩcin>>a[i][j];
}
ﻩcout<<"请输入关系矩阵Ms的格式:
"<for(i=0;i<n;i++)
ﻩ{
ﻩﻩfor(j=0;jﻩcin>>b[i][j];
ﻩ}
ﻩfor(i=0;i<n;i++) //进行复合运算
ﻩ{
for(j=0;j<n;j++)
ﻩif(a[i][j]==1)
ﻩfor(k=0;k<n;k++)
ﻩﻩif(b[j][k]==1)
ﻩﻩﻩﻩc[i][k]=1;
}
for(i=0;iﻩ{
ﻩfor(j=0;j<n;j++)
ﻩif(c[i][j]!
=1)
ﻩc[i][j]=0;
}
ﻩcout<cout<<"关系矩阵Mr与Ms的复合运算结果是:
"<for(i=0;i<n;i++)
ﻩ{
ﻩﻩfor(j=0;jﻩﻩcout<<c[i][j]<<" ";
ﻩcout<}
return0;
}
//关系的逆运算
#include
intmain()
{
inta[100][100],b[100][100],n,i,j,index;
ﻩprintf("请输入集合X中元素的个数:
");
scanf("%d",&n);
printf("请输入关系矩阵Mr的格式:
\n");
ﻩfor(i=0;i<n;i++)
{
for(j=0;jﻩscanf("%d",&a[i][j]);
ﻩ}
for(i=0;i<n;i++)//进行逆运算
ﻩ{
for(j=0;j<n;j++)
ﻩif(a[i][j]==1)
ﻩﻩ{ﻩ
ﻩindex=i;
ﻩi=j;
ﻩﻩj=index;
ﻩﻩb[i][j]=1;
}
}
for(i=0;i<n;i++)
ﻩ{
ﻩfor(j=0;jﻩﻩif(b[i][j]!
=1)
ﻩﻩﻩb[i][j]=0;
}ﻩ
ﻩprintf("\n关系矩阵Mrc为:
\n");
for(i=0;i<n;i++)
ﻩ{
for(j=0;j<n;j++)
ﻩﻩprintf("%d",b[i][j]);
ﻩprintf("\n");
}
ﻩreturn 0;ﻩ
}
3.实验数据及结果分析:
实验三 关系的闭包运算
一.实验目的
熟悉关系的闭包运算,编程实现关系闭包运算算法。
二.实验内容
利用矩阵求解有限集上给定关系的自反、对称和传递闭包。
三.实验过程
1.算法分析:
在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法);传递闭包则直接根据t(R)=R+。
2.程序代码:
#include<iostream>
usingnamespacestd;
void deliver(intx[100][100],inty[100][100],int n);
int main()
{
ﻩinti,j,n,R[100][100],r[100][100],s[100][100],t[100][100];
cout<<"请输入矩阵的阶:
";
cin>>n;
ﻩcout<"<for(i=0;iﻩ{
for(j=0;j<n;j++)
ﻩﻩﻩcin>>R[i][j];
}
ﻩfor(i=0;i<n;i++) //将R的关系矩阵赋值给r,s,t
ﻩ{ﻩ
ﻩﻩfor(j=0;j<n;j++)
ﻩ{
ﻩﻩﻩr[i][j]=R[i][j];
ﻩﻩs[i][j]=R[i][j];
ﻩt[i][j]=R[i][j];
ﻩ}
}
for(i=0;i{
if(r[i][i]==0)
r[i][i]=1;
}
ﻩcout<"<ﻩfor(i=0;iﻩ{
ﻩfor(j=0;jﻩﻩﻩcout<<r[i][j]<<"";
cout<}
for(i=0;i<n;i++) //对称闭包运算
ﻩ{
ﻩfor(j=0;j<i;j++)
ﻩ{
if(s[i][j]==1||s[j][i]==1)
ﻩ{
ﻩﻩs[i][j]=1;
ﻩﻩﻩs[j][i]=1;
ﻩ}
ﻩ}
ﻩ}
cout<<endl<<"对称闭包关系矩阵s(R):
"<ﻩfor(i=0;i{
ﻩﻩfor(j=0;j<n;j++)
ﻩﻩcout<<s[i][j]<<"";
ﻩcout<<endl;
}
ﻩdeliver(t,R,n); //关于传递闭包的函数
ﻩreturn 0;
}
void deliver(intx[100][100],inty[100][100],intn)//关于传递闭包的函数
{
inti,j,k,m,z[100][100];
for(m=0;m{
ﻩﻩfor(i=0;i<n;i++)
ﻩﻩ{
ﻩﻩfor(j=0;jﻩ{
ﻩﻩﻩif(x[i][j]==1)
ﻩ{
ﻩfor(k=0;k<n;k++)
ﻩﻩﻩif(y[j][k]==1) //进行复合运算
ﻩﻩﻩﻩz[i][k]=1;
}
ﻩ}
ﻩ}
ﻩfor(i=0;i{
ﻩfor(j=0;jﻩﻩﻩif(z[i][j]!
=1)
ﻩﻩﻩz[i][j]=0;
ﻩﻩ}
ﻩﻩfor(i=0;i<n;i++)
ﻩﻩ{ﻩ
ﻩfor(j=0;j<n;j++)
{
ﻩﻩx[i][j]=x[i][j]+z[i][j]; //进行传递闭包运算
ﻩﻩ}
ﻩﻩ}
ﻩﻩfor(i=0;i{
for(j=0;j<n;j++)
ﻩﻩif(x[i][j]!
=0)
ﻩﻩx[i][j]=1;
}
ﻩ}
cout<"<<endl;
ﻩfor(i=0;i<n;i++) //输出x的关系矩阵
{
ﻩfor(j=0;j<n;j++)
ﻩﻩﻩcout<<x[i][j]<<"";
ﻩﻩcout<}
}
3.实验数据及结果分析:
ﻬ
实验四 图的矩阵表示
一.实验目的
熟悉图的矩阵表示方法——邻接矩阵、可达矩阵和关联矩阵。
二.实验内容
利用邻接矩阵得到的可达矩阵来求解图的连通性质。
三.实验过程
1.算法分析:
可达矩阵表示图中任意两个节点间的可达关系,而邻接矩阵表示图中任意两个节点的邻接关系。
求解邻接矩阵
可知任意两个节点之间是否存在互相连通的路,从而判断是否可达。
2.程序代码:
#include
using namespacestd;
voidmain()
{
ﻩint i,j,k,n,m,a[100][100],b[100][100],c[100][100],d[100][100];
cout<<"请输入矩阵阶数:
";
cin>>n;
cout<<"请输入邻接矩阵a:
"<<endl;
ﻩfor(i=0;i{
for(j=0;j{
ﻩﻩcin>>a[i][j];
ﻩﻩb[i][j]=a[i][j];
ﻩﻩ}
ﻩ}
for(i=0;i<n;i++)//矩阵d为零矩阵
{
ﻩﻩfor(j=0;j<n;j++)
ﻩﻩd[i][j]=0;
ﻩ}
ﻩfor(m=0;mﻩ{
for(i=0;iﻩﻩ{
ﻩﻩfor(j=0;jﻩc[i][j]=0;
}
ﻩﻩfor(k=0;k<n;k++)
ﻩﻩ{
ﻩfor(i=0;iﻩﻩﻩfor(j=0;j<n;j++)
ﻩﻩﻩ{
ﻩﻩc[k][i]=c[k][i]+b[k][j]*a[j][i];//矩阵的乘法运算
ﻩﻩ}
ﻩﻩ}
ﻩfor(i=0;iﻩ{
ﻩﻩﻩfor(j=0;j<n;j++)
ﻩ{
ﻩb[i][j]=c[i][j];
ﻩd[i][j]=d[i][j]+b[i][j];
ﻩ}
ﻩﻩ}
cout<<"m为"<"<<endl;
ﻩﻩfor(i=0;i<n;i++)
{
ﻩfor(j=0;j<n;j++)
ﻩﻩﻩcout<
ﻩcout<}
}
ﻩfor(i=0;i{
ﻩfor(j=0;j<n;j++)
ﻩﻩif(d[i][j]!
=0)
ﻩd[i][j]=1;
}
cout<<"可达矩阵d为:
"<ﻩfor(i=0;i{
for(j=0;jﻩﻩcout<<d[i][j]<<"";
ﻩcout<<endl;
ﻩ}
}
ﻬ
3.实验数据及结果分析: