离散数学实验报告()

合集下载

离散数学 实验报告

离散数学 实验报告

离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。

本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。

一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。

图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。

以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。

通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。

二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。

通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。

例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。

三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。

排列组合是密码学中常用的数学工具之一。

通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。

例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。

四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。

通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。

例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。

五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。

图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。

例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。

结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。

通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。

希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。

离散数学实验报告3

离散数学实验报告3

《离散数学》实验报告学院专业指导教师学号姓名提交日期实验三命题公式的范式一.实验目的熟悉逻辑运算否定、合取、析取、蕴含、等价规则,利用程序语言实现命题公式的真值表运算,求公式的主析取范式及主合取范式。

二.实验内容(一)用真值表法求出下列公式的主析取范式及主合取范式。

p ∧(q ↔r)(二)选课方案某学生要从A、B 、C 三门选修课中选修1~2门,根据学校的排课计划以及该生的实际情况,选择时必须满足以下条件:(1) 若选择A,则必须选择C;(2) 若选择B,则不能选择C;(3) 若不选择C,则可选择A或B。

问该生有几种选择方案。

(三)讨论公司派遣方案:派小李或小张去上海出差。

若派小李去,则小赵要加班。

若派小张去,小王也得去。

但小赵没有加班。

问公司是如何派遣的。

令p:小李去上海q:小张去上海r: 小赵加班s: 小王去上海三. 实验过程(一)求公式的主析取范式及主合取范式。

1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

(二)选课方案- 1 -1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

(三)讨论公司派遣方案:1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

- 2 -。

离散数学试验报告

离散数学试验报告

学院理学院学生姓名 xxx学号 xxxxxxxxxxx实验:编程二元关系的传递性判别,二元关系闭包方法一.前言引语:二元关系是离散数学中重要的内容。

因为事物之间总是可以根据需要确定相应的关系。

从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。

二.数学原理: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))]=12.自反闭包、对称闭包、传递闭包:设R是定义在A上的二元关系,若存在A 上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆R〞。

则称R′为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)、(s(R)和t(R))。

三.实验编程语言:c++四.实验程序源代码:#include<iostream>using namespace std;int cdx(int a[100][100],int n){int b[100][100],i,j;for(i=1;i<=n-1;i++){for(j=1;j<=n;j++){if(a[1][j]==a[i+1][j] && a[1][j]==0)b[i][j]=0;elseb[i][j]=1;}for(j=1;j<=n;j++){if(b[i][j]!=a[1][j])return 0;}}return 1;}void zfbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[i][i]=1;a[j][j]=1;}}}cout<<"自Á?反¤¡ä闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void dcbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[j][i]=1;}}}cout<<"对?称?闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void cdbb(int a[100][100],int n){int i,j,k;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){for(k=1;k<=n;k++){a[i][k]=a[i][k]+a[j][k];}}}}cout<<"传ä?递ÌY闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void main(){int i,j,n,a[100][100],sel,ins;cout<<"请?输º?入¨?二t元a关?系¦Ì矩?阵¨®维?数ºyn"<<endl;cin>>n;cout<<"请?按ã¡äa[1,1],a[1,2]...a[1,n],a[2,1]...a[n.n]的Ì?顺3序¨©输º?入¨?关?系¦Ì矩?阵¨®的Ì?元a素?值¦Ì(ꡧ0,ê?1)ê?"<<endl;for(i=1;i<=n;i++)for(j=1;j<=n;j++){cin>>a[i][j];}INDEX:cout<<"请?输º?入¨?要©a判D定¡§的Ì?性?质¨º:êo"<<endl;cout<<"1、¡é传ä?递ÌY性?"<<endl;cout<<"2、¡é自Á?反¤¡ä闭À?包㨹"<<endl;cout<<"3、¡é对?称?闭À?包㨹"<<endl;cout<<"4、¡é传ä?递ÌY闭À?包㨹"<<endl;cout<<"5、¡é退ª?出?"<<endl;cin>>sel;if(sel==1){ins=cdx(a,n);if(ins==0)cout<<"该?二t元a关?系¦Ì不?具?有®D传ä?递ÌY性?。

离散数学实验报告(两篇)

离散数学实验报告(两篇)

引言:离散数学是一门基础性的数学学科,广泛应用于计算机科学、电子信息等领域。

