离散数学实验报告一

合集下载

离散数学 实验报告

离散数学 实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

离散实验报告

离散实验报告

离散实验报告专业:数学与应用数学班级:091121学号:2009112125姓名:张鼎珩日期:2011.06.23实验内容:实验一真值计算实验二两个集合运算实验三关系闭包计算实验四关系与函数进行试验:实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。

二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三实验程序:#include<stdio.h>/*标准输入输出头文件*/#include<stdlib.h>/*该文件包含了的C语言标准库函数的定义*/#include<string.h>/*字符串数组的函数定义的头文件*/#include<conio.h>/*通用输入输出库*/#include<math.h>#define N 50void jisuan();void zhenzhibiao();void panduan(int b[N],int f);int tkh (char sz[N], char ccu[N], int icu[N], int h0);int fkh (char sz[N], char ccu[N], int icu[N], int h0);main(){int a1;start:do{printf(" 1.求P、Q的合取、析取、条件和双条件的真值\n 2.求任意一个命题公式的真值表,并根据真值表求主范式\n 3.退出\n");printf("\n选择功能选项:");fflush(stdin);/*清空输入缓冲区,通常是为了确保不影响后面的数据读取*/scanf("%d",&a1);switch(a1)/*switch语句实现选择功能*/{case 1:system("cls");jisuan();break;/*功能A*/case 2:system("cls");fflush(stdin);zhenzhibiao();break;/*功能BC*/case 3:system("exit");exit(0);/*结束整个程序的运行*/default:system("cls");goto start;/*控制流转移到start处*/}}while(1);}void jisuan()/*功能A*/{char p,q,t,ch;int p1,q1;do{start:fflush(stdin);printf("请输入P和Q的真值(T或F):");scanf("%c,%c",&p,&q);if((p=='F'||p=='f'||p=='T'||p=='t')&&(q=='F'||q=='f'||q=='T'||q=='t')){if(p=='F'||p=='f')/*赋值*/p1=0;elsep1=1;if(q=='F'||q=='f')q1=0;elseq1=1;if(p1|q1)/*计算*/t='T';elset='F';printf("P析取Q为:%c\n",t);if(p1&q1)t='T';elset='F';printf("P和取Q为:%c\n",t);if((!p1)|q1)t='T';elset='F';printf("P条件Q为:%c\n",t);if(p1==q1)t='T';elset='F';printf("P双条件Q为:%c\n",t);}else{printf("请按正确格式输入!\n");goto start;};printf("是否继续输入?Y/N");fflush(stdin);ch=getch();system("cls");}while(ch!='n'&&ch!='N');}void zhenzhibiao()/*功能BC*/{int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;int bj=0,hq[N],h=0,x=0,xq[N];char sz[N],ccu[N],sz0[N];hq[0]=-1;xq[0]=-1;printf("请输入一个合法的命题公式(可含与或非及括号):\n");gets(sz);strcpy(sz0,sz);for(i1=0;i1<strlen(sz);i1++){if(sz[i1]==')' || sz[i1]=='(')kh++;if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z'){for(i2=0;i2<j;i2++) /*判断并储存变量*/if(ccu[i2]==sz[i1])d=0;if(d==1){ccu[j]=sz[i1];j++;}d=1;}}printf("\n该式子中的变量个数为:%d\n",j);h0=j;printf("\n输出真值表如下:\n \n");for(i1=0;i1<h0;i1++)printf(" %c ",ccu[i1]);printf(" ");puts(sz);printf("\n");for(i1=0;i1<j;i1++) /*先将所有的变量赋值为零*/icu[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;printf(" ------> %d\n",jg);strcpy(sz,sz0);for(i1=0;i1<(int)pow(2,j)-1;i1++){++bj;panduan(icu,0); /*赋值变量*/jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;strcpy(sz,sz0); /*恢复被修改的数组*/for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);printf(" ------> %d\n",jg);}if(hq[0]==-1)printf("\n该命题公式不存在主合取范式。

离散数学实验报告1

离散数学实验报告1

《离散数学》课程设计学院软件学院学生姓名孟庆汉学号 0843042109 年级2008 指导教师冯伟森评阅意见提交日期2009 年12 月25 日《利用Warshall算法求二元关系的可传递闭包》学生:孟庆汉指导老师:冯伟森摘要:当集合的阶数n较大时,求二元关系的可传递闭包的工作量是相当庞大的。

