离散数学实验报告Word格式.docx
《离散数学实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《离散数学实验报告Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
∨,当且仅当P和Q的真值同为假,命题P∨Q的真值才为假;
否则,P∨Q的真值为真。
(4)异或,符号:
▽,当且仅当P和Q的真值不同时,命题P▽Q的真值才为真;
否则,P▽Q的真值为真。
(5)蕴涵,符号:
→,当且仅当P为T,Q为F时,命题P→Q的真值才为假;
否则,P→Q的真值为真。
(6)等价,符号:
?
当且仅当P,Q的真值不同时,命题P?
Q的真值才为假;
三.实验内容
编写一个程序实现非运算、合取运算、析取运算、异或运算、蕴涵运算、等价运算。
四.算法程序
#include<
>
voidmain()
{
printf("
请输入P、Q的真值\n"
);
inta,b;
scanf("
%d%d"
&
a,&
b);
intc,d;
if(a==1)
c=0;
elsec=1;
if(b==1)
d=0;
elsed=1;
printf("
非P、Q的结果为%d,%d\n"
c,d);
inte;
if(a==1&
&
b==1)
e=1;
elsee=0;
合取的结果为%d\n"
e);
intf;
if(a==0&
b==0)
f=0;
elsef=1;
析取的结果为%d\n"
f);
intg;
g=0;
elseg=1;
单条件的结果为%d\n"
g);
inth;
if(a==b)
h=1;
elseh=0;
双条件的结果为%d\n"
h);
}
内容格式:
新罗马,五号,行间距固定值18磅
五.实验结果
六.心得体会
通过编程,学会了析取、合取、单条件连接词、双条件连接词的用法。
复合运算是一种重要的二元关系运算,可用于二元关系的合成,二元关系的性质判断,二元关系传递闭包的运算等方面,通过编程实现二元关系的复合运算,帮助同学们理解复合运算的过程,复合形成新的二元关系中的序偶是如何产生的。
复合运算能由两个二元关系生成一个新的二元关系。
设X→Y(R关系),Y→Z(S关系),则称X→Z(R?
S关系)为R和S的复合关系,并规定为:
R?
S={<
x,z>
|x∈X∧z∈Z∧?
y(y∈Y∧<
x,y>
∈R∧<
y,z>
∈S)}
关系可用矩阵表示,故复合运算也可用矩阵表示。
设有三个集合:
X={x1,x2…xm},Y={y1,y2…yn},Z={z1,z2…zp},
,|X|=m,|Y|=n,|Z|=p,MR=[aik]m×
n,MS=[akj]n×
p则复合关系R?
S的关系矩阵为:
MR?
S=MR?
MS=[cij]m×
p
∨代表逻辑加,满足0∨0=0,0∨1=1,1∨0=1,1∨1=1
∧代表逻辑乘,满足0∧0=0,0∧1=0,1∧0=0,1∧1=1
将二元关系用关系矩阵表示,通过两个关系矩阵对应行列元素先进行逻辑乘,后进行逻辑加生成新的关系矩阵中的每一个元素。
新的关系矩阵所对应的二元关系就是两个二元关系复合形成的,编程实现这一复合过程。
#include<
intmain()
inta[100][100],b[100][100],c[100][100],i,j,k,n;
请输入集合X中元素个数:
"
scanf("
%d"
n);
请输入关系矩阵Mr的格式:
\n"
for(i=0;
i<
n;
i++)
{
for(j=0;
j<
j++)
scanf("
a[i][j]);
}
请输入关系矩阵Ms的格式:
b[i][j]);
j++)if(a[i][j]==1)
for(k=0;
k<
k++)if(b[j][k]==1)
c[i][k]=1;
if(c[i][j]!
=1)
c[i][j]=0;
关系矩阵Mr和Ms的复合运算结果是:
for(i=0;
printf("
%d"
c[i][j]);
return0;
实验结果截图大小为:
宽(10cm)×
高(8cm)
通过编程,更加深入的了解了矩阵复合运算法则。
对于一个二元关系R,它的传递闭包(t(R))就是包含R,并且具有传递性质的最小二元关系。
传递闭包在图论、数据库、编译原理、计算机形式语言中都有重要的应用。
warshall算法是计算传递闭包的一种有效算法,通过编程实现warshall算法,帮助同学们更好地理解传递闭包的生成过程。
设X是含有n个元素的集合,R是X上的二元关系,则:
以上计算传递闭包时需要按照复合关系定义求
,这是比较麻烦的,特别当有限集合元素比较多时计算量很大。
1962年Warshall提出了一个求t(R)的有效计算方法:
设R是n个元素集合上的二元关系,
是R的关系矩阵:
第一步:
置新矩阵M,
;
第二步:
置i,
第三步:
对
,若M的第j行i列处为1,则对
作如下计算:
将M的第j行第k列元素与第i行第k列元素进行逻辑加,然后将结果送到第j行k列处,即
第四步:
第五步:
若
,转到第三步,否则停止。
将二元关系用关系矩阵表示,编程实现Warshall算法,获得二元关系传递闭包的关系矩阵。
intA[10][10];
intn,i,j,k;
输入关系矩阵的维数n(n<
10)\n"
scanf("
输入n*n个数据(0or1)\n"
for(i=1;
=n;
for(j=1;
{
A[i][j]);
if(A[i][j]!
=1&
A[i][j])
printf("
Thereisanerror"
}
for(k=1;
k++)
{
if(A[i][j]&
(A[i][k]||A[j][k]))
A[i][k]=1;
}
传递闭包的关系矩阵:
%2d"
A[i][j]);
通过编程,深入了解什么是Warshall算法,也加深了对传递闭包的了解。
可达矩阵表明了图中任何两个不同的结点之间是否存在至少一条道路,以及在任何结点处是否存在着回路。
可达性矩阵是判别一个有向图是否为强连通图或弱连通图的有效工具,通过编程实现图形的可达矩阵,帮助同学们掌握可达矩阵生成方法。
定义设G=(V,E)是一个n阶的有向简单图,
。
定义矩阵
,其中
称P是图G的可达矩阵。
求可达矩阵可以先构造A,
,再构造
,最后利用关系
确定P的元素
从而构造出P。
显然,这种先求
再构造P的方法很费事。
如果我们把邻接矩阵A当作关系矩阵,那么求可达矩阵就相当于求A的传递闭包,因此可以仿照集合论中求关系的传递闭包的办法,求可达矩阵P。
将图形中的边表达成二元关系,计算该二元关系的传递闭包,并将传递闭包表达成关系矩阵,该关系矩阵就是图形的可达矩阵,编程实现求可达矩阵的过程。
#defineN4
voidTransitiveClosure(intdist[N][N],intt[N][N])//寻找可达矩阵
{
for(inti=0;
N;
i++)//进行遍历
for(intj=0;
j++)
{
if((i==j)||(dist[i][j])==1)
t[i][j]=1;
else
t[i][j]=0;
}
for(intk=0;
k++)
i++)
t[i][j]=t[i][j]||(t[i][k]&
t[k][j]);
voidmain()
inti,j;
intdist[N][N]={{1,0,0,0},
{0,1,1,1},
{0,1,1,0},
{1,0,1,1}};
邻接矩阵举例如下:
for(i=0;
for(j=0;
dist[i][j]);
intt[N][N]={0};
TransitiveClosure(dist,t);
其对应可达矩阵如下:
for(j=0;
t[i][j]);
}
有了邻接矩阵,通过遍历,判断是否可达,通过for语句找出可达矩阵。