本文是《离散数学实验报告(二)》,通过对离散数学实验的深入研究和实践,总结了相关的理论知识和应用技巧,希望能够对读者对离散数学有更加深入的理解。

概述:本实验主要涉及离散数学中的集合、关系、图论等基本概念及其应用。

通过对离散数学的实验学习,深入掌握了这些概念和应用,对于在实际问题中的应用和拓展具有重要的意义。

正文内容:一、集合相关概念及应用1.定义:集合是由元素组成的无序的整体。

介绍了集合的基本概念、集合的表示法以及集合的运算。

2.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。

二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。

介绍了关系的基本概念、关系的表示方法及其运算。

2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。

三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。

介绍了图的基本概念、图的表示方法和图的运算。

2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。

四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。

介绍了布尔代数的基本概念、布尔表达式及其化简方法。

2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。

五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。

介绍了递归的基本原理、递归的应用技巧。

2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。

总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。

集合的应用在数据库查询、关系代数等方面起到了重要的作用。

关系的应用在图像处理、社交网络分析等领域有广泛的应用。

中南大学自动化专业离散数学实验报告2

中南大学自动化专业离散数学实验报告2

中南大学自动化专业离散数学实验报告2离散数学作为计算机科学与技术专业的基础课程之一,对于培养学生的逻辑思维和抽象思维能力具有重要意义。

本次实验是关于离散数学中的图论部份,通过实际操作和计算来理解和应用图的相关概念和算法。

实验一开始,我们首先学习了图的基本概念和术语,例如顶点、边、路径、回路等。

然后,我们学习了图的表示方法,包括邻接矩阵和邻接表。

通过实际操作,我们发现邻接矩阵适合表示稠密图,而邻接表适合表示稀疏图。

这种不同的表示方法对于图的遍历和搜索算法有着重要的影响。

接下来,我们进行了图的遍历实验。

通过深度优先搜索和广度优先搜索算法,我们可以遍历图中的所有节点,并找到特定节点之间的路径。

深度优先搜索算法通过递归的方式进行,它会首先访问一个节点的所有邻接节点,然后再递归地访问这些邻接节点的邻接节点。

广度优先搜索算法则是通过队列的方式进行,它会首先访问一个节点的所有邻接节点,然后将这些邻接节点按照访问的顺序加入队列中,再逐个出队进行访问。

通过实验,我们发现深度优先搜索算法更适适合于寻觅路径,而广度优先搜索算法更适适合于寻觅最短路径。

在实验的后半部份,我们学习了最小生成树和最短路径算法。

最小生成树算法用于找到一个连通图的最小生成树,其中包含了连接图中所有节点的最短路径。

我们学习了Prim算法和Kruskal算法,它们分别基于贪心算法和并查集来实现。

通过实验,我们发现Prim算法适适合于稠密图,而Kruskal算法适适合于稀疏图。

最短路径算法用于找到两个节点之间的最短路径,我们学习了Dijkstra算法和Floyd算法。

Dijkstra算法通过贪心策略逐步更新节点之间的最短路径,而Floyd算法则通过动态规划的方式计算所有节点之间的最短路径。

通过实验,我们发现Dijkstra算法适适合于稀疏图,而Floyd算法适适合于稠密图。

总结起来,本次实验让我们深入了解了离散数学中的图论部份,并通过实际操作和计算来应用图的相关概念和算法。

离散数学(集合的运算)实验报告

离散数学(集合的运算)实验报告

大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络111班学生姓名:张山学号:2011083123实验日期:2013年12月22日实验地点:I区实验机房实验学时:8小时实验成绩:指导教师签字:年月日老师评语:实验题目:集合的运算实验原理:1、实验内容与要求:实验内容:本实验求两个集合间的运算,给定两个集合A、B,求集合A与集合B之间的交集、并集、差集、对称差集和笛卡尔乘积。

实验要求:对于给定的集合A、B。

用C++/C语言设计一个程序(本实验采用C++),该程序能够完成两个集合间的各种运算,可根据需要选择输出某种运算结果,也可一次输出所有运算结果。

2、实验算法:实验算法分为如下几步:(1)、设计整体框架该程序采取操作、打印分离(求解和输出分开)的思想。

即先设计函数求解各部分运算并将相应结果传入数组(所求集合)中,然后根据需要打印运算结果。

(2)、建立一个集合类(Gather)类体包括的数组a、b、c、d、e、f、g分别存储集合A、B以及所求各种运算的集合。

