《离散数学》课程设计学院计算机学院学生姓名学号指导教师评阅意见提交日期 2011 年 11 月 25 日引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。
它是研究离散量(如整数、有理数、有限字母表等)的数学结构、性质及关系的学问。
它一方面充分地描述了计算机科学离散性的特点,为学生进一步学习算法与数据结构、程序设计语言、操作系统、编译原理、电路设计、软件工程与方法学、数据库与信息检索系统、人工智能、网络、计算机图形学等专业课打好数学基础;另一方面,通过学习离散数学课程,学生在获得离散问题建模、离散数学理论、计算机求解方法和技术知识的同时,还可以培养和提高抽象思维能力和严密的逻辑推理能力,为今后爱念族皮及用计算机处理大量的日常事务和科研项目、从事计算机科学和应用打下坚实基础。
特别是对于那些从事计算机科学与理论研究的高层次计算机人员来说,离散数学更是必不可少的基础理论工具。
实验一、编程判断一个二元关系的性质(是否具有自反性、反自反性、对称性、反对称性和传递性)一、前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二、数学原理:自反、对称、传递关系设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R 就是A×B的一个合于R={(x,y)∈A×B|xRy}的子集合设R是集合A上的二元关系:自反关系:对任意的x∈A,都满足<x,x>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的⇔(∀x)((x∈A)→(<x,x>∈R))=1对称关系:对任意的x,y∈A,如果<x,y>∈R,那么<y,x>∈R,则称关系R是对称的,或称R具有对称性,即R在A上是对称的⇔ (∀x)(∀y)((x∈A)∧(y∈A)∧(<x,y>∈R)→(<y,x>∈R))=1传递关系:对任意的x,y,z∈A,如果<x,y>∈R且<y,z>∈R,那么<x,z>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x∈A)∧(y∈A)∧(z∈A)∧((<x,y>∈R)∧(<y,z>∈R)→(<x,z>∈R))]=1三、实验原理:通过二元关系与关系矩阵的联系,可以引入N维数组,以数组的运算来实现二元关系的判断。
图示:四、实验环境:Windows 7 Ultimate DEV C++五、实验语言:C 语言六、程序源代码:#include"stdio.h"#define N 4main(){int i,j,k;int f,e,z;int M[N][N];printf("判断R是否为自反关系、对称关系、是否可传递?\n"); printf("请输入一个4*4的矩阵。
\n");for(i=0;i<N;i++)/*输入一个4*4的矩阵*/for(j=0;j<N;j++)scanf("%d",&M[i][j]);for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",M[i][j]);printf("\n");}for(i=0;i<N;i++){if(M[i][i]==1)//判断自反性{if(i=N-1e=0;else;else if(M[i][i]==0)//判断反自反性{if(i=N-1)e=1;else;}else{e=2;break;}}for(i=0;i<N;i++){for(j=0;j<N;j++)if(M[i][j]!=M[j][i])//判断对称性{f=1;break;}}for(i=0;i<N;i++){for(j=0;j<N;j++)if(M[i][j]==1)//判断反对称性{if(M[j][i]==0){if(i==(N-1)&&j==N-1)f=0;elsebreak;}}if(f!=0&&f!=1){f=2;}for(i=0;i<N;i++)//判断可传递性for(j=0;j<N;j++)if(M[i][j]==1)continue;elsefor(k=0;k<N;k++)if(M[i][k]*M[k][i]==0)continue;elsez=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");else if(f==1)printf("关系R不是对称关系\n");else if(f==2)printf("关系R是对称关系\n");if(z==0)printf("关系R是不可传递关系\n");elseprintf("关系R是可传递关系\n");system("PAUSE");}七、程序运行截图:i、程序启动截图:ii、程序输入截图:iii、程序运行结果截图:八、实验总结:实验简洁高效地判断二元关系的性质。
实验二、编程求一个二元关系的自反闭包、对称闭包、传递闭包一、前言引语一个二元关系可能具有某种性质,也可能不具有这种性质。
现在讨论怎样使一个二元关系变成具有指定性质的新关系,并且还要满足最小性条件。
二、数学原理自反闭包、对称闭包、传递闭包设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的所在行的结点),再将这些结点所在行同该结点所在行进行逻辑加后作为这些结点所在的新行(添加新的有向边)(反映了如果这些结点没有到其它结点的有向边,但有到该结点的有向边,再通过该结点间接到达其它结点,根据传递闭包的定义,这些结点就必然有一条有向边到达其它结点)。
▪设R是集合上的二元关系,Mr是R的关系矩阵▪(1)置新矩阵A:=Mr▪(2)置(列) j:=1▪(3) 对所有的i(1≤i≤n)如A(i,j)=1,则对k=1,2,…,nA(i,k):=A(i,k) A(j,k)▪(即将A的第i行与A的第j行进行逻辑加后送回A的第i行) ▪(4)j:=j+1▪(5)如j≤n转(3),否则停止。
四、实验环境:Windows 7 Ultimate DEV C++五、实验编程语言:C语言六、实验程序源代码//source file:War.cpp#include<stdio.h>void War(int m,int n){int i,j,k;设置临时变量int a = 0, b = 0;设置临时变量int arr[10][10];for(a = 0; a < m; ++a){printf("请输入矩阵第%d行元素:",a);for(b = 0; b < n; ++b){scanf("%d",&arr[a][b]);}printf("\n");}for(i = 0; i < m; i++){for( j= 0; j < m; j++){if(arr[j][i] == 1){for(k = 0;k < n; k++){arr[j][k]=arr[i][k] || arr[j][k];}}}}printf("所得的可传递闭包关系矩阵是:\n");for(i = 0;i < m; ++i){for(j = 0;j < n; ++j){printf("%d ",arr[i][j]);}printf("\n");}}//file:test.cpp#include<stdio.h>void 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.得出结果,并打印在屏幕上。
八、实验总结如果当一个集合的元素的个数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的复合关系。
三、实验原理:矩阵的运算四、实验环境:Windows 7 Ultimate DEV C++五、实验语言:C语言六、实验程序源代码#include"stdio.h"#include"string.h"#define M 3#define N 3#define P 3main(){int i,j,k,x;char p;int A[N][M],B[M][P],C[N][P];printf("关系的复合运算\n");printf(“请输入一个3*3的矩阵”); printf("A:\n");for(i=1;i<=N;i++){for(j=1;j<=M;j++)scanf("%4d",&A[i][j]);printf("\n");}printf(“请输入一个3*3的矩阵”); printf("B:\n");for(i=1;i<=M;i++){for(j=1;j<=P;j++)scanf("%4d",&B[i][j]);printf("\n");}printf("经过复合运算后得到C:\n"); for(i=1;i<=N;i++){for(j=1;j<=P;j++){x=0;for(k=1;k<=M;k++)x=x+A[i][k]*B[k][j];if(x>0)C[i][j]=1;elseC[i][j]=0;printf("%4d",C[i][j]);}printf("\n");}system("PAUSE");return 0;}七、程序运行截图:i、程序启动截图:ii、程序输入截图:iii、程序运行结果截图:八、实验总结:本实验利用计算机技术,快速便捷地实现了关系的运算,极大提高了效率。