离散数学上机实验报告

合集下载

离散数学及其应用实验报告

离散数学及其应用实验报告

2
专业班级:
void main() { int p,q,r,i=0; for(p=0;p<2;p++) for(q=0;q<2;q++) for(r=0;r<2;r++) { a[i].P=p; a[i].Q=q; a[i].R=r;
姓 名:
学号:
实验日期:
//利用 for 循环为结构数组赋值
a[i].answer=(a[i].P&&a[i].Q||a[i].R); i++; } printf("P\tQ\tR\tP∧Q∨R\n"); for(i=0;i<8;i++) { printf("%d\t%d\t%d\t%d\n",a[i].P,a[i].Q,a[i].R,(a[i].P&&a[i].Q||a[i].R)); } print(a); } void print(struct List a[]) { int i; printf("P∧Q∨R 的主范式是:"); 调试报告: //利用循环将结果打印
6
#include <stdio.h> #include <string.h> #include<math.h> #define MAX_SIZE 20 /*--------------------------------函数声明--------------------------------------*/ int countPQ(char *exp); void evalu(char *exp); char Precede(char op1, char op2); int Operate(int x,char op,int y); void Divi(char exp[],char myopnd[]); int Locate(char *myopnd,char c); int CalExpression(char *exp,int *p); /*--------------------------------操作运算符栈 OPTR--------------------------------------*/ typedef struct { char data[MAX_SIZE]; int top; }OptrStack; OptrStack OPTR; void IniOPTR(OptrStack *S) { S->top=0; } void PushOPTR(OptrStack *S,char elem) { S->data[S->top]=elem; S->top++; } char PopOPTR(OptrStack *S) { S->top--; return S->data[S->top]; } char GetTopOPTR(OptrStack *S) { return S->data[S->top-1]; }

离散数学实验报告()

离散数学实验报告()

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

离散数学上机实验报告

离散数学上机实验报告

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

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

二.实验内容从键盘输入两个命题变元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.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。

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

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

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

离散数学实验报告

离散数学实验报告

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

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

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

离散数学实验报告2

离散数学实验报告2
八、教师评语
printf(“pleaseenter the values of m,n,p\n”);
scanf(“%d,%d,%d”,&m,&n,&p);
for(i=0;i<m;i++)
for(j=0;j<p;j++)
scanf(“%d”,A[i][j]);
printf(“\n”);
for(i=0;i<p;i++)
一、实验目的
求两个布尔矩阵的乘积
二、实验内容
1.描述布尔矩阵乘积的算法
2.编程实现布尔矩阵的乘积
三、使用环境
TC
四、算法介绍
Algorithm:the Boolean product
Input:two Boolean matrices and
Output:the Boolean product
Begin
}
for(i=0;i<m;i++)
{
for(j=0;ቤተ መጻሕፍቲ ባይዱ<n;j++)
printf(“%2d”,C[i][j]);
printf(“\n”);
}
}
2.运行窗口:
六、总结
1.注意当IF( =1 and =1) THEN =1执行完时要跳出循环
七、参考文献
[1]BernardKolman,Robert C.Busby,Sharon Cutler Ross,DiscreteMathematical Structures,Pearson Education,2009
for(j=0;j<n;j++)
scanf(“%d”,B[i][j]);

离散数学上机实验报告

离散数学上机实验报告

离散数学实验)报告姓名:学号:班级:离散数学实验报告'实验一真值计算实验内容:从键盘输入两个命题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的路的数目。

离散数学实验报告

离散数学实验报告

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

离散数学计算机实验报告

离散数学计算机实验报告

《离散数学》实验一、实验目的《离散数学》是现代数学的一个重要分支,是计算机科学与技术专业的基础理论课,也是该专业的核心课程和主干课程。

“离散数学”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。

该课程一方面为后继课程如数据结构、编绎原理、操作系统、数据库原理、人工智能和形式语言与自动机等提供必要的理论基础;同时,更为重要的是培养学生的抽象思维能力和逻辑推理能力,为今后的学习和工作打好基础。