接口(实现操作的函数)包括构造函数,菜单显示函数,求解操作函数,打印各种运算结果等函数。

(3)、设计类体中的接口构造函数:对对象进行初始化,建立集合A与集合B。

菜单显示函数:设计提示选项,给使用者操作提示。

操作函数:该函数是程序的主题部分,完成对集合的所有运算的求解过程,并将结果弹入(存入)对应数组(集合)中,用于打印。

具体操作如下:1*求交集:根据集合中交集的定义,将数组a、b中元素挨个比较,把共同元素选出来,并存入数组c(交集集合)中,即求得集合A、B的交集。

2*求并集:根据集合中并集的定义,先将数组a中元素依次存入数组g(并集集合)中,存储集合A中某元素前,先将其与已存入g中的元素依次比较,若相同则存入下一个元素,否则直接存入g中,直到所有A中元素存储完毕。

离散实验报告一

离散实验报告一

离散数学实验报告(一)一、实验目的求命题公式的真值表及其主析取范式和主合取范式二、问题分析本程序最终的目的应是求命题公式的主析取范式和主合取范式,而在有命题真值表的情况下,主析取范式和主合取范式的求解将变得十分简单。

所以,该程序的关键问题应该是求解命题公式的真值表,此后在真值表的基础上完成主析取范式和主合取范式的求解。

(一)前期分析与部分变量准备规定前提,真值表中的T/F在该程序中用布尔类型的1/0来表达。

如此,可以方便程序的编写与运算。

首先,我们要确定各个联结词的符号表达,为了方便讨论,不妨在此先令各联结词表达如下:合取(*)、析取(/)、否定(-)、单条件(%)、双条件(@)。

接着,我们就需要明确各联结词所对应符号在程序中的功能。

具体来看,合取与析取可以分别使用c++自带的&&(且)和||(或)进行布尔运算,取否定也可以直接使用!(取非)运算;而对于单条件、双条件这两个联结词来看,在c++中并无已有的运算定义,所以我们要利用函数定义的方式重新明确其含义。

而后,定义char类型数组a[]用于存储命题公式,为了方便程序的实现,我们将命题变元与联结词分开存储于char类型数组b[]和c[]中。

(二)真值表输出算法以下,我们便进入了程序的核心部分——完成真值表的计算与输出。

碍于本人c++编程知识的局限,暂时只能实现输入三个变元、无否定情况下的命题公式的真值表输出。

为了完成真值表的输出,要解决以下几个问题1. 真值表的格式与指派控制对此,我们使用三层for语句嵌套完成真值表的每一行输出。

在循环的同时,我们还需要提前定义一个布尔数组p[],以根据每一行的输出完成三个变元的指派,并将其存储于数组p[]中。

2.真值表每一行结尾的结果计算首先,我们需要定义一个布尔类型的过程存储数组x[],利用switch语句的嵌套分别判断两个联结词,使用相应的运算符(&&、||、!)和已定义的两个布尔类型函数(imp、equ),一次计算,并且将每一次的计算结果存储至x[]中,运算直至最后一步完成结果的输出。

离散数学实验报告(极大相容类)

离散数学实验报告(极大相容类)

华侨大学离散数学实验报告极大相容类姓名:吴非凡专业:计算机科学与技术班级:10级1班学号:0715112015 日期:2012/11/16实验类型:学习型实验实验要求和目的:通过本实验加深理解相容关系的极大相容类,学习并掌握用所学过的程序设计语言实现求相容关系的极大相容类的方法一.导言1) 问题的描述用二维数组存储相容关系矩阵,用课堂上所介绍的矩阵法求给定相容关系的所有极大相容类。

要求分别输入两组实验数据,输出并打印运行结果。

2) 拟采用的方法根据输入的集合元素及给定的二元相容关系,构建关系矩阵,并按照给定的关系矩阵法求得最终的极大相容类。

二.实验过程1) 算法思想流程关系矩阵法:设R为{x1,…,xn}上的相容关系,MR=[aij]nxn1) 令π={{x1},…,{xn}},若n=1,则终止;2)i:=n-1;3) A:={xj|aji=1∧i<j≤n};4) ∀Sπ∈,若S∩A∅≠,则π:=π∪{{xi}∪(S∩A};5) ∀S1,S2π∈,若S1⊆S2,则π:=π-{S1};6) 若i>1,则i:=i-1,转3),否则结束。

