离散数学实验报告--四个实验!!!.doc

上传人:牧羊曲112 文档编号:1610979 上传时间:2022-12-10 格式:DOC 页数:19 大小:472KB
返回 下载 相关 举报
离散数学实验报告--四个实验!!!.doc_第1页
第1页 / 共19页
离散数学实验报告--四个实验!!!.doc_第2页
第2页 / 共19页
离散数学实验报告--四个实验!!!.doc_第3页
第3页 / 共19页
离散数学实验报告--四个实验!!!.doc_第4页
第4页 / 共19页
离散数学实验报告--四个实验!!!.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《离散数学实验报告--四个实验!!!.doc》由会员分享,可在线阅读,更多相关《离散数学实验报告--四个实验!!!.doc(19页珍藏版)》请在三一办公上搜索。

1、离散数学课程设计学 院 计算机学院学生姓名 学 号 指导教师 评阅意见 提交日期 2011 年 11 月 25 日引言 离散数学是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。它是研究离散量(如整数、有理数、有限字母表等)的数学结构、性质及关系的学问。它一方面充分地描述了计算机科学离散性的特点,为学生进一步学习算法与数据结构、程序设计语言、操作系统、编译原理、电路设计、软件工程与方法学、数据库与信息检索系统、人工智能、网络、计算机图形学等专业课打好数学基础;另一方面,通过学习离散数学课程,学生在获得离散问题建模、离散数学理论、计算机求解方法和技术知识的同

2、时,还可以培养和提高抽象思维能力和严密的逻辑推理能力,为今后爱念族皮及用计算机处理大量的日常事务和科研项目、从事计算机科学和应用打下坚实基础。特别是对于那些从事计算机科学与理论研究的高层次计算机人员来说,离散数学更是必不可少的基础理论工具。实验一、 编程判断一个二元关系的性质(是否具有自反性、反自反性、对称性、反对称性和传递性)一、前言引语:二元关系是离散数学中重要的容。因为事物之间总是可以根据需要确定相应的关系。从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。二、数学原理:自反、对称、传递关系设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R就是AB的一个合于R=

3、(x,y)AB|xRy的子集合设R是集合A上的二元关系:自反关系:对任意的xA,都满足R,则称R是自反的,或称R具有自反性,即R在A上是自反的(x)(xA)(R)=1对称关系:对任意的x,yA,如果R,那么R,则称关系R是对称的,或称R具有对称性,即R在A上是对称的 (x)(y)(xA) (yA)(R)(R)=1传递关系:对任意的x,y,zA,如果R且R,那么R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的 (x)(y)(z)(xA)(yA)(zA)(R)(R)(R)=1 三、实验原理:通过二元关系与关系矩阵的联系,可以引入N维数组,以数组的运算来实现二元关系的判断。图示:性质关系

4、矩阵特性自反性主对角线元素全为1反自反性主对角线元素全为0对称性对称矩阵反对称性非主对角线上的元素等于1且与之对称的元素等于0传递性矩阵(M*M)中1所在的位置,M中与之相对应位置鲜红都为1四、实验环境:Windows 7 Ultimate DEV C+五、实验语言:C 语言六、程序源代码:#includestdio.h#define N 4main() int i,j,k; int f,e,z; int MNN; printf(判断R是否为自反关系、对称关系、是否可传递?n); printf(请输入一个4*4的矩阵。n); for(i=0;iN;i+) /*输入一个4*4的矩阵*/ for(

