离散实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“离散数学”实验报告
专业:计算机嵌入式
班级代号:10455341
学号: 1045534125
姓名:孟腾腾
指导老师:闫仁武
日期:2011/11/15
目录
一.实验目的 (2)
二.实验内容 (2)
三.实验环境 (3)
四. 实验原理和实现过程(算法描述) (3)
1.实验原理 (3)
2.实验过程 (4)
五.实验数据及结果分析 (8)
六. 其他收获和体会 (10)
一.实验目的;
本实验课程是信息专业学生的一门专业基础课程,通过实验,帮助学生更好
地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
熟悉掌握自反、对称和传递闭包及等价关系
二、实验内容
求有限集上给定关系的自反、对称和传递闭包及是否等价。
三、实验环境
使用visual C++6.0为编程软件,采用C++为编程语言实现。
四、设计思路
(1)、在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只
要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵,并将相加后大于1的元素值设置为1就可得到;传递闭包则有两种算法:
1、自反闭包计算方法:
设R是集合X上的二元关系,则
r(R)=R U x I (恒等关系)
简要代码如下:
for (i=0;i { t.A[i]=A[i]; for (j=0;j { t.R[i][j]=R[i][j]; if (i==j)t.R[i][j]=1; }; 2、对称闭包计算方法: 设R 是集合X 上的二元关系,则 s(R)=R U c R 代码思路: for (i=0;i { t.A[i]=A[i]; for (j=i;j { if (R[i][j]==1)t.R[i][j]=t.R[j][i]=1; else { if (R[j][i]==1)t.R[i][j]=t.R[j][i]=1; else t.R[i][j]=t.R[j][i]=0; }; }; }; 3、传递闭包的计算方法如下: 算法1:直接根据 n i i R R t 1)(==计算,过程略 算法2:Warshall 算法(1962) 设R 的关系矩阵为M (1)令矩阵A=M (2)置i=1 (3)对所有的j ,若A[j ,i]=1,则 对于 k=1,2,…,n ,令A[j ,k]=A[j ,k]+A[i ,k] (4) i=i+l . (5)若i ≤n ,则转到(3),否则结束. 开始 声明各子函数 输入集合及关系矩阵 判断某元素和序关系是否属于某集合 调用自反函数 调用对称算法函数 调用传递算法1函数 判断关系矩阵是否等价 结束 4、等价关系 同时具有自反对称传递关系的关系矩阵为等价关系。 5、判断二元关系关系矩阵是否是自反对称传递关系的 代码实现如下: Relation::Reflexive() { for ( i=0;i if (!R[i][i])return (0); return (1); }; Relation::Symmetric() { int i,j,K=Len-1; for (i=0;i for (j=i+1;j if (R[i][j]!=R[j][i])return (0); return (1); }; Relation::Transitive() { Relation t; t=C_t(1); for ( i=0;i for (t j=0;j if (R[i][j]!=t.R[i][j])return (0); return (1); }; 流程图: 四、程序清单 // Relation.cpp : Defines the entry point for the console application. // #include"iostream.h" int const Max=20; class Relation { protected: int Len,A[Max],R[Max][Max]; int Index(int x); public: Relation(){Len=0;}; Relation(int *p,int Q[Max][Max],int n); int IsofA(int x); int IsofR(int x,int y); Relation UnionA(Relation R1); Relation CrossR(Relation R1); Relation C_r(); Relation C_s(); Relation C_t(); Relation C_t(int); int Reflexive(); int Symmetric(); int Transitive(); int Equivalent_Relations(); void PrintA(); void PrintR(); }; int Relation::Index(int x) { int i; for(i=0;i if(A[i]==x)return(i); return(-1); }; Relation::Relation(int *p,int Q[Max][Max],int n) { int i,j; for(i=0;i { A[i]=p[i];