2) 程序流程图略3) 功能模块说明略三.结果分析1) 实验环境:VC++2) 算法设计的参数说明siri:字符串型,用来存放集合元素kiki:字符串型,用来存放给定的二元向荣关系(序偶对)n: 整型,集合元素个数siriC[][] 字符串型,存放极大相容类3) 实验结果如下图:4) 结果分析与讨论程序运行结果与手工运算结果相符5) 算法的优缺点算法简单、通俗易懂6) 实验的不足之处及改进设想输入限制较高,集合元素目前只能用阿拉伯数字,适用性差四.实验心得通过这次离散数学实验,相当于让我对过去学过的知识再学习,并且使我发现了自己的许多不足。

如对某些知识点记得不够牢,理解不够透彻等等。

同时,编写源程序的时候,我发觉由于疏于练习,许多C++的知识已经逐渐淡忘,编译过程中出现的错误都是很低级的错误,甚至于有一个小错误我竟耗费了不短的时间才找到,这又一次提醒了我身为一名程序员,必须经常动手,找找“手感”,而不能仅仅在脑中模拟,不去实践。

中南大学离散数学实验报告(实验1abc)

中南大学离散数学实验报告(实验1abc)

“离散数学”实验报告(实验1ABC)专业班级学号姓名日期:2011.12.05目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1、实验原理 (3)2、实验过程 (4)五、实验数据及结果分析 (7)A题型 (7)B、C题型 (9)六、源程序清单 (13)A题部分源代码 (13)B、C题部分源代码 (14)七、其他收获及体会 (22)一、实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

二、实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三、实验环境C或C++语言编程环境实现。

四、实验原理和实现过程(算法描述)1.实验原理(1)合取:二元命题联结词。

将两个命题P、Q联结起来,构成一个新的命题P∧Q, 读作P、Q的合取, 也可读作P与Q。

这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = T时方可P∧Q =T, 而P、Q只要有一为F则P∧Q = F。

这样看来,P∧Q可用来表示日常用语P与Q, 或P并且Q。

(2)析取:二元命题联结词。

将两个命题P、Q联结起来,构成一个新的命题P∨Q, 读作P、Q的析取, 也可读作P或Q。

这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = F, Q = F时方可P∨Q =F, 而P、Q只要有一为T则P∨Q = T。

这样看来,P∨Q可用来表示日常用语P或者Q。

(3)条件:二元命题联结词。

将两个命题P、Q联结起来,构成一个新的命题P→Q, 读作P条件Q, 也可读作如果P,那么Q。

这个新命题的真值与构成它的命题P、Q的真值间的关系为只有当两个命题变项P = T, Q = F时方可P→Q =F, 其余均为T。

(4)双条件:二元命题联结词。

离散数学实验报告(一)

离散数学实验报告(一)