5、j=0;jN;j+) scanf(%d,&Mij); for(i=0;iN;i+) for(j=0;jN;j+) printf(%4d,Mij); printf(n); for(i=0;iN;i+) if(Mii=1)/判断自反性 if(i=N-1 e=0; else ; else if(Mii=0)/判断反自反性 if(i=N-1) e=1; else ; else e=2; break; for(i=0;iN;i+) for(j=0;jN;j+) if(Mij!=Mji)/判断对称性 f=1; break; for(i=0;iN;i+) for(j=0;jN;j+) if(Mij=1)/判

6、断反对称性 if(Mji=0) if(i=(N-1)&j=N-1) f=0; else break; if(f!=0&f!=1) f=2; for(i=0;iN;i+)/判断可传递性 for(j=0;jN;j+) if(Mij=1) continue; else for(k=0;kN;k+) if(Mik*Mki=0) continue; else z=0; if(e=0) printf(关系R是自反关系n); else if(e=1) printf(关系R是反自反关系n); else if(e=2) printf(关系R是反自反关系n); if(f=0) printf(关系R是反对称关系n)

7、; else if(f=1) printf(关系R不是对称关系n); else if(f=2) printf(关系R是对称关系n); if(z=0) printf(关系R是不可传递关系n); else printf(关系R是可传递关系n); system(PAUSE);七、程序运行截图:i、程序启动截图: ii、程序输入截图:iii、程序运行结果截图:八、实验总结:实验简洁高效地判断二元关系的性质。实验二、编程求一个二元关系的自反闭包、对称闭包、传递闭包一、前言引语一个二元关系可能具有某种性质,也可能不具有这种性质。现在讨论怎样使一个二元关系变成具有指定性质的新关系,并且还要满足最小性条件。二

8、、数学原理 自反闭包、对称闭包、传递闭包设R是定义在A上的二元关系,若存在A上的关系R满足:1) R是自反的(或对称的、或可传递的),2) R R, 3) 对A上任何其它满足 1)和 2)的关系R,都有: R R。 则称R为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)、(s(R)和t(R)。三、实验原理 Warshall算法的基本思想对每个结点(从第一列开始),找出所有具有到此结点的有向边的结点(即该列中元素为1的所在行的结点),再将这些结点所在行同该结点所在行进行逻辑加后作为这些结点所在的新行(添加新的有向边)(反映了如果这些结点没有到其它结点的有向边,但有到该结点的有向边,再通

9、过该结点间接到达其它结点,根据传递闭包的定义,这些结点就必然有一条有向边到达其它结点)。 设R是集合上的二元关系,Mr是R的关系矩阵 (1)置新矩阵A:=Mr (2)置(列) j:=1 (3) 对所有的i(1in) 如A(i,j)=1,则对k=1,2,n A(i,k):=A(i,k) A(j,k) (即将A的第i行与A的第j行进行逻辑加后送回A的第i行) (4)j:=j+1 (5)如jn转(3),否则停止。四、实验环境:Windows 7 Ultimate DEV C+五、实验编程语言: C语言六、实验程序源代码/source file: War.cpp#includevoid War(int

10、 m,int n) int i,j,k;设置临时变量int a = 0, b = 0;设置临时变量int arr1010;for(a = 0; a m; +a)printf(请输入矩阵第%d行元素:,a);for(b = 0; b n; +b)scanf(%d,&arrab);printf(n);for(i = 0; i m; i+)for( j= 0; j m; j+)if(arrji = 1)for(k = 0;k n; k+)arrjk=arrik | arrjk;printf(所得的可传递闭包关系矩阵是:n);for(i = 0;i m; +i)for(j = 0;j n; +j)pr

11、intf(%d ,arrij);printf(n);/file: test.cpp#includevoid main() printf(利用Warshall算法求二元关系的可传递闭包n);void War(int , int);int m, n;printf(请输入矩阵的行数(必须小于10):);scanf(%d, &m);printf(请输入矩阵的列数(必须小于10):);scanf(%d, &n);War(m, n);system ( “PAUSE”);return 0;七、实验截图i.程序启动画面:ii.输入关系矩阵的行数和列数以及关系矩阵的各个元素。 iii.得出结果,并打印在屏幕上。

12、八、实验总结如果当一个集合的元素的个数n很大时,求在该集合上的二元关系的可传递闭包是非常复杂的。幸好Warshall算法给我们提供了一个求二元关系的可传递闭包的高效方法。结合计算机程序技术,利用warshall算法我们可以轻松的求出一个二元关系的可传递闭包。本次实验便捷高效地达到了实验的目的。实验三、编程求一个二元关系的复合运算一、实验引语:关系作为集合,除了具有一般的运算功能外,还具有自身独特的复合运算。二、数学原理设R是集合A到B的二元关系,S是集合B到C的二元关系,则R。S = (x,z) A C|(y B)(x,y) R (y,z)S称为R和S的复合关系。三、实验原理:矩阵的运算四、实

13、验环境:Windows 7 Ultimate DEV C+五、实验语言:C语言六、实验程序源代码#includestdio.h#includestring.h#define M 3#define N 3#define P 3main() int i,j,k,x; char p; int ANM,BMP,CNP; printf(关系的复合运算n); printf(“请输入一个3*3的矩阵”); printf(A:n); for(i=1;i=N;i+) for(j=1;j=M;j+) scanf(%4d,&Aij); printf(n); printf(“请输入一个3*3的矩阵”); printf

