离散数学计算机实验报告
- 格式:doc
- 大小:76.50 KB
- 文档页数:16
离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。
四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。
通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。
例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。
五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。
图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。
例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。
结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。
通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。
希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。
离散数学上机实验报告《离散数学》实验报告姓名:学号:班级:实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。
要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
三.实验环境使用Microsoft Visual C++6.0为编程软件,采用称C/C++语言为编程语言实现。
四.实验过程1.算法分析:合取:p,q都为1的时候为1,其他为0析取:p,q都为0的时候为0,其他为1蕴含:p为1,q为0时为0,其他为1等价:p,q同真同假2.程序代码:#include<stdio.h>int main()int P,Q,a,b,c,d,p,q;printf(" P的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++)printf("\t%d",P);}printf("\n Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++)printf("\t%d",Q);}printf("\n 非P的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==0)/*判断非P的值*/ p=1;elseprintf("\t%d",p);}}printf("\n 非Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==1)/*判断非Q的值*/q=0;elseq=1;printf("\t%d",q);}}printf("\n P与Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==0||P==0)/*判断P与Q的值*/elsea=1;printf("\t%d",a);}}printf("\n P或Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==1||P==1)/*判断P或Q的值*/ b=1;elseb=0;printf("\t%d",b);}}printf("\nP蕴含Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==1&&Q==0)/*判断P蕴含Q的值*/ c=0;elsec=1;printf("\t%d",c);}}printf("\nP等价Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==Q)/*判断P等价Q的值*/d=1;elsed=0;printf("\t%d",d);}}printf("\n");return 0;3.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
引言:离散数学是一门基础性的数学学科,广泛应用于计算机科学、电子信息等领域。
本文是《离散数学实验报告(二)》,通过对离散数学实验的深入研究和实践,总结了相关的理论知识和应用技巧,希望能够对读者对离散数学有更加深入的理解。
概述:本实验主要涉及离散数学中的集合、关系、图论等基本概念及其应用。
通过对离散数学的实验学习,深入掌握了这些概念和应用,对于在实际问题中的应用和拓展具有重要的意义。
正文内容:一、集合相关概念及应用1.定义:集合是由元素组成的无序的整体。
介绍了集合的基本概念、集合的表示法以及集合的运算。
2.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。
二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。
介绍了关系的基本概念、关系的表示方法及其运算。
2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。
三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。
介绍了图的基本概念、图的表示方法和图的运算。
2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。
四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。
介绍了布尔代数的基本概念、布尔表达式及其化简方法。
2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。
五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。
介绍了递归的基本原理、递归的应用技巧。
2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。
总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。
集合的应用在数据库查询、关系代数等方面起到了重要的作用。
关系的应用在图像处理、社交网络分析等领域有广泛的应用。
中南大学自动化专业离散数学实验报告2离散数学作为计算机科学与技术专业的基础课程之一,对于培养学生的逻辑思维和抽象思维能力具有重要意义。
本次实验是关于离散数学中的图论部分,通过实际操作和计算来理解和应用图的相关概念和算法。
实验一开始,我们首先学习了图的基本概念和术语,例如顶点、边、路径、回路等。
然后,我们学习了图的表示方法,包括邻接矩阵和邻接表。
通过实际操作,我们发现邻接矩阵适合表示稠密图,而邻接表适合表示稀疏图。
这种不同的表示方法对于图的遍历和搜索算法有着重要的影响。
接下来,我们进行了图的遍历实验。
通过深度优先搜索和广度优先搜索算法,我们可以遍历图中的所有节点,并找到特定节点之间的路径。
深度优先搜索算法通过递归的方式进行,它会首先访问一个节点的所有邻接节点,然后再递归地访问这些邻接节点的邻接节点。
广度优先搜索算法则是通过队列的方式进行,它会首先访问一个节点的所有邻接节点,然后将这些邻接节点按照访问的顺序加入队列中,再逐个出队进行访问。
通过实验,我们发现深度优先搜索算法更适合用于寻找路径,而广度优先搜索算法更适合用于寻找最短路径。
在实验的后半部分,我们学习了最小生成树和最短路径算法。
最小生成树算法用于找到一个连通图的最小生成树,其中包含了连接图中所有节点的最短路径。
我们学习了Prim算法和Kruskal算法,它们分别基于贪心算法和并查集来实现。
通过实验,我们发现Prim算法适合用于稠密图,而Kruskal算法适合用于稀疏图。
最短路径算法用于找到两个节点之间的最短路径,我们学习了Dijkstra算法和Floyd算法。
Dijkstra算法通过贪心策略逐步更新节点之间的最短路径,而Floyd算法则通过动态规划的方式计算所有节点之间的最短路径。
通过实验,我们发现Dijkstra算法适合用于稀疏图,而Floyd算法适合用于稠密图。
总结起来,本次实验让我们深入了解了离散数学中的图论部分,并通过实际操作和计算来应用图的相关概念和算法。
【实验目的】通过编程实现求给定集合A和B的并集C(C=A∪B)的运算。
【实验内容】已知所给集合A和B,求A与B 的并集C(C=A∪B)。
【实验原理】因为并集的定义为:C={x|x∈A∨x∈B},所以,只要将集合A与B合在一起就得到了并集C。
但是,在一个集合中,同样的元素没必要出现两次或两次以上,所以,在将集合A送入并集C后,应将集合B中与A中相同的元素删除,再将集合B送入并集C之中。
【程序代码】#include<stdio.h>int main(){int a[101],b[101],c[201]={0};int m,n;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=1;i<=m;i++)c[i]=a[i];int i=m+1;int k;for(int j=1;j<=n;j++){int t=1;for(k=1;k<=m;k++){if(a[k]==b[j])t=0;}if(t==1){c[i]=b[j];i++;}}for(int i=1;i<=m+n;i++){if(c[i]!=0)printf("%d ",c[i]);}}【实验结果】【实验心得】首先想到的是数组,先将数组a[],赋值给c[],然后通过两层for循环来判断b[],是否与a[]重复,如若不重复,将b[]赋值给c[]。
在开始的时候由于for循环套错位置出错,后设置一flag来判断b[]和a[]是否有重复的元素。
离散数学实验报告一、实验目的离散数学是现代数学的一个重要分支,它在计算机科学、信息科学、人工智能等领域有着广泛的应用。
本次离散数学实验的目的在于通过实际操作和编程实现,深入理解离散数学中的基本概念、原理和算法,提高解决实际问题的能力,培养逻辑思维和创新能力。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,还使用了一些相关的数学库和工具,如 sympy 库用于符号计算。
三、实验内容1、集合运算集合是离散数学中的基本概念之一。
在实验中,我们首先定义了两个集合 A 和 B,然后进行了并集、交集、差集等运算。
通过编程实现这些运算,加深了对集合运算定义和性质的理解。
```pythonA ={1, 2, 3, 4, 5}B ={4, 5, 6, 7, 8}并集union_set = Aunion(B)print("并集:", union_set)交集intersection_set = Aintersection(B)print("交集:", intersection_set)差集difference_set = Adifference(B)print("A 与 B 的差集:", difference_set)```2、关系的表示与性质判断关系是离散数学中的另一个重要概念。
我们使用矩阵来表示关系,并通过编程判断关系的自反性、对称性和传递性。
```pythonimport numpy as np定义关系矩阵relation_matrix = nparray(1, 0, 1, 0, 1, 0, 1, 0, 1)判断自反性is_reflexive = all(relation_matrixii == 1 for i inrange(len(relation_matrix)))print("自反性:", is_reflexive)判断对称性is_symmetric = all(relation_matrixij == relation_matrixji for i in range(len(relation_matrix)) for j in range(len(relation_matrix)))print("对称性:", is_symmetric)判断传递性is_transitive = Truefor i in range(len(relation_matrix)):for j in range(len(relation_matrix)):for k in range(len(relation_matrix)):if relation_matrixij == 1 and relation_matrixjk == 1 and relation_matrixik == 0:is_transitive = Falsebreakprint("传递性:", is_transitive)```3、图的遍历图是离散数学中的重要结构。
大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络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中元素存储完毕。
离散数学实验实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q 的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
#include#includeint main(){int p,q,hequ,xiqu,yunhan,dengjia;printf("请输入命题P和Q的真值(0或1)");scanf("%d%d",&p,&q);if(p!=0&&p!=1||q!=0&&q!=1)printf("输入错误");else{if(p==0&&q==0){hequ=0;xiqu=0;yunhan=1;dengjia=1;}else if(p==0&&q==1){hequ=0;xiqu=1;yunhan=1;dengjia=0;}else if(p==1&&q==0){hequ=0;xiqu=1;yunhan=0;dengjia=0;}else if(p==1&&q==1){hequ=1;xiqu=1;yunhan=1;dengjia=1;}printf("合取的真值为:%d\n",hequ);printf("析取的真值为:%d\n",xiqu);printf("蕴含的真值为:%d\n",yunhan);printf("等价的真值为:%d\n",dengjia);system("pause");return 0;}}实验二两个集合运算(交、并、补)一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。
华侨大学离散数学实验报告极大相容类姓名:吴非凡专业:计算机科学与技术班级: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++的知识已经逐渐淡忘,编译过程中出现的错误都是很低级的错误,甚至于有一个小错误我竟耗费了不短的时间才找到,这又一次提醒了我身为一名程序员,必须经常动手,找找“手感”,而不能仅仅在脑中模拟,不去实践。
一、实验内容:构造任意合式公式的真值表二、实验源码:#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三、运行结果。
离散数学上机实验报告离散数学实验报告:建
立关系矩阵实验
__大学离散数学实验报告建立关系矩阵实验姓名:____
专业:
软件工程班级:
3 学号:
1325116025 日期:
20__.10月7日 1、摘要:建立关系矩阵实验的目的是理解并掌握关系的矩阵表示方法、为用序偶集合表示的关系建立相应的关系矩阵。
学会用所学过的程序设计语言编程,解决关系矩阵的自动建立问题。
实验的内容是用二维数组或向量存储关系矩阵,根据输入的用序偶集合表示的关系,建立相应的关系矩阵。
用建立二维数组的方法构造关系矩阵。
分别输入两个用序偶集合表示的关系作为实验数据,然后建立两个数组之间的关系,得到一个关系矩阵。
关系矩阵一开始初始化为0,建立成功的关系体现为1。
最后得到一个完整的矩阵。
一.导言 2、 1) 问题的描述。
实验的目标是如何为用序偶集合表示的关系建立相应的关系矩阵,解决关系矩阵的自动建立问题。
2) 拟采用的方法用建立二维数组的方法来解决建立关系矩阵。
首先建立两个数组分别代表行和列,然后建立一个新的二维数组,将其初始化为零,集合之间的关系对应真值表,所以在这个二维数组中两个集合的关系就被表示为1,然后就相应地建立了两个集合的关系矩阵。
二.实验过程 1) 算法思想流程 1.申请两个字符型数组用来储存集合元素。
2.建立二维数组然后初始化为0.
3.判断关系是否存在,存在则赋值为1。
4输入数值然后输出关系矩阵。
2)程序流程图开始 P=0 switch P=0
P=’a’&&j=’a’&&j=’a’||j。
离散数学闭包实验报告专业12计算机科学与技术学号12407127姓名周谦益时间2011—11--15一、实验目的1.通过上机程序,进一步加深对关系中自反闭包,对称闭包,传递闭包的理解。
2.掌握Warshall算法。
3.学会用程序解决离散数学中的问题。
4.增强我们编写程序的能力。
二、实验内容求有限集上给定关系的自反、对称和传递闭包(用Warshall算法)。
三、实验环境我的实验是在Vs2008实验环境下完成的,而所设计的程序也在这个环境下通过了编译,运行和测试。
四、实验原理和实现过程设计思路在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则只需要将矩阵中数值为1的元素关于主对角线对称的元素数值也设为1就可以了;而对于传递闭包,用Warshall算法可以很方便的计算出来。
下面我就来具体分析一下每一种闭包运算的设计。
自反闭包的设计:我们只要把关系矩阵的对角线的元素全赋值为1就可以啦。
具体程序如下:求自反闭包的程序:int Relation::Reflexive()//求自反闭包的函数{for(int i=0;i<Len;i++)if(!R[i][i])return(0);return(1);};对称闭包的求法:对于对称闭包,我们只只需要将矩阵中数值为1的元素的对称位置的元素数值也设为1就可以了。
具体程序如下:对称闭包:int Relation::Symmetric()//对称闭包的函数{int i,j,K=Len-1;for(i=0;i<K;i++)for(j=i+1;j<Len;j++)if(R[i][j]!=R[j][i])return(0);return(1);};传递闭包设计:传递闭包我主要用Warshall算法来求。
书上的Walshall算法的伪代码如下:设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),否则结束根据Warshall算法,我设计求出了关系的传递闭包,具体程序如下:int Relation::Transitive()//传递闭包函数{Relation t;t=C_t(1);for(int i=0;i<Len;i++)for(int j=0;j<Len;j++)if(R[i][j]!=t.R[i][j])return(0);return(1);};把上面的每个子函数串在一起,再加上主函数,就可以实现这次实验的要求。
“离散数学”实验报告(实验1)专业班级学号姓名目录一.实验目的; ....................................... - 1 -二.实验内容; ....................................... - 2 -1. 逻辑联接词的运算 ..................................................................................................... - 2 -2. 求任意一个命题公式的真值表 ................................................................................. - 2 -三.实验环境; ....................................... - 2 -四. 实验原理和实现进程(算法描述);................. - 2 -1.实验原理 ....................................................................................................................... - 2 -2.实验进程 ....................................................................................................................... - 3 -五.实验数据及结果分析;.............................. - 7 -题A:................................................................................................................................ - 7 - B,C题:............................................................................................................................ - 9 - 六. 源程序清单; ................................... - 13 -A题部份源代码: .......................................................................................................... - 13 - tt:printf("***************************************\n");其他收成和体会。
离散数学实验报告专业班级:12级计算机本部一班姓名:鲍佳珍学号:201212201401016 实验成绩:1.【实验题目】命题逻辑实验四2.【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。
3.【实验内容】编程实现集合的交、并、差和补运算。
4、【实验要求】C或C++语言编程实现5.【算法描述】(1)用数组A,B,C,E表示集合。
假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。
C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。
将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。
C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。
C语言算法:for (j=0;j<m;j++){ for (i=0;i<n;i++){ if (A[j]= =B[i]){ C[k]=A[j];k++;break; }if (j= =n){ C[k]=A[i];k++; } }(5)集合的补运算:~A=B-A={x|x∈B且x∉A}将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
离散实验报告实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
2、实验内容与要求定义1 设P表示一个命题,由命题联结词┐和命题P连接成┐P,称┐P为P的否定式复合命题,┐P读“非P”。
称┐为否定联结词。
┐P是真,当且仅当P为假;┐P是假,当且仅当P为真。
定义2 设P和Q为两个命题,由命题联结词∧将P和Q连接成P∧Q,称P∧Q为命题P和Q的合取式复合命题,P∧Q读做“P与Q”,或“P且Q”。
称∧为合取联结词。
当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
定义3 设P和Q为两个命题,由命题联结词∨把P和Q连接成P∨Q,称P∨Q为命题P和Q的析取式复合命题,P∨Q读做“P或Q”。
称∨为析取联结词。
当且仅当P和Q的真值同为假,P∨Q的真值为假;否则,P∨Q的真值为真。
定义4 设P和Q为两个命题,由命题联结词→把P和Q连接成P→Q,称P→Q为命题P和Q的条件式复合命题,简称条件命题。
P→Q读做“P条件Q”或者“若P则Q”。
称→为条件联结词。
当P的真值为真而Q的真值为假时,命题P→Q的真值为假;否则,P→Q 的真值为真。
定义5 令P、Q是两个命题,由命题联结词↔把P和Q连接成P ↔ Q,称P ↔ Q为命题P和Q的双条件式复合命题,简称双条件命题,P ↔Q读做“P当且仅当Q”,或“P等价Q”。
称↔为双条件联结词。
当P和Q的真值相同时,P ↔ Q的真值为真;否则,P ↔ Q 的真值为假。
本实验要求从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
3、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
源代码:#include <iostream.h>void main(){int p,q;cout<<"请分别输入P,Q的真值:";cin>>p>>q;if(p>1||p<0){cout<<"P的真值有误,请重新输入!"<<endl;}if(q>1||q<0){cout<<"Q的真值有误,请重新输入!"<<endl;}if(p==0&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=0"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}if(p==0&&q==1){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=0"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==1){cout<<"P∧Q=1"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}}运行结果:请分别输入P,Q的真值:0 1P∧Q=0P∨Q=1P→Q=1P<->Q=0Press any key to continue实验二关系闭包计算1、实验目的熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
2、实验内容与要求定义6 设R是A上的二元关系,R的自反(对称、传递)闭包是关系R1,则①R1是自反的(对称的、传递的)②R⊆R1③对任何自反的(对称的、传递的)关系R2,若R⊆R2,则R1⊆R2。
R的自反、对称和传递闭包分别记为r(R)、s(R)和t(R)。
定理1 令R⊆A⨯A,则①r(R)=R∪IA②s(R)=R∪R-1③t(R)=R∪R2∪R3…Warshall算法:设R是n个元素集合上的二元关系,M是R的关系矩阵;(1)置新矩阵A:=M(2)置i:=1;(3)for j=1 to n doif A[j,i]=1 then dofor k=1 to n doA[j,k]:=A[j,k]+A[i,k](4)i=i+1;(5)if i<=n then to (3)else stop本实验要求从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。
用C语言或MA TLAB实现。
3、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
源代码:#include <iostream.h>class Matrix{int row,col;double *p;public:Matrix(int r,int c);void print();double &operator()(int i,int j);int getrow(){return row;}int getcol(){return col;}friend Matrix operator+(Matrix x,Matrix y); //定义运算符号};Matrix::Matrix(int r,int c){row=r;col=c;p=new double[r*c];for(int i=0;i<r*c;i++){p[i]=0;}}void Matrix::print() //矩阵输出函数{for(int i=1;i<=row;i++){for(int j=1;j<=col;j++){cout<<p[(i-1)*col+j-1]<<" ";}cout<<endl;}}double &Matrix::operator()(int i,int j) //定义()运算return p[(i-1)*col+j-1];}Matrix operator+(Matrix x,Matrix y) //定义矩阵加法{Matrix sum1(x.getrow(),x.getcol());for(int m=1;m<=x.getrow();m++){for(int n=1;n<=x.getcol();n++){sum1(m,n)=x(m,n)+y(m,n);}}return sum1;}//主函数int main(){int r1,c1;cout<<"请输入关系矩阵的行和列:";cin>>r1>>c1;Matrix A(r1,c1);int m,n;cout<<"请输入关系矩阵的数据:"<<endl;for(m=1;m<=r1;m++){for(n=1;n<=c1;n++){cin>>A(m,n);}}cout<<"你所输入的关系矩阵是:"<<endl;A.print();Matrix I(r1,c1);cout<<"元素A的恒等矩阵是:"<<endl;I.print();for(m=1;m<=r1;m++){for(n=1;n<=c1;n++)if(m==n){I(m,n)=1;}else{I(m,n)=0;}}}Matrix rA(r1,c1),sA(r1,c1),tA=A;for(m=1;m<=r1;m++) //自反闭包{for(n=1;n<=c1;n++){rA(m,n)=I(m,n)+A(m,n);if(rA(m,n)>1){rA(m,n)=1;}}}cout<<"A的自反闭包关系矩阵是:"<<endl;rA.print();Matrix AA(r1,c1);for(m=1;m<=r1;m++){for(n=1;n<=c1;n++){AA(m,n)=A(n,m);}}cout<<"A的逆矩阵是:"<<endl;AA.print();for(m=1;m<=r1;m++) //对称闭包{for(n=1;n<=c1;n++){sA(m,n)=A(m,n)+AA(m,n);if(sA(m,n)>1){sA(m,n)=1;}}cout<<"A的对称闭包是:"<<endl;sA.print();int i,j,k;for(i=1;i<=r1;i++) //传递{for(j=1;j<=r1;j++){if(tA(j,i)==1){for(k=1;k<=r1;k++){tA(j,k)=tA(j,k)+tA(i,k);}}}}for(m=1;m<=r1;m++){for(n=1;n<=c1;n++){if(tA(m,n)>1){tA(m,n)=1;}}}cout<<"A的传递闭包是:"<<endl;tA.print();return 0;}运行结果:请输入关系矩阵的行和列:3 3请输入关系矩阵的数据:1 0 01 0 10 1 0你所输入的关系矩阵是:1 0 01 0 10 1 0元素A的恒等矩阵是:0 0 00 0 00 0 0A的自反闭包关系矩阵是:1 0 01 1 10 1 1A的逆矩阵是:1 1 00 0 10 1 0A的对称闭包是:1 1 01 0 10 1 0A的传递闭包是:1 0 01 1 11 1 1Press any key to continue实验三 计算两结点间长度为m 的路的数目1、实验目的熟悉邻接矩阵和两结点间长度为m 的路的数目的关系并编程计算。