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

离散数学实验报告

《离散数学》实验报告专业网络工程班级姓名学号授课教师二 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<stdio、h>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 SR −→−−→−,|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 )(1kjik nk 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 <stdio 、h> 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 =U U UL U以上计算传递闭包时需要按照复合关系定义求iR ,这就是比较麻烦的,特别当有限集合元素比较多时计算量很大。

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 <stdio、h>#include <math、h>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,nA A ,,2Λ,再构造n n A A AB Λ++=2,最后利用关系⎪⎩⎪⎨⎧=>=,b ,b p n tj n ij ij 0,00,1)()(若若 确定P 的元素ij p 从而构造出P 。

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

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

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

相关主题