14、(B:n); for(i=1;i=M;i+) for(j=1;j=P;j+) scanf(%4d,&Bij); printf(n); printf(经过复合运算后得到C:n); for(i=1;i=N;i+) for(j=1;j=P;j+) x=0; for(k=1;k0) Cij=1; else Cij=0; printf(%4d,Cij); printf(n); system(PAUSE); return 0;七、程序运行截图:i、程序启动截图:ii、程序输入截图:iii、程序运行结果截图:八、实验总结:本实验利用计算机技术,快速便捷地实现了关系的运算,极大提高了效率。实验四:编程实现拓扑

15、排序算法一、实验引言一个复杂的工程通常可以分解成一组小任务的集合,完成这些小任务意味着整个工程的完成,,任务之间具有先后关系,任务的先后顺序可用有向图表示。二、数学原理:拓扑排序 i)定义:由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 ii)实现方法: 从有向图中选择一个没有前驱的顶点并输出它。 从网中删去该顶点并删去从该顶点发出的全部有向边。 重复上述两步直到剩余的网中不存在没有前驱的顶点。三、实验原理首先对有向图,我们采取邻接表作为数据结构。且将表头指针改为头结点,其数据域存放该结点的入度,入度设为零的结点即没有前趋。在建立邻接表输入之前,表头向量的每个结点的初始

16、状态为数据域VEX(入度)为零,指针域NXET为空,每输入一条弧 建立链表的一个结点,同时令k 的入度加1,因此在输入结束时,表头的两个域分别表示顶点的入度和指向链表的第一个结点指针。在拓扑排序的过程之中,输入入度为零(即没有前趋)的顶点,同时将该顶点的直接后继的入度减1。(1)、查邻接表中入度为零的顶点,并进栈。(2)、当栈为空时,进行拓扑排序。(a)、退栈,输出栈顶元素V。(b)、在邻接表中查找Vj的直接后继Vk,将Vk的入度减一,并令入度减至零的顶点进栈。(3)、若栈空时输出的顶点数不是N个则说明有向回路,否则拓扑排序结束。为建立存放入度为零的顶点的栈,不需要另分配存储单元,即可借入入度

17、为零的数据域。一方面,入度为零的顶点序号即为表头结点的序号,另一方面,借用入度为零的数据域存放带链栈的指针域(下一个入度的顶点号)。四、实验环境:Windows 7 Ultimate DEV C+五、实验语言:C+六、程序源代码#include#include#include#include#includeusing namespace std;#define MAX 9999stackmystack;int indegreeMAX;struct node int adjvex; node* next;adjMAX;int Create(node adj,int n,int m)/邻接表建表函

18、数,n代表定点数,m代表边数 int i; node *p; for(i=0;i=n-1;i+) adji.adjvex=i; adji.next=NULL; for(i=0;i=m-1;i+) cout请输入第iuv; p=new node; p-adjvex=v; p-next=adju.next; adju.next=p; return 1;void print(int n)/邻接表打印函数 int i; node *p; for(i=0;i=n-1;i+) p=&adji; while(p!=NULL) coutadjvexnext; coutendl; void topsort(no

19、de adj,int n) int i; node *p; memset(indegree,0,sizeof(indegree); for(i=0;iadjvex+; p=p-next; for(i=0;i=n-1;i+) if(indegreei=0) mystack.push(i); int count=0; while(mystack.size()!=0) i=mystack.top(); mystack.pop(); coutinext) int k=p-adjvex; indegreek-; if(indegreek=0) mystack.push(k); coutendl; if(

20、countn)cout有回路endl;int main() int n; int m; cout拓扑排序算法endl; coutnm; Create(adj,n,m); cout输入的邻接表为:endl; print(n); cout拓扑排序结果为:endl; topsort(adj,n); system(pause); return 0;七、程序运行截图以下图为例:i、程序启动截图ii、程序输入截图 iii、程序运行结果截图八、实验总结 通过本次实验掌握拓扑排序的算法,了解拓扑排序的有向图的数据结构。参考文献1.离散数学 冯伟森、栾新成、石兵等编著 机械工业出版社2.C语言程序设计 良银、游洪跃、旭伟等编著 清华大学出版社 3.C+:面向对象程序设计 涛、游洪跃等编 高等教育出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号