无论从计算机学科发展的过去、现在和未来看,《离散数学》都是计算机科学与技术专业不可缺少的重要组成部分。

这门课程有着其它课程不可替代的地位和作用,是一门承前启后的课程。

根据《离散数学》课程本身的理论性较强的特性,为了帮助学生更好地学习本课程,理解和掌握所学基本概念和方法,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,设置实践环节十分重要。

通过实验实践内容的训练,突出逻辑性思维训练的特征, 目的是学习离散数学中的基本算法和方法,掌握数理逻辑、关系和图论中的基本算法,提高学生学习的兴趣及实际动手的能力。

通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所学知识,培养分析、解决实际问题的能力。

二、实验要求掌握真值表技术,熟悉联结词合取、析取、条件和双条件的概念。

熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。

熟悉邻接矩阵和两结点间长度为m 的路的数目的关系。

熟悉最优树的构造算法,掌握最优树的构造过程。

实验前作好准备,分析问题并确定算法,设计代码。

做实验过程中认真分析和调试程序,记录并分析实验结果。

实验后完成实验报告,实验报告包括实验目的、实验内容、源程序、运行结果及分析。

可以使用C、VC或MATLAB完成实验。

实验题目包括真值计算、关系闭包计算、计算两结点间长度为m的路的数目、最优树的构造四个实验,每个实验要求2个学时完成。

三、实验设备及环境PC机一台,软件C、VC或MATLAB四、实验内容实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。

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

离散数学实验报告

离散数学实验报告

离散数学实验报告1.实验内容:1.1 有人邀请A,B,C,D,E,F6个人参加一项会议。

已知:1. A,B两人至少有1人参加会议。

2. A,E,F3人中有2人参加会议。

3. B和C两人决定,要么两人都去,要么两人都不去。

4. A,D两人中只1人参加会议。

5. C,D两人中也只要1人参加会议。

6.如果D不去,那么E也决定不去。

那么最后究竟有哪几个人参加了会议呢?2.主要代码:#include<iostream>using namespace std;int main(){for(int A=0;A<=1;A++)for(int B=0;B<=1;B++)for(int C=0;C<=1;C++)for(int D=0;D<=1;D++)for(int E=0;E<=1;E++)for(int F=0;F<=1;F++){// if((A==1&&B==0)||(A==0&&B==1)||(A==1&&B==1))if(!(A==0&&B==0))if(A==1&&E==1&&F==0||A==1&&E==0&&F==1||A==0&&E==1&&F==1)if(B==1&&C==1||B==0&&C==0)if(A==1&&D==0||A==0&&D==1)if(C==1&&D==0||C==0&&D==1)if(D==0&&E==0||D==1)cout<<"A= "<<A<<" "<<"B= "<<B<<" "<<"C="<<C<<" "<<"D="<<D<<" "<<"E="<<E<<" "<<"F= "<<F<<endl;}return 0;}3.程序说明:运用数理逻辑相关知识,用1表示“去参加会议”,0表示“不去参加会议”4.程序运行结果及相关说明:A=1 B=1 C=1 D=0 E=0 F=1结果:A B C F 去参加会议;C D不去参加会议。

离散数学上机实验报告 离散数学实验报告:建立关系矩阵实验

离散数学上机实验报告 离散数学实验报告:建立关系矩阵实验

离散数学上机实验报告离散数学实验报告:建
立关系矩阵实验
__大学离散数学实验报告建立关系矩阵实验姓名:____
专业:
软件工程班级:
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。

离散数学 实验报告

离散数学 实验报告

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

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

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

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

三、实验过程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");}}结果:四、实验总结此次实验可以的算是成功的,但是由于自己的疏忽导致在输入数据时出现了一些问题,但是经历过多次调试后最终出现正确的结果,感觉到要注意细节,注重实际操作才能真的做到游刃有余。

离散数学实验报告

离散数学实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

离散数学实验报告

离散数学实验报告

离散数学闭包实验报告专业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);};把上面的每个子函数串在一起,再加上主函数,就可以实现这次实验的要求。