幸运的是1962年S.Warshall提出了一个计算R+的有效方法,可在计算机上编程实现。

采用C语言函数写出这个算法。

程序中用m[i][j]表示关系矩阵M R的第i行第j列元素,用||表示逻辑或计算。

计算R+的函数名为Warshall,它的两个形式参数m和n分别表示关系矩阵M和矩阵的行数。

函数的实现实际上是一个三重循环构成。

关键字:二元关系关系矩阵可传递闭包Warshall算法三重循环引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。

二元关系是离散数学中重要的内容。

世界上的事物都在一定范围内以某种方式互相联系,例如天体之间可以用的是同一星系来划分,人们之间可以用是否有共同的祖先来定血缘。

类似的数学或者计算机科学中的研究对象也以各种不同的形式相互联系着,例如整数之间以大小,整除或同余等关系相互连接着,命题公式之间以是否有相同的主合取范式相联系,程序中两个变量可以用是否占有同一内存地址相联系。

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

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

一个二元关系可能具有某种性质,也可能不具有这种性质。

关系的闭包就是使一个二元关系变成具有指定性质的关系,并且还要满足最小性的条件。

数学原理设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R就是A×B的一个合于R={(x,y)∈A×B|xRy}的子集合设R是集合A上的二元关系:a.对任意的x∈A,都满足<x,x>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的⇔(∀x)((x∈A)→(<x,x>∈R))=1b.对任意的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))=1c.对任意的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设R是定义在A上的二元关系,若存在A上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆ R〞。

离散数学实验报告()

离散数学实验报告()

《离散数学》实验报告专业网络工程班级姓名学号授课教师二 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磅五.实验结果六.心得体会通过编程,学会了析取、合取、单条件连接词、双条件连接词的用法。

离散数学计算机实验报告

离散数学计算机实验报告

离散实验报告实验一真值计算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算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

离散数学上机实验报告

离散数学上机实验报告

离散数学上机实验报告《离散数学》实验报告姓名:学号:班级:实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。

熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。

二.实验内容从键盘输入两个命题变元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.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。

离散数学上机实验报告