一、实验内容:构造任意合式公式的真值表二、实验源码:#include <stdio.h>#include"thesis.h"int main(){Thesis a[30];char x='1';int i=0,N;cout<<"请输入命题变元(不超过30个)(输入'0'结束输入):"<<endl;while(int(x)!=48){cin>>x;if(i>19){cout<<"Error:变元个数太多!"<<endl;break;}if(x!='0'){a[i].inname(x);i++;}}N=i;int M;M=N;string A;cout<<"请输入命题公式( 否定:!,合取:&,析取:| )"<<endl;cin>>A;cout<<A<<"的真值表为:"<<endl;for(int j=0;j<M;j++)cout<<char(a[j].getvalue())<<" ";cout<<"真值"<<endl;assignment(A,N,M,&a[0]);system("pause");return 0;}#include"thesis.h"头文件#ifndef THESIS_H#define THESIS_H#include<string>#include<stdlib.h>#include<iostream>using namespace std;class Thesis //命题类{int value;char name; //value:命题的真值(0/1)name:命题名public:Thesis(){value=2;name='A';};friend Thesis operator !(Thesis &q){q.invalue(1-q.getvalue()); return q;} //重载逻辑运算符friend Thesis operator &(Thesis &p,Thesis &q){p.invalue((p.getvalue()+q.getvalue())/2); return p;}friend Thesis operator |(Thesis &p,Thesis &q){if(p.getvalue()+q.getvalue()>0) p.invalue(1);else p.invalue(0);return p;}friend Thesis operator >(Thesis &p,Thesis &q){if(p.getvalue()==1&&q.getvalue()==0)p.invalue(0);else p.invalue(1);return p;}friend Thesis operator <(Thesis &p,Thesis &q){if(p.getvalue()==q.getvalue()) p.invalue(1);else p.invalue(0);return p;}void invalue(int x){value=x;} //输入valuevoid inname(char x){name=x;} //输入nameint getvalue(){return value;} //获取真值int getname(){return name;} //获取命题名};void assignment(string A,int N,int M,Thesis a[]); //声明函数int bds(string A,int N,Thesis a[]);int run(string A,int &i,int L,int N,Thesis a[]);void assignment(string A,int N,int M,Thesis a[])//命题赋值并计算真值{for(int j=0;j<2;j++){a[N-1].invalue(j);if(N>1){assignment(A,N-1,M,&a[0]);}else{for(int i=0;i<M;i++){cout<<a[i].getvalue()<<" ";}cout<<bds(A,M,&a[0])<<endl;}}}int bds(string A,int N,Thesis a[]) //识别输入的表达式并计算真值{Thesis answer,Temp;char d[5]={'!','|','&','>','<'}; //定义运算符号集合int L;int i=0;L=strlen(&A[0]); //表达式长度while(i<L){if(A[i]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l;m++)p[m]=A[i+1+m];p[l]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));if(i==0)answer.invalue(Temp.getvalue());i=j+1;break;}}}else{if(A[i]=='!') //否定的计算{Temp.invalue(run(A,i,L,N,&a[0]));answer=!Temp;i++;continue;}else if(A[i]=='|'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer|Temp;i++;continue;}else if(A[i]=='&'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer&Temp;i++;continue;}else if(A[i]=='<'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer<Temp;i++;continue;}else if(A[i]=='>'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer>Temp;i++;continue;}else{for(int j=0;j<N;j++){if(A[i]==char(a[j].getname())){Temp.invalue(a[j].getvalue());if(i==0)answer.invalue(Temp.getvalue());i++;break;}}}}}return answer.getvalue();}int run(string A,int &i,int L,int N,Thesis a[]) {Thesis Temp;if(A[i+1]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l-1;m++)p[m]=A[i+2+m];p[l-1]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));i=i+j;break;}}}else{int j=0;while(j<L){if(A[i+1]==char(a[j].getname())){i++;Temp=a[j];break;}j++;}}return Temp.getvalue(); }#endif三、运行结果。

离散数学 实验报告

离散数学 实验报告

离散数学实验报告离散数学实验报告一、引言离散数学是一门研究离散结构及其运算规则的数学学科,它在计算机科学、信息科学、通信工程等领域具有重要的应用价值。

本实验旨在通过实际案例,探索离散数学在现实生活中的应用。

二、实验目的本实验的目的是通过离散数学的理论知识,解决一个实际问题。

我们选择了图论中的最短路径问题作为案例,以展示离散数学在网络路由、物流规划等领域的应用。

三、实验过程1.问题描述我们的实验场景是一个城市的交通网络,其中各个交叉路口被看作是图的节点,而道路则是图的边。

我们需要找到两个给定节点之间的最短路径,以便规划出行路线。

2.建模为了解决这个问题,我们需要将实际情况抽象成数学模型。

我们将交通网络表示为一个有向图,每个节点代表一个交叉路口,每条边代表一条道路。

每条边上还需要标注距离或时间等权重。

3.算法选择在离散数学中,有多种算法可以解决最短路径问题,如迪杰斯特拉算法、弗洛伊德算法等。

根据实际情况和需求,我们选择了迪杰斯特拉算法。

4.算法实现我们使用编程语言实现了迪杰斯特拉算法,并将其应用于我们的交通网络模型。

算法的核心思想是通过不断更新节点之间的最短距离,逐步找到最短路径。

5.实验结果经过实验,我们成功找到了两个给定节点之间的最短路径,并计算出了最短距离。

这对于规划出行路线具有重要意义,可以帮助人们节省时间和资源。

四、实验总结通过这个实验,我们深入理解了离散数学在实际问题中的应用。

离散数学的概念和算法不仅仅是理论上的抽象,它们可以帮助我们解决现实生活中的复杂问题。

离散数学的应用远不止于此,它还可以用于密码学、数据压缩、人工智能等领域。