中南大学离散数学实验报告(实验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)。
实验三、用沃尔算法求传递闭包
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#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");
scanf("%c",&t);
if('y'==t)
{
printf("输入p,q的真值(0或1):");
scanf("%d%d",&p,&q);
if((p!=1)&&(p!=0))
{
printf("请重新输入p值");
scanf("%d",&q);
for(j=0;j<d;j++)
if(m[i][j]==1)
{
for(k=0;k<n;k++)
if(s2[j][k]==1)
a[i][k]=1;
}
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
m[i][j]=a[i][j];
t[i][j]+=a[i][j];
a[i][j]=0;
if(t[i][j]>1)
scanf("%d",&s[i][j]);
}
do
{
printf("输入对应序号选择算法\n1:自反闭包\n2:传递闭包\n3:对称闭包\n");
scanf("%d",&z);
switch(z)
{
case 1:zifan(s); break;
case 2:chuandi1(s);break;
case 3:duichen(s); break;
int d,n ,i,j;
int main()
{
char ch;
aa();
printf("是否开始新的运算?(Y/N)\n");
do
{
ch=getchar();
}while(ch!='N'&&ch!='Y');
if(ch=='Y')
aa();
return 0;
}
void aa()
{
char c;
printf("请输入矩阵的行数(必须小于10)\n ");
}
printf("您选择继续吗(Y/N)?\n");
do
{
c=getchar();
}while(c!='N'&&c!='Y');
} while(c=='Y');
}
void output(int s[][100])
{
printf("所求关系矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<d;j++)
printf("输入X集合中元素个数:");
scanf("%d",&k);
printf("输入X中二元关系R的关系矩阵:\n");
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
scanf("%d",&a[i][j]);
}
printf("输入X中二元关系S的关系矩阵:\n");
for(m=0;m<k;m++)
{
int m[100][100],a[100][100],k,h;
int t[100][100];
for(i=0;i<n;i++)
for(j=0;j<d;j++)
{
a[i][j]=0;
t[i][j]=s2[i][j];
m[i][j]=s2[i][j];
}
for(h=0;h<n;h++)
{
for(i=0;i<n;i++)
}
}
for(t=0;t<n;t++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
b[i][j]+=c[i][k]*a[k][j];
}
}
for(p=0;p<n;p++)
{
for(q=0;q<n;q++)
{
c[p][q]=b[p][q];
b[p][q]=0;
printf("请输入邻接矩阵的阶数\n");
scanf("%d",&n);
printf("请输入此邻接矩阵\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
c[i][j]=a[i][j];
d[i][j]=a[i][j];
b[i][j]=0;
for(m=0;m<k;m++)
for(n=0;n<k;n++)
{
printf("%d ",b[m][n]);
if(n==k-1)
printf("\n");
}
for(i=0;i<k;i++)
for(n=0;n<k;n++)
{
for(j=0,m=0;j<k,m<k;j++,m++)
{
sum+=a[i][j]*b[m][n];
for(k=0;k<n;k++)
{
a[i][k]=a[j][k]+a[i][k];
if(a[i][k]>1)
a[i][k]=1;
}
}
}
printf("输出传递闭包:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printfn-1)
if(sum>1)
sum=1;
}
c[i][n]=sum;
sum=0;
}
printf("输出RοS的关系矩阵:\n");
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
printf("%d ",c[i][j]);
if(j==k-1)
printf("\n");
}
}
四、实验体会
在求关系的复合中,先求出其关系矩阵,关系矩阵的运算和普通矩阵的运算一样,但是值得注意的是,关系矩阵中只有0和1,所以当大于1时,应该返回1,其余不变。
scanf("%d",&n);
printf("请输入矩阵的列数(必须小于10)\n ");
scanf("%d",&d);
printf("请输入关系矩阵\n");
for(i=0;i<n;i++)
{
printf("\n");
printf("请输入矩阵的第%d行元素",i+1);
for(j=0;j<d;j++)
相关文档
最新文档