离散数学实验报告--四个实验!!!
离散数学 实验报告

离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,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该命题公式不存在主合取范式。
离散数学实验报告()

《离散数学》实验报告专业网络工程班级姓名学号授课教师二 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.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
离散数学实验报告

“离散数学”实验报告目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1、实验原理........................................................................................................2、实验过程.......................................................................................................五、实验数据及结果分析 (13)六、源程序清单 (24)源代码 (24)七、其他收获及体会 (45)一、实验目的实验一:熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
实验二:掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。
理解等价类的概念,掌握等价类的求解方法。
实验三:理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
二、实验内容实验一:1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))实验二:1.求有限集上给定关系的自反、对称和传递闭包。
(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。
(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。
(C)实验三:以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A)。
并计算任意两个结点间的距离(B)。
对不连通的图输出其各个连通支(C)。
三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)实验一:1.实验原理(1)合取:二元命题联结词。
离散数学上机实验报告

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