通过学习离散数学,我们能够培养出良好的抽象思维和问题解决能力,为未来的科学研究和工程实践打下坚实的基础。

总之,离散数学是一门具有广泛应用前景的学科,通过实验,我们对其应用领域有了更深入的了解。

希望未来能有更多的人关注和研究离散数学,为推动科学技术的发展做出贡献。

离散数学实验报(2)

离散数学实验报(2)

离散数学实验报告(2)实验名称:Wharshell算法姓名:卢松指导老师:冯伟森年级:11级2班学号:1143041172学院:计算机一、功能给定n个结点的图G的邻接矩阵A,求G的道路矩阵P。

二、算法(1)将图G的邻接矩阵送入P(n,n)中。

1→i(1)1→j。

(2)对于k=1,2,…,n,作P jkν(P jiΛP ik)→P jk。

(3)j+1→j,若j≤n,则转(4)。

(4)i+1→I,若i≤n,则转(3)。

三、源程序#include<stdio.h>#define N 4main(){int i,j,k;int p[N][N];printf("道路矩阵的warshell算法:\n");for(i=0;i<N;i++){for(j=0;j<N;j++){scanf("%d",&p[i][j]);}printf("\n");}printf("您输入的矩阵为:\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%8d",p[i][j]);}printf("\n");}for(i=0;i<N;i++)for(j=0;j<N;j++)for(k=0;k<N;k++)if(p[j][i]*p[i][j]==1)p[j][i]=1; printf("道路矩阵为:\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%8d",p[i][j]);}printf("\n");}}结果:四、实验总结此次实验可以的算是成功的,但是由于自己的疏忽导致在输入数据时出现了一些问题,但是经历过多次调试后最终出现正确的结果,感觉到要注意细节,注重实际操作才能真的做到游刃有余。

离散数学实验报告

离散数学实验报告

离散数学实验报告离散数学实验报告一、引言离散数学是现代数学的一个重要分支,它研究离散的数学结构和离散的数学对象。

本实验报告将介绍我对离散数学的学习和实践的一些心得体会。

二、集合论集合论是离散数学的基础,它研究集合及其运算。

在实验中,我学习了集合的表示方法和运算规则。

集合的表示方法有枚举法、描述法和图示法等。

集合的运算包括并、交、差和补等。

通过实践操作,我深刻理解了集合的概念和运算规则。

三、逻辑与命题逻辑是离散数学的另一个重要内容,它研究推理和思维的规律。

在实验中,我学习了逻辑的基本概念和符号表示法。

逻辑中的命题是逻辑推理的基本单位,它可以是真或假。

通过实践操作,我能够正确地分析和判断命题的真值,并进行逻辑推理。

四、关系与函数关系与函数是离散数学中的重要内容,它们描述了元素之间的联系。

在实验中,我学习了关系的定义和性质,包括自反性、对称性和传递性等。

函数是一种特殊的关系,它将一个集合的元素映射到另一个集合。

通过实践操作,我能够正确地定义和分析关系与函数。

五、图论图论是离散数学中的重要分支,它研究图及其性质。

在实验中,我学习了图的基本概念和表示方法。

图由顶点和边组成,可以分为有向图和无向图。

通过实践操作,我能够正确地定义和分析图的性质,如度、路径和连通性等。

六、组合数学组合数学是离散数学的另一个重要分支,它研究离散对象的组合和排列。

在实验中,我学习了组合数学的基本原理和方法。

组合数学中的排列和组合是常见的计数问题,通过实践操作,我能够正确地计算排列和组合的数量。

七、实践应用离散数学在计算机科学、通信工程和运筹学等领域有着广泛的应用。

在实验中,我了解了离散数学在实际问题中的应用。

例如,图论可以用于网络路由算法的设计,组合数学可以用于密码学中的加密算法设计。

通过实践操作,我能够将离散数学的知识应用到实际问题中,提高问题的解决效率。

八、总结通过本次离散数学实验,我深入了解了离散数学的基本概念和方法,并通过实践操作加深了对离散数学的理解。

中南大学离散数学实验报告(实验2ac)

中南大学离散数学实验报告(实验2ac)