离散数学上机实验报告
实验三、用沃尔算法求传递闭包
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
printf("﹁q=0\n");
printf("p∧q=1\n");
printf("p∨q=1\n");
printf("p→q=1\n");
printf("p<->q=1\n");
}
continue;
}
if('n'==t)
break;
}
return 0;
}
四、实验体会
求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。
printf("\n");
}
return 0;
}
四、实验体会
熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
char t;
while(t)
{
printf("是否运算程序(y/n):\n");

离散数学实验报告

离散数学实验报告

离散数学实验报告一、实验目的离散数学是现代数学的一个重要分支,它在计算机科学、信息科学、人工智能等领域有着广泛的应用。

本次离散数学实验的目的在于通过实际操作和编程实现,深入理解离散数学中的基本概念、原理和算法,提高解决实际问题的能力,培养逻辑思维和创新能力。

二、实验环境本次实验使用的编程语言为 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、图的遍历图是离散数学中的重要结构。

实验一 传递闭包的实现(离散数学实验报告)

实验一 传递闭包的实现(离散数学实验报告)

实验一传递闭包算法一、实验目的1、理解关系矩阵作为布尔矩阵的逻辑运算2、通过编程深刻理解Warshall快速算法3、验证Warshall快速算法的正确性4、掌握C语言的编程技巧和方法二、实验内容用C语言编程实现传递闭包的Warshall快速算法三、实验原理(Warshall算法的原理)M[i,j]表示关系R的关系矩阵M中元素若在关系R的关系图中存在从v i到v j的有向路径,则M[i,j]=1;否则M[i,j]=0。

定义:M k[i,j]=1 若在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了v1,v2,┉,v k外没有其它节点否则M[i,j]=0即M0[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向边M1[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了可能有v1外没有其它节点M2[i,j]=1⇔在关系R的关系图中存在从v i到v j的有向路径,且这条路上除了可能有v1,v2外没有其它节点┉┉┉根据此定义,仅当下列两情形之一发生时,M k[i,j]=1(1)存在从v i到v j的有向路径,且这条路上除了可能有v1,v2,┉,v k-1外没有其它节点。

因此M k-1[i,j]=1(2)存在从v i到v k的有向路径和从v k到vj的有向路径,且每条路上除了可能有v1,v2,┉,v k-1外没有其它节点。

因此M k-1[i,k]=1 且M k-1[k,j]=1因此,M k[i,j]= M k-1[i,j] ∨(M k-1[i,k]=1∧M k-1[k,j]=1)四、实验要求:1、对输入的数据进行合法性检查,输入输出界面友好2、编写和调试完成程序3、保存和打印程序的运行结果五、实验步骤(一)算法描述Step 1 初始化MStep 2 刷新M 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新行对i=1,2,┉n 重复Step 4Step 4 刷新M ij对j=1,2,┉n置M ij=M ij ∨(M ik∧M kj)[结束Step 3循环][结束Step 2循环]Step 5 退出(二)流程图┉┉┉┉┉(三)程序清单┉┉┉┉┉六、测试数据1、输入关系矩阵的传递闭包的关系矩阵:R1=⎪⎪⎪⎭⎫⎝⎛001011001, R2=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛0010001001000011, R3=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛0000000000110000010110010 输出的结果应为:t(R1)=⎪⎪⎪⎭⎫ ⎝⎛001011001, t(R2)=⎪⎪⎪⎪⎪⎭⎫⎝⎛0110011001100111,t(R3)=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛0000000000110001111111111参考程序:#include<stdio.h>#define N 3int main(){int i,j,k,M[N][N];printf("put in data 0 or 1\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&M[i][j]);printf("mibao:\n");for(k=0;k<N;k++)for(i=0;i<N;i++)for(j=0;j<N;j++)if((M[i][k]&&M[k][j])||M[i][j]) M[i][j]=1;for(i=0;i<N;i++){for(j=0;j<N;j++)printf(" %d",M[i][j]);printf("\n");}}输出结果:。

离散数学上机实验报告

离散数学上机实验报告

离散数学实验)报告姓名:学号:班级:离散数学实验报告'实验一真值计算实验内容:从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。

用C语言实现。

实验源程序和运行结果如下:#include "iostream.h"void main(){:char p,q,t;int p1,q1;cout<<"输入p,q的真值(F或T)"<<endl;cin>>p>>q;if(p=='F')p1=0;elsep1=1;)if(q=='F')q1=0;elseq1=1;//下面进行为运算if(p1|q1)t='T';else,t='F';cout<<"p析取q为"<<t<<endl;if(p1&q1)t='T';elset='F';cout<<"p和取q为"<<t<<endl;if((!p1)|q1)|t='T';elset='F';cout<<"p条件q为"<<t<<endl; if(p1==q1)t='T';elset='F';·cout<<"p双条件q为"<<t<<endl; }实验二关系闭包计算'实验内容:从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,传递闭包要求使用两种算法,即R+和Warshall算法。

用C语言实现。

实验源程序运行结果如下:#include<stdio.h>int he(int,int);void main(){inta[100][100],b[100][100],c[100][100],d[100][100],I[100][100],i,j,k,n,m,p,q,t;…printf("请输入关系矩阵的阶数\n");scanf("%d",&n);printf("请输入此关系矩阵\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);printf("选择1计算自反闭包...\n选择2计算对称闭包...\n选择3用R+计算传递闭包...\n选择4用washall计算传递闭包...\n计算结束后选择0退出\n");scanf("%d",&t);、switch(t){case 1:{for(i=0;i<n;i++){for(j=0;j<n;j++){:if(i==j)I[i][j]=1;else I[i][j]=0;}}for(i=0;i<n;i++){for(j=0;j<n;j++)-b[i][j]=he(a[i][j],I[i][j]),printf("%4d",b[i][j]);printf("\n");}};break;case 2:{for(i=0;i<n;i++){~for(j=0;j<n;j++)b[j][i]=a[i][j];}printf("对称闭包矩阵为\n");for(i=0;i<n;i++){for(j=0;j<n;j++)c[i][j]=he(a[i][j],b[i][j]),printf("%4d",c[i][j]); {printf("\n");}};break;case 3:{for(i=0;i<n;i++)for(j=0;j<n;j++){】c[i][j]=a[i][j];d[i][j]=a[i][j];b[i][j]=0;}for(m=0;m<n;m++){for(i=0;i<n;i++){》for(k=0;k<n;k++){for(j=0;j<n;j++){b[i][k]=b[i][k]||(c[i][j]*a[j][k]);}}}《for(p=0;p<n;p++){for(q=0;q<n;q++)c[p][q]=b[p][q];}for(p=0;p<n;p++){for(q=0;q<n;q++);{d[p][q]=d[p][q]||b[p][q];b[p][q]=0;}}}printf("矩阵的传递闭包为\n");for(i=0;i<n;i++)!{for(j=0;j<n;j++){printf("%4d",d[i][j]);}printf("\n");}};break;(case 4:{for(j=0;j<n;j++){for(k=0;k<n;k++){if(a[k][j]==1){'for(i=0;i<n;i++)a[k][i]=a[k][i]||a[j][i];}}}printf("传递闭包为\n");for(i=0;i<n;i++){《for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}};break;default:printf("Error\n");}}·int he(int a,int b){int c;if(a==0&&b==0)c=0;else c=1;return c;}…[实验三计算两结点间长度为m的路的数目实验内容:从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。

离散实验报告一

离散实验报告一

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

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

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

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

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

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

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

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

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

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

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

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

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

中南大学离散数学实验报告(实验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)双条件:二元命题联结词。

离散数学实验报告

离散数学实验报告

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

(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

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

四 1、实现A类算法原理根据析取、合取的定义可用简单的算术运算求出结果,并将结果转换成逻辑值。

同样根据等价关系可将条件式及双条件式转换成析取和合取的运算。

此题较简单2、实现BC类算法原理算法逻辑如下:(1)将二进制加法模拟器赋初值0(2)计算模拟器中所对应的一组真值指派下合式公式的真值。

(3)输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应的一行真值。

(4)产生下一个二进制数值,若该数值等于2n-1,则结束,否则转(2)。

(5)在进行表达式求值的时候,可先将带括号的中缀表达式利用栈结构转换为不带括号的后缀表达式(逆波兰式),然后进行计算。

具体方法请参考数据结构中有关“栈”的知识。

五实验数据及结果分析1(A类)2(B类)从实验结果可以看到:当输入的数据不是逻辑值时须重新输入,当输入符合逻辑值才能继续下去。

从结果来看完全正确,由于界面有限没有把所有结果都贴上,根据运行情况来看没有错误六源程序清单1(A类)#include<stdio.h>//#include<string.h>main(){while(1) //输入符合逻辑值的命题变元P值{int a,b,c,d,e,f,g;while(1){printf("\ninput the logic value of the minti P(0 or 1):");scanf("%d",&a);if((a!=0)&&(a!=1)){printf("you have input the wrong value,please reinput");}else break;}while(1) //输入符合逻辑值的命题变元Q值{printf("\ninput the logic value of the minti Q(0 or 1):");scanf("%d",&b);if(b!=0&&b!=1)printf("you have input the wrong value,please reinput");else break;}c=a*b; //合取d=a+b; //析取e=(!a)+b; //条件式f=a*b+(!a)*(!b); //双条件式if(c==0) //化为逻辑值c=0;elsec=1;if(d==0)d=0;elsed=1;if(e=0)e=0;elsee=1;if(f==0)f=0;elsef=1;printf("\nthe logic value of hequ:%d\nthe logic value of xiqu:%d\nthe logic value of tiaojian:%d\nthe logic value of shuangtiaojian:%d\n",c,d,e,f);printf("do you want to continue?input 'y' continue");g=getch();{if(g=='y');else break;}}}2(B类)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>typedef struct Node //二叉树节点结构体{char data; //存节点字符struct Node *leftchild;//左孩子指针struct Node *rightchild;//右孩子指针int temp;//判断该节点前是否有特别的字符类型}BeTreeNode;/*typedef struct{char stack[30];int top;}SeqStack;//账的结构体*/void print_char(BeTreeNode *root);void prints(BeTreeNode *p);char str[30]; //输入的字符串char S[16]; //仅存是字母的字符串int w,length,x=1; //分辨取哪一种真值赋值//SeqStack mystack;//定义一个栈BeTreeNode *pt[30];//定义指针数组int **S_num; //二维数组存真值的多种赋值情况int L=0;/*void StackInitiate(SeqStack *S) //初始化{S->top=0;}int StackNotEmpty(SeqStack S) //非空否{if(S.top<=0)return 0;else return 1;}int StackPush(SeqStack *S,char x)//入栈{if(S->top>=16){printf("堆栈已满无法插入!\n");return 0;}else{S->stack[S->top]=x;S->top++;return 1;}}*/BeTreeNode *MakeTree(int a,int b) //建立二叉树{int i,j=0,k=0,a1[10],b1[10];int L=0;BeTreeNode *p[10];BeTreeNode *pp,*sign=NULL;for(i=a;i<=b;i++)//若有括号的先渐入括号的最内层{if(str[i]=='('){//if(mystack.top==0)if(L==0)a1[j]=i;L++;}if(str[i]==')'){L--;if(L==0){b1[j]=i;p[j]=MakeTree(a1[j]+1,b1[j]-1);j++;} }}j=0;for(i=a;i<=b;i++,k++)//用指针来存储二叉树的每个节点{if(str[i]=='!'){if(str[i+1]=='('){ pt[k]=p[j];pt[k]->temp=2;i=b1[j];j=j+1;}else{pt[k]=(BeTreeNode *)malloc(sizeof(BeTreeNode)); pt[k]->data=str[i+1];pt[k]->leftchild=NULL;pt[k]->rightchild=NULL;pt[k]->temp=-1;i=i+1;}}else if(str[i]=='('){pt[k]=p[j];pt[k]->temp=1;i=b1[j];j=j+1;}else{ pt[k]=(BeTreeNode *)malloc(sizeof(BeTreeNode)); pt[k]->data=str[i];pt[k]->leftchild=NULL;pt[k]->rightchild=NULL;pt[k]->temp=0;}}pp=pt[0];for(i=1;i<k;i=i+2)//把各个二叉树的节点连接起来{if(pt[i]->data=='|'){pt[i]->leftchild=pp;pt[i]->rightchild=pt[i+1];pp=pt[i];}else{if(sign!=NULL){pt[i]->leftchild=sign;sign->rightchild=pp;pp=pt[i];sign=NULL;}else{pt[i]->leftchild=pp;pp=pt[i];}if(i+2<k){if(pt[i+2]->data=='|'){pp=pt[i+1];sign=pt[i];}else{pp->rightchild=pt[i+1];}}}}if(sign!=NULL){sign->rightchild=pp;pp=sign;}else pp->rightchild=pt[k-1];return pp;}void prints(BeTreeNode *p)//根据各个节点前的标记符的赋值确定应该要输出哪种字符{if(p->temp==2){printf("!(");print_char(p);printf(")");}else if(p->temp==1){printf("(");print_char(p);printf(")");}else if(p->temp==-1){printf("!");print_char(p);}elseprint_char(p);}void print_char(BeTreeNode *root)//输出某个节点下的树{if(root->leftchild==NULL&&root->rightchild==NULL){printf("%c",root->data);}else{prints(root->leftchild);printf("%c",root->data);prints(root->rightchild);}}void print(BeTreeNode *root)//利用二重循环来进行从最内层的子树开始输出,直到输出整棵树{if(root->leftchild->leftchild!=NULL)print(root->leftchild);if(root->rightchild->leftchild!=NULL)print(root->rightchild);if(root->leftchild->temp==-1)printf("!%c ",root->leftchild->data);if(root->rightchild->temp==-1)printf("!%c ",root->rightchild->data);print_char(root);if(root->temp==2){printf("");prints(root);}printf("");}int numre(char c)//输出叶节点{int i;for(i=0;i<length;i++){if(S[i]==c)return S_num[w][i];}}int Judge(int num1,char c,int num2)//判断最简单的表达式的返回值{if(c=='&'){if(num1==num2&&num1==1)return 1;else return 0;}if(c=='|'){if(num1==num2&&num1==0)return 0;else return 1;}}int print_num(BeTreeNode *root)//从最内层开始输出返回值{int num1,num2,num,i;char c;if(root->leftchild==NULL&&root->rightchild==NULL){num=numre(root->data);}else{num1=print_num(root->leftchild);c=root->data;num2=print_num(root->rightchild);if((root->leftchild->temp==2)||(root->leftchild->temp==-1)){ for(i=0;i<x;i++)printf("");printf(" %d",num1);}if((root->rightchild->temp==2)||(root->rightchild->temp==-1)){ for(i=0;i<x;i++)printf("");printf(" %d",num2);}num=Judge(num1,c,num2);for(i=0;i<x;i++)printf("");printf(" %d",num);x=x+3;}if((root->temp==2)||(root->temp==-1)){if(num==1)num=0;else num=1;}return num;}int fac(int t)//计算出2的n次方的结果{if(t==0)return 1;if(t==1)return 2;return 2*fac(t-1);}void S_numf(int n)//开辟一个二维数组存储真值表的各种赋值情况{int row,col,i,j,k,p;row=fac(n);col=n;S_num=(int *)malloc(sizeof(int)*row);for(i=0;i<row;i++){S_num[i]=(int *)malloc(sizeof(int)*col);}for(i=0;i<row;i++)for(j=0;j<col;j++)S_num[i][j]=0;for(i=0;i<col;i++)for(k=0,j=fac(i);k<fac(i);j++,k++){for(p=col-1;p>col-1-i;p--)S_num[j][p]=S_num[k][p];S_num[j][p]=1;}}main(){int i,j,LEN,t=0,temp=1;BeTreeNode *root;//定义根节点//StackInitiate(&mystack);printf("请输入一个符合命题公式(仅支持非'!',析取'|',合取'&',优先级:!,|,&)\n:");gets(str);LEN=strlen(str);for(i=0;i<LEN;i++){ for(j=0;j<t;j++)if(S[j]==str[i])temp=0;if((str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')&&temp){S[j]=str[i];t++; }temp=1;}length=strlen(S);S_numf(length);root=MakeTree(0,LEN-1);printf("该复合命题公式的真值表是:\n");for(i=0;i<length;i++)printf("%c ",S[i]);print(root);printf("\n");for(w=0;w<fac(length);w++){for(i=0;i<length;i++)printf("%d ",S_num[w][i]);print_num(root);printf("\n");x=1;}}七收获与体会通过这次实验使我了解了一些数理逻辑问题可以通过用计算机编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。

离散数学实验报告

离散数学实验报告

实验一命题逻辑推理1.实验用例根据下面的命题,试用逻辑推理方法确定谁是作案者,写出推理过程。

(1)营业员A或B偷了手表;(2)若A作案,则作案不在营业时间;(3)若B提供的证据正确,则货柜末上锁;(4)若B提供的证据不正确,则作案发生在营业时间;(5)货柜上了锁。

2.实验目的加深对命题逻辑推理方法的理解。

3.实验内容用命题逻辑推理的方法解决逻辑推理问题。

4.实验原理和方法(1)符号化上面的命题,将它们作为条件,营业员A偷了手表作为结论,得一个复合命题。

(2)将复合命题中要用到的联结词定义成C语言中的函数,用变量表示相应的命题变元。

将复合命题写成一个函数表达式。

(3)函数表达式中的变量赋初值1。

如果函数表达式的值为1,则结论有效,A偷了手表,否则是B偷了手表。

用命题题变元表示:A:营业员A偷了手表B:营业员B偷了手表C:作案不在营业时间D:B提供的证据正确E:货柜末上锁则上面的命题符号化为 (A||B) && (!A||C) && (!D||E) && (D||!C) && !E 要求找到满足上面式子的变元A,B的指派便是结果。

5.实验代码6.实验结果B偷了手表实验二关系的运用1.实验原理和方法在三种闭包中自反和对称闭包的求解很容易,对矩阵表示的关系,其自反闭包只要将矩阵的主对角线全部置为1就可;对称闭包则加上关系的转置矩阵(逻辑加法)2.实验代码5.实验结果1.自反闭包2.传递闭包3.对称闭包实验三图论1.实验用例如下图所示的赋权图表示某七个城市及预先算出它们之间的一些直接通信成路造价(单位:万元),试给出一个设计方案,使得各城市之间既能够通信又使总造价最小并计算其最小值.2实验原理和方法为了求解最小代价,使花费的总代价最小,这是数学中经典的求解最小耗费生成树的算法。

其核心思想是寻找每一步的最优解继而求得全局最优解。

为了求得最小耗费生成树,我们运用数学中经典的Krusal算法,此算法的核心思想是:1、假设该图G是不连通的,对该图的边以非降序权重新排列2、对于排序表中的每条边,如果现在把它放入T不会形成回路的话,则把它加入到生成树T中;否则丢弃3、输出最小生成树的结果,得到我们想要的答案因而最后求得的最小耗费是:此时的最小耗费是:23+1+4+9+3+17=57(万元)实验四最优二叉树在通信编码中的应用1.实验内容输入一组通信符号的使用频率,求各通信符号对应的前缀码。

离散数学实验报告(一)

离散数学实验报告(一)

一、实验内容:构造任意合式公式的真值表二、实验源码:#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.实验结果经过实验,我们成功找到了两个给定节点之间的最短路径,并计算出了最短距离。

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

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

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

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

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

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

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

离散数学实验报告

离散数学实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

中南大学离散数学实验报告(实验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)。

学生实验报告
学院:软件与通信工程学院
课程名称:离散数学(软件)
专业班级: 12软件 3 班
姓名:简建敏
学号: 0123897
学生实验报告(1)
一、实验综述
1、实验目的及要求
(1)掌握关系的性质的概念;
(2)掌握关系性质的判别方法及算法;
(3)编写程序,根据关系矩阵计算判别关系的性质;
(4)进一步熟悉和掌握C++程序开发。

实验要求:
认真完成实验题,能正确运行,提交实验报告并上传程序,实验报告要求写出操作步骤、结果、问题、解决方法、体会等。

实验题:
,判设A={a,b,c,d},A上的关系R={<a, b>,<b, a>,<c, d>,<d, c>}∪I
A
别关系R的性质。

2、实验仪器、设备或软件
计算机、VC++6.0、office、相关的操作系统等。

二、实验过程(实验步骤、记录、数据、分析)
代码如下:
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define OK 1
#define INFINITY 0
#define MAX_VERTEX_NUM 20
#define MAX_EDGE_NUM 40
typedef enum {DG,DN,UDG,UDN}Graphkind;
typedef char VertexType;
typedef struct ArcCell
{
int adj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
Graphkind kind;
}MGraph;
int LocateVex(MGraph G,VertexType v1) //定义位置
{
int i;
for(i=0;i<G.vexnum;i++)
if(G.vexs[i]==v1)
return i;
return -1;
}
int CreatDN(MGraph &G1) // 采用数组表示法,构造无向网G {
VertexType v1,v2;
int w,j;
cout<<"用图表示的顶点数及弧数:";
cin>>G1.vexnum>>G1.arcnum;
cout<<" A中顶点:";
for(int i=0;i<G1.vexnum;i++)
cin>>G1.vexs[i];
for(i=0;i<G1.vexnum;i++)
for(j=0;j<G1.vexnum;j++)
G1.arcs[i][j].adj=INFINITY;
cout<<"输入A中各边依附的顶点及关系:"<<endl;
for(int k=0;k<G1.arcnum;++k) //构造邻接矩阵
{
cin>>v1>>v2>>w;
i=LocateVex(G1,v1);
j=LocateVex(G1,v2);
G1.arcs[i][j].adj=w;
G1.arcs[j][i]=G1.arcs[i][j];
//while(f=8) {break;}
}
return OK;
}
void dispMGraph(MGraph G) //显示图的邻接矩阵图
{
cout<<"图的邻接矩阵是:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
cout<<" "<<G.arcs[i][j].adj;//输出关系;
cout<<endl;
}
}
int main()
{
MGraph G;
cout<<"利用关系矩阵展示A关系上的R "<<endl;
CreatDN(G);
dispMGraph(G);
cout<<endl;
cout<<"由关系矩阵对应的关系知"<<endl;
cout<<"关系R具有反自反性、对称性、传递性;"<<endl;
return 0;
}
三、结论
1、实验结果
2、分析讨论
通过本次实验的练习,我进一步的掌握关系的性质的概念和判别方法及算法,通过编写程序,学会了利用关系矩阵计算判别关系的性质;这次实验我吸取了一些编程的经验,在以后的学习中对我有帮助;
四、指导教师评语及成绩:
成绩:指导教师签名:
批阅日期:。

相关文档
最新文档