离散数学实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《离散数学》实验报告
专业网络工程
班级
姓名
学号
授课教师
二 O 一六年十二月
目录
实验一联结词的运算
实验二根据矩阵的乘法求复合关系
实验三利用warshall算法求关系的传递闭包实验四图的可达矩阵实现
实验一联结词的运算
一.实验目的
通过上机实验操作,将命题连接词运算融入到C语言的程序编写中,一方面加强对命题连接词运算的理解,另一方面通过编程实现命题连接词运算,帮助学生复习和锻炼C语言知识,将理论知识与实际操作结合,让学生更加容易理解和记忆命题连接词运算。

二.实验原理
(1) 非运算, 符号:? ,当P=T时,?P为F, 当P=F时,?P为T 。

(2) 合取, 符号: ∧ , 当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。

(3) 析取, 符号: ∨ , 当且仅当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的真值才为假;否则,P→Q 的真值为真。

三.实验内容
编写一个程序实现非运算、合取运算、析取运算、异或运算、蕴涵运算、等价运算。

四.算法程序
#include<>
void main()
{
printf("请输入P、Q的真值\n");
int a,b;
scanf("%d%d",&a,&b);
int c,d;
if(a==1)
c=0;
else c=1;
if(b==1)
d=0;
else d=1;
printf("非P、Q的结果为%d,%d\n",c,d);
int e;
if(a==1&&b==1)
e=1;
else e=0;
printf("合取的结果为%d\n",e);
int f;
if(a==0&&b==0)
f=0;
else f=1;
printf("析取的结果为%d\n",f);
int g;
if(a==1&&b==0)
g=0;
else g=1;
printf("单条件的结果为%d\n",g);
int h;
if(a==b)
h=1;
else h=0;
printf("双条件的结果为%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={x 1,x 2…x m },Y={y 1,y 2…y n },Z={z 1,z 2…z p }, Z Y X S
R −→−−→−,|X|=m, |Y|=n, |Z|=p,M R =[a ik ]m ×n ,M S =[a kj ]n ×p 则复合关系R ?S 的关系矩阵为:
M R ?S = M R ?M S =[c ij ] m ×p )(1kj
ik n
k ij b a c ∧=∨=
∨代表逻辑加,满足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 <> int main() { int a[100][100],b[100][100],c[100][100],i,j,k,n; printf("请输入集合X 中元素个数:");
scanf("%d",&n);
printf("请输入关系矩阵Mr 的格式:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
printf("请输入关系矩阵Ms的格式:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&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<n;i++)
{
for(j=0;j<n;j++)
if(c[i][j]!=1)
c[i][j]=0;
}
printf("\n");
printf("关系矩阵Mr和Ms的复合运算结果是:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
return 0;
}
五.实验结果
实验结果截图大小为:宽(10cm)×高(8cm)
六.心得体会
通过编程,更加深入的了解了矩阵复合运算法则。

实验三 利用warshall 算法求关系的传递闭包
一.实验目的
对于一个二元关系R,它的传递闭包(t(R))就是包含R,并且具有传递性质的最小二元关系。

传递闭包在图论、数据库、编译原理、计算机形式语言中都有重要的应用。

warshall 算法是计算传递闭包的一种有效算法,通过编程实现warshall 算法,帮助同学们更好地理解传递闭包的生成过程。

二.实验原理
设X 是含有n 个元素的集合,R 是X 上的二元关系,则:
23()n t R R R R R =
以上计算传递闭包时需要按照复合关系定义求i
R ,这是比较麻烦的,特别当有限集合元素比较多时计算量很大。

1962年Warshall 提出了一个求t(R)的有效计算方法:设R 是
n 个元素集合上的二元关系,R M 是R 的关系矩阵:
第一步:置新矩阵M ,R M M ←; 第二步:置i ,1←i ;
第三步:对)1(n j j ≤≤,若M 的第j 行i 列处为1,则对n k ,,2,1 =作如下计算: 将M 的第j 行第k 列元素与第i 行第k 列元素进行逻辑加,然后将结果送到第j 行k 列处,即 ],[],[],[k i M k j M k j M ∨←; 第四步:1+←i i ;
第五步:若n i ≤,转到第三步,否则停止。

三.实验内容
将二元关系用关系矩阵表示,编程实现Warshall 算法,获得二元关系传递闭包的关系矩阵。

四.算法程序
#include <> #include <> void main() { int A[10][10]; int n,i,j,k;
printf("输入关系矩阵的维数n(n<10)\n");
scanf("%d",&n);
printf("输入n*n个数据(0 or 1)\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&A[i][j]);
if(A[i][j]!=1&&A[i][j])
printf("There is an error");
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if(A[i][j]&&(A[i][k]||A[j][k]))
A[i][k]=1;
}
}
}
printf("传递闭包的关系矩阵:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%2d",A[i][j]);
printf("\n");
}
}
五.实验结果
六.心得体会
通过编程,深入了解什么是Warshall算法,也加深了对传递闭包的了解。

实验四 图的可达矩阵实现
一.实验目的
可达矩阵表明了图中任何两个不同的结点之间是否存在至少一条道路,以及在任何结点处是否存在着回路。

可达性矩阵是判别一个有向图是否为强连通图或弱连通图的有效工具,通过编程实现图形的可达矩阵,帮助同学们掌握可达矩阵生成方法。

二.实验原理
定义 设G=(V ,E )是一个n 阶的有向简单图,{}n v v v V ,,,21 =。

定义矩阵
n n j i p P ⨯=)(,其中
⎩⎨
⎧=,

v v p j i ij 其它存在非零的有向道路到从,
0,1
称P 是图G 的可达矩阵。

求可达矩阵可以先构造A ,n
A A ,,2 ,再构造n n A A A
B ++=2,最后利用关系
⎪⎩⎪⎨
⎧=>=,
b ,
b p n tj n ij ij 0,
00,1)
()
(若若 确定P 的元素ij p 从而构造出P 。

显然,这种先求n n
B A A A A ,,,,,32 再构造P 的方法很费事 。

如果我们把邻接矩阵
A 当作关系矩阵,那么求可达矩阵就相当于求A 的传递闭包,因此可以仿照集合论中求关系的传递闭包的办法,求可达矩阵P 。

三.实验内容
将图形中的边表达成二元关系,计算该二元关系的传递闭包,并将传递闭包表达成关系矩阵,该关系矩阵就是图形的可达矩阵,编程实现求可达矩阵的过程。

四.算法程序
#include<> #define N 4
void TransitiveClosure(int dist[N][N],int t[N][N])//寻找可达矩阵 {
for(int i=0;i<N;i++)//进行遍历 for(int j=0;j<N;j++) {
if((i==j)||(dist[i][j])==1)
t[i][j]=1;
else
t[i][j]=0;
}
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
t[i][j]=t[i][j]||(t[i][k]&&t[k][j]);
}
void main()
{
int i,j;
int dist[N][N]={{1,0,0,0},
{0,1,1,1},
{0,1,1,0},
{1,0,1,1}};
printf("邻接矩阵举例如下:\n");
for( i=0;i<N;i++)
{
for( j=0;j<N;j++)
printf("%d ",dist[i][j]);
printf("\n");
}
int t[N][N]={0};
TransitiveClosure( dist, t);
printf("其对应可达矩阵如下:\n");
for( i=0;i<N;i++)
{
for( j=0;j<N;j++)
printf("%d ",t[i][j]);
printf("\n");
}
}
五.实验结果
六.心得体会
有了邻接矩阵,通过遍历,判断是否可达,通过for语句找出可达矩阵。

相关文档
最新文档