“离散数学”实验报告(实验2AC)专业班级学号姓名日期:目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现进程(算法描述) (3)A题型 (3)C题型 (4)五、实验数据及结果分析 (7)A题型 (7)B题型 (9)六、源程序清单 (11)A题型 (11)B题型 (12)七、其他收成及体会 (18)一、实验目的把握关系的概念与性质,大体的关系运算,关系的各类闭包的求法。

明白得等价类的概念,把握等价类的求解方式。

二、实验内容1. 求有限集上给定关系的自反、对称和传递闭包。

(有两种求解方式,只做一种为A,两种都做为B)2. 求有限集上等价关系的数量。

(有两种求解方式,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。

(C)三、实验环境C或C++语言编程环境实现。

四、实验原理和实现进程(算法描述)A题型求有限集上等价关系的数量。

集合上的等价关系与该集合的划分之间存在一一对应关系。

一个等价关系对应一个划分,一个划分也对应一个等价关系。

咱们把n个元素的集合划分成k 块的方式数叫第二类Stirling数,表示为S(n,k)。

给定S(n,n) = S(n,1) = 1,有递归关系:S(n,k) = S(n − 1,k − 1) + kS(n − 1,k)集合上所有等价类的个数即为k从1到n,所有S(n,k)之和。

那个问题的算法比较简单,仅需两步就可完成,第一依照上式,概念一个递归函数S(n,k),然后对k从1到n,求取sum=∑S(n,k),sum的值确实是给定n元集合上的等价关系数量,最后将其输出即可。

A题型的流程图如下所示:C题型求解商集,输入集合和等价关系,求相应的商集商集即等价类组成的集合,要求商集,第一需要判定输入的关系是不是为等价关系,不然没有商集。

判定输入的关系是不是为等价关系的算法如下:(1)将输入的关系转换为关系矩阵,那个地址概念了一个函数translate(),转换的方式为:依次查找输入的关系中的二元组的两个元素在集合中的位置,例如<a,b>,假设a在集合A中的位置为i,b在集合A中的位置为j,就令寄存关系矩阵的二维数组M[i][j]=1,如此就将输入的关系R转换为关系矩阵的形式。

中南大学离散数学实验报告(实验3ABC)

中南大学离散数学实验报告(实验3ABC)

“离散数学”实验报告(实验3ABC)专业班级学号姓名日期: 2011.12.19目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1实验原理 (3)2实验过程 (5)五、实验数据及结果分析 (6)六、源程序清单 (10)七、其他收获及体会 (16)一、实验目的理解图论的基本概念, 图的矩阵表示, 图的连通性, 图的遍历, 以及求图的连通支方法。

二、实验内容以偶对的形式输入一个无向简单图的边, 建立该图的邻接矩阵, 判断图是否连通(A)。

并计算任意两个结点间的距离(B)。

对不连通的图输出其各个连通支(C)。

三、实验环境C或C++语言编程环境实现。

四、实验原理和实现过程(算法描述)1.实验原理(1)建立图的邻接矩阵, 判断图是否连通根据图的矩阵表示法建立邻接矩阵A, 并利用矩阵的乘法和加法求出可达矩阵, 从而判断图的连通性。

连通图的定义: 在一个无向图G 中, 若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径), 则称vi和vj是连通的。

如果G 是有向图, 那么连接vi 和vj的路径中所有的边都必须同向。

如果图中任意两点都是连通的, 那么图被称作连通图。

判断连通图的实现:在图中, 从任意点出发在剩余的点中, 找到所有相邻点循环, 直到没有点可以加入为止, 如果有剩余的点就是不连通的, 否则就是连通的。

或者也可用WallShell算法, 由图的邻接矩阵判断图是否连通。

(2)计算任意两个结点间的距离图中两点i, j间的距离通过检验Al中使得aij为1的最小的l值求出。

路径P中所含边的条数称为路径P的长度。

在图G<V,E>中, 从结点Vi到Vj最短路径的长度叫从Vi到Vj的距离, 记为d<Vi, Vj>。

设图的邻接矩阵是A, 则所对应的aij的值表示, 点Vi到点Vj距离为n的路径有aij条。

若aij(1), aij(2), …, aij(n-1), 中至少有一个不为0, 则可断定Vi与Vj可达, 使aij(l)≠0的最小的l即为d(Vi, Vj)。

  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<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 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 <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以上计算传递闭包时需要按照复合关系定义求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 <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 ,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<stdio.h>#define N 4void 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;elset[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语句找出可达矩阵。

相关文档
最新文档