离散数学实验报告
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 实 验 报 告
(2016 / 2017 学年 第 一 学期) 课程名称 离散数学 实验名称 利用真值表法求取主析取范式以及主合取范式的实现 实 验 报 告 实验名称 利用真值表法求取主析取范式以及主合取范式的实现 指导教师
实验类型 验证 实验学时 4 实验时间 一、 实验目的和要求 内容: 编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。 要求: 能够列出任意合式公式的真值表并给出相应主析取和主合取范式。 二、实验环境(实验设备)
X86架构计算机 操作系统:Windows 7 32bit IDE: CodeBlokcs 16.02 编程语言:C++ 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 2文档来源为:从网络收集整理.word版本可编辑. 编译器:GCC
三、实验原理及内容 内容: 编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。 原理: 先将中缀表达式转换成后缀表达式,再将后缀表达式中每一个字母变量一一赋值,用递归枚举的方法枚举所有赋值情况,并且用map映射将每一个字母变量与当前被枚举的值一一映射,对每一种赋值情况调用后缀表达式计算函数计算后缀表达式的值,打印真假情况。如果是真,记录到名为zhen的vector不定长数组中,如果是假,记录到名为jia的vector不定长数组中。最后根据zhen和jia的不定长数组来打印主析取范式和主合取范式。 此程序可以实现任意数量的字母变量的主析取范式求取和主合取范式求取,以及真值表打印。 实 验 报 告 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.
3文档来源为:从网络收集整理.word版本可编辑. 第一步:预处理 预处理,去除中缀表达式中条件->中的>,和双条件<=>中的= 和 > ,这样,所有的运算符只是一个字符,后期处理起来更加方便。 void ddd() { string::iterator i=zhong.begin(); //string类迭代器,需在头文件加入#include int flag=1; while(flag) { flag=0; for(i=zhong.begin();i!=zhong.end();++i) { if(*i=='>') { zhong.erase(i); flag=1; break; } if(*i=='=') { zhong.erase(i); 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 4文档来源为:从网络收集整理.word版本可编辑. flag=1; break; } } } } 第二步:将中缀表达式转换后缀表达式 利用栈和优先级函数来将中缀表达式转换成后缀表达式,此函数另一个功能是将中缀表达式中所有出现过的字母变量都保存包名为alpha的string类中(string类为STL中的string,需要在头文件加入#include),并且alpha中不出现重复字母,这样,通过alpha.size()函数就可以得到所有字母变量的个数,并且方便后面枚举赋值映射。 全局变量: string zhong; //中缀表达式 char hou[1000]; //后缀表达式 string alpha; //存放所有字母变量 优先级函数: int icp(char a) //栈外优先级 { if(a=='#') return 0; if(a=='(') return 12; if(a=='!') return 10; 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 5文档来源为:从网络收集整理.word版本可编辑. if(a=='&') return 8; if(a=='|') return 6; if(a=='-') return 4; if(a=='<') return 2; if(a==')') return 1; } int isp(char a) //栈内优先级 { if(a=='#') return 0; if(a=='(') return 1; if(a=='!') return 11; if(a=='&') return 9; if(a=='|') return 7; if(a=='-') return 5; if(a=='<') return 3; if(a==')') return 12; } void change() //中缀表达式转换后缀表达式 { int j=0; stack s; //定义临时栈,需要在头文件加入#include char ch,y; 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 6文档来源为:从网络收集整理.word版本可编辑. s.push('#'); char t1,t2; stringstream ss(zhong); //字符串流,需要在头文件加入#include while(ss>>ch,ch!='#') { if(isalpha(ch)) //判断是不是字母,如果是,加入到alpha字符串中 { hou[j++]=ch; //并且加入到后缀表达式字符串中 if(alpha.find(ch)==-1) { alpha.push_back(ch); } } else if(ch==')') { for(y=s.top(),s.pop();y!='(';y=s.top(),s.pop()) { hou[j++]=y; } } else { 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 7文档来源为:从网络收集整理.word版本可编辑. for(y=s.top(),s.pop();icp(ch)<=isp(y);y=s.top(),s.pop()) { hou[j++]=y; } s.push(y); s.push(ch); } } while(!s.empty()) { y=s.top(); s.pop(); if(y!='#') { hou[j++]=y; } } hou[j]='#'; } 第三步:递归枚举每一个字母变量的取值情况 用深度优先搜索(dfs)的思想进行递归枚举,如果当前递归深度已经达到字符串长度,就说明所有字母已经取值成功,字母的“值”用map进行映射(需文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 8文档来源为:从网络收集整理.word版本可编辑. 要在头文件加入#include),所有字母都已经枚举后调用cal()函数对当前取值情况的后缀表达式进行计算,因为map M对象是全局变量,所以cal()函数可以查看到相应字母的取值情况。 计算完成后,打印真值,如果当前计算结果是true,那么加入到zhen数组中,以待后面的主析取范式打印调用,如果是false,加入到jia数组,以待后面的主合取范式打印调用。 全局变量: map M; //映射,将字母变量与0或1一一对应 struct note { int a[100]; }; vector zhen; //不定长数组,存放主析取范式对应字母变量的01情况,也就是表达式真值为T vector jia; //不定长数组,存放主合取范式对应字母变量的01情况,也就是表达式真值是F void dfs(int cur) //递归枚举每一种字符变量的取值情况 { if(cur==alpha.size()) { int ans=cal(); for(int i=0;i文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 9文档来源为:从网络收集整理.word版本可编辑. { if(M[alpha[i]]) { printf("T\t"); } else { printf("F\t"); } } if(ans==1) //真值为T 计入到zhen数组,以待后面主析取范式使用 { printf("T\n"); note t; for(int i=0;i{ t.a[i]=M[alpha[i]]; } zhen.push_back(t); } else //真值为F 计入到jia数组,以待后面主合取范式使用 {
离散数学实验报告2
《离散数学》
实验报告
学院
专业
指导教师
学号
姓名
提交日期
实验二命题公式的等值演算与真值表
一.实验目的
熟悉逻辑运算否定、合取、析取、蕴含、等价规则,利用程序语言实现命题公式的真值表运算,使其与命题的等值演算结果相同。
二.实验内容
(一)预测比赛名次
写出下列题目的命题公式,并应用程序语言实现命题公式的真值表以求解问题。
有,
,四人参加百米赛跑,观众甲、乙、丙预测比赛的名次为:
A,
C
B
D
甲说:C第一,B第二;
乙说:C第二,D第三;
丙说:A第二,D第四;
比赛结束后发现甲、乙、丙每人的预测都只对一半,试问实际名次如何(假定没有并列者)?
(二)筛选产品方案
某工厂要从A 、 B 、 C 、 D 、 E 五种新型产品中选择几种产品投产,根据该厂的实际生产条件及市场需求的调查分析结果,选择时必须满足以下条件:
(1) 若选择A,则必须选择B;
(2) D 、E两种产品至少选择一种;
(3) B 、C两种产品只选择一种;
(4) C 、D两种产品都选择或都不选择;
(5) 若选E,则必须选择A和B。
请用命题公式真值表法为该厂做出选择方案。
三. 实验过程
(一)预测比赛名次
1. 算法分析:
列出命题公式,说明程序设计思路。
2. 程序代码:
3.实验数据及结果分析
列出求解的真值表,并筛选出正确答案。
(二)筛选产品方案
1. 算法分析:
列出命题公式,说明程序设计思路。
2. 程序代码:
3.实验数据及结果分析
列出求解的真值表,并筛选出正确答案。
离散数学上机实验报告
离散数学上机实验报告《离散数学》实验报告姓名:学号:班级:实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容从键盘输入两个命题变元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)计算模拟器中所对应的⼀组真值指派下合式公式的真值(3)输出真值表中对应于模拟器所给出的⼀组真值指派及这组真值指派所对应的⼀⾏真值。
五.运⾏结果六.源代码#include#include#includeusing namespace std;string calcValue(string value1);string calcValueNop(string value1);string caclAnd(string x,string y);string caclOr(string x,string y);string caclNot(string x);int main(){string in,varList="";//="!a+b^c"cout<<"*****************************************\n"<cout<<"** 欢迎进⼊逻辑运算软件**\n"<cout<<"** (可运算真值表,⽀持括号) **\n"<cout<<"** ⽤!表⽰否定**\n"<cout<<"** ⽤^表⽰合取**\n"<cout<<"** ⽤+表⽰析取**\n"<cout<<"*****************************************\n\n"<cout<<"请输⼊命题公式:注意: !,^,+,(,),字母为合法,不要有数字、空格,括号也要匹配!"< cout<<"⽰例:!a+b^c"<cin>>in;cout<<"输⼊命题公式"<int length=in.length();int i=0,j=0;for(i=0;ichar code=in[i];if( ((code>=97)&&(code<123)||((code>=65))&&(code<81))&&varList.find(code, 0)==-1 ) varList+=code;}int n=varList.length();for(i=0;icout<int flag;char *trow=new char[n];for(i=0;ifor(i=0;ifor(j=0;jcout<string value1=in;for(j=0;jchar x=varList[j];for(int k=0;kif(value1[k]==x)value1[k]=trow[j];}cout<flag=1;for(j=n-1;j>-1;j--) {int temp;temp=int(trow[j])-48;flag=flag+temp;if(flag==2) {trow[j]='0';flag=1;}else{trow[j]='1';flag=0;break;}}}delete trow;system("pause");return 0;}string calcValue(string value1){int nlp=value1.find('(',0);int nrp=value1.length();string x="",v="";int i=nlp+1;while(nlp>=0) {x=value1.substr(i,1);if(x=="("){nlp=i;i++;}else{if(x==")"){nrp=i;v=calcValueNop(value1.substr(nlp+1,nrp-nlp-1));value1=(nlp>0?value1.substr(0,nlp):"")+v+((nrp+1)<=value1.length()?value1.substr(n rp+1):"");nlp=value1.find('(',0);i=nlp+1;}else{i=i+1;}}if(i>=value1.length()){nlp=value1.find('(',0);i=nlp+1;}}return calcValueNop(value1);}string calcValueNop(string value1){int nnot=value1.find('!',0);while(nnot>=0) {value1=(nnot>0?value1.substr(0,nnot):"")+caclNot(value1.substr(nnot+1,1))+((nnot+ 2)<=value1.length()?value1.substr(nnot+2):"");nnot=value1.find('!',0);}int nand=value1.find('^',0);while (nand>0){value1=((nand-1)>0?value1.substr(0,nand-1):"")+caclAnd(value1.substr(nand-1,1),va lue1.substr(nand+1,1))+((nand+2) <=value1.length()?value1.substr(nand+2):"");nand=value1.find('^',0);}int nOr=value1.find('+',0);while (nOr>0){value1=((nOr-1)>0?value1.substr(0,nOr-1):"")+caclOr(value1.substr(nOr-1,1),value1. substr(nOr+1,1))+((nOr+2)<=value1.length()?value1.substr(nOr+2):"");nOr=value1.find('+',0);}return value1;}string caclAnd(string x,string y){if ((x=="1") && (y=="1")){return "1";}else {return "0";}}string caclOr(string x,string y){if ((x=="0") && (y=="0")){return "0";}else {return "1";}}string caclNot(string x){if (x=="1") {return "0";}else {return "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");
安徽工业大学离散数学实验报告
《离散数学》实验报告专业软件工程班级163班姓名周掌珍学号169074261授课教师杨思春二 O 一七年六月目录实验一联结词的运算实验二集合的运算实验三二元关系的性质判定实验四图的矩阵运算实验一联结词的运算一.实验目的通过上机实验操作,将命题连接词运算融入到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的真值为真。
三.实验内容编写一个程序实现非运算、合取运算、析取运算、异或运算、蕴涵运算、等价运算。
四.算法程序内容格式:新罗马,小五号,行间距固定值18磅#include<stdio.h>int main(){char m;int P,Q;printf("请输入P,Q的真值与逻辑连接词:(P逻辑联结Q)\na:与\tb:或\tc(请先输入0):非\td:蕴含\te:等价\tf:异或\n");scanf("%d%c%d",&P,&m,&Q);switch(m){case 'a': if(P==1&&Q==1) printf("P与Q=1\n");else printf("p合取Q=0\n");break;case 'b': if(P==0&&Q==0) printf("P或Q=0\n");else printf("P或Q=1\n");break;case 'c': if(P==1) printf("非P=0\n");else printf("非P=1\n");break;case 'd': if(P==1&&Q==0) printf("P蕴含Q=0\n");else printf("P蕴含Q=1\n");break;case 'e': if(P==Q) printf("P等价Q=1\n");else printf("P等价Q=0\n");break;case 'f': if(P==Q) printf("P异或Q=0\n");else printf("P异或Q=1\n");break;}五.实验结果实验结果截图大小为:宽(10cm)×高(8cm)六.心得体会内容格式:宋体,五号,行间距固定值18磅实验二集合的运算一.实验目的集合运算主要包括并运算,交运算,相对差,对称差运算,集合论的语言适合于描述和研究离散对象及其关系,所以也是计算机科学与工程的理论基础,在程序设计、关系数据库、排队论、开关理论,形式语言和自动机理论等学科领域中都有重要的应用。
离散数学 实验报告 迷宫最短路径
离散数学迷宫问题从一个迷宫的入口到出口找出一条可通路经。
用一个二维数组MG(0:M,0:N)模拟迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。
MG(1,1)和MG(M-1,N-1)分别为迷宫50输入1. 输入迷宫的大小M行和N列,两者为整数2. 给定MG[M,N]各元素的值(0或1),建立迷宫。
输出是否有通路(YES或NO)样例输入5 51 1 1 1 1 11 0 0 0 0 11 0 0 0 1 11 0 0 1 0 11 0 0 1 0 11 1 1 1 1 1样例输出NO提示1)读入两个整数M,N后,迷宫的大小是0~M和0~N,也就是实际上有M+1行和N+1列2)判断是否有通路主要是判断点(1,1)到点(M-1,N-1)之间是否有通路,第0行、第M行、第1列、第N列的所有值都一定是1。
#include "stdio.h"struct{int i;int j;int di;}stack[10000];int top=-1;int fun(){int mg[500][500],i,j,di,find,N,M,x,y;scanf("%d%d",&M,&N);for(x=0;x<=M;x++)for(y=0;y<=N;y++)scanf("%d",&mg[x][y]);top++;stack[top].i=1; stack[top].j=1; stack[top].di=-1; mg[1][1]=-1;while(top>=0){i=stack[top].i; j=stack[top].j; di=stack[top].di;if(i==M-1&&j==N-1){printf("YES\n");return 0;}find=0;while(di<4&&find==0){di++;if(di==0){i=(stack[top].i)-1; j=stack[top].j;}if(di==1){i=stack[top].i; j=(stack[top].j)+1;}if(di==2){i=(stack[top].i)+1; j=stack[top].j;}if(di==3){i=stack[top].i; j=(stack[top].j)-1;}if(mg[i][j]==0){find=1;break;}}if(find==1){stack[top].di=di;top++;stack[top].i=i; stack[top].j=j; stack[top].di=-1;mg[i][j]=-1;}else{mg[stack[top].i][stack[top].j]=1;top--;}}printf("NO\n");return 0;}int main(){fun();return 0;}。
离散数学实验报告命题逻辑—构造命题公式的真值表
【实验目的】使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。
【实验内容】对给出的任意一个命题公式(不超过四个命题变元),使学生会用C语言的程序编程表示出来,并且能够计算它在各组真值指派下所应有的真值,画出其真值表。
【实验原理】给出任意一个命题公式,我们可以将它用C程序表示出来,并且能够计算它在各组真值指派下所应有的真值(或是逻辑运算的结果)。
这有多种方法。
上面我们已经给出了逻辑连结词的定义,根据这种定义方法,我们也可以把一个命题公式表示成为条件语句中的条件表达式,这样我们就可以得到该命题公式的逻辑运算结果了。
【程序代码】#include <bits/stdc++.h>using namespace std;int a[8][3]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}};int b[8]={0,0,0,0,0,0,0,0};int xa[8]={0,0,0,0,0,0,0,0};int s(char c,int as,int i){//1 true;0 falseif(c=='|'){if(a[i][as]==1||a[i][as+1]==1){return 1;} else{return 0;}}if(c=='&'){if(a[i][as]==1&&a[i][as+1]==1){return 1;} else{return 0;}}if(c=='='){if(a[i][as]==a[i][as+1]){return 1;} else{return 0;}}if(c=='!'){if(a[i][as]==a[i][as+1]){return 0;return 1;}}if(c=='>'){if(a[i][as]==1||a[i][as+1]==0){return 0;} else{return 1;}}}int so(char c,int i,int as){if(c=='|'){if(xa[i]==1||a[i][as+1]==1){return 1;} else{return 0;}}if(c=='&'){if(xa[i]==1&&a[i][as+1]==1){return 1;} else{return 0;}}if(c=='='){if(xa[i]==a[i][as+1]){return 1;} else{return 0;}}if(c=='!'){if(xa[i]==a[i][as+1]){return 0;} else{return 1;}}if(c=='>'){if(xa[i]==1||a[i][as+1]==0){return 0;return 1;}}}int main(void) {string f;cin>>f;char c1=f[1];char c2=f[3];for(int i=0;i<8;i++){for(int j=0;j<3;j++){printf("%d ",a[i][j]);}printf("\n");}for(int i=0;i<8;i++){xa[i]=s(c1,0,i);}for(int i=0;i<8;i++){b[i]=so(c2,i,1);}for(int i=0;i<8;i++){printf("%d\n",b[i]);}return 0;}【实验结果】【实验心得】。
离散数学实验报告.doc
计算机科学与工程学院实验报告实验题目:判断关系R的性质课程名称:离散数学实验类型:□演示性□验证性专业: 班级:学生姓名:学号:实验日期:2011年12年19日实验地点:实验学时:实验成绩:指导教师签字:2011年12月25日实验题目:判断关系R的性质实验原理:1.自反与反自反性质从给定的关系矩阵来断判关系R是否为自反是很容易的。
若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)的主对角线元素均为0,则R是反自反关系;若M(R的关系矩阵)的主对角线元素既有1又有0,则R既不是自反关系也不是反自反关系。
本算法可以作为判等价关系算法的子程序给出。
2.对称与反对称性质若M(R的关系矩阵)为对称矩阵,则R是对称关系;若M为反对称矩阵,则R是反对称关系。
判断对称性,对于i=2,3,….,n;j=1,2,……,i-1,若存在m ij=m ji,则R是对称的;3.传递性质一个关系R的可传递性定义告诉我们,若关系R是可传递的,则必有:m ik=1∧m kj=1⇒ m ij=1。
这个式子也可改写成为: m ij=0⇒ m ik=0∨m kj=0。
我们可以根据后一个公式来完成判断可传递性这一功能的。
可传递性也是等价关系的必要条件,所以,本算法也可以作为判等价关系算法的子程序给出。
实验要求:写出类c的算法并编写一个程序判断给定集合上的关系是否为自反的。
写出类c的算法并编写一个程序判断给定集合上的关系是否为对称的。
写出类c的算法并编写一个程序判断给定集合上的关系是否为传递的。
实验流程图:NY实验中用到的函数:input(); //输入矩阵函数judge(); //判断输入矩阵是否正确函数 analagmatic(); //判断自反关系函数 symmetric(); //判断对称关系函数 transmit(); // 判断传递关系函数 开始输入n 阶矩阵M 输入矩阵各元素的值 判断出矩阵的自反性、对称性、传递性。
离散数学(集合的运算)实验报告
大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络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中元素存储完毕。
离散数学实验报告四个实验
《离散数学》课程设计学院计算机学院学生姓名学号指导教师评阅意见提交日期 2011 年 11 月 25 日引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。
它是研究离散量(如整数、有理数、有限字母表等)的数学结构、性质及关系的学问。
它一方面充分地描述了计算机科学离散性的特点,为学生进一步学习算法与数据结构、程序设计语言、操作系统、编译原理、电路设计、软件工程与方法学、数据库与信息检索系统、人工智能、网络、计算机图形学等专业课打好数学基础;另一方面,通过学习离散数学课程,学生在获得离散问题建模、离散数学理论、计算机求解方法和技术知识的同时,还可以培养和提高抽象思维能力和严密的逻辑推理能力,为今后爱念族皮及用计算机处理大量的日常事务和科研项目、从事计算机科学和应用打下坚实基础。
特别是对于那些从事计算机科学与理论研究的高层次计算机人员来说,离散数学更是必不可少的基础理论工具。
实验一、编程判断一个二元关系的性质(是否具有自反性、反自反性、对称性、反对称性和传递性)一、前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二、数学原理:自反、对称、传递关系设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R 就是A×B的一个合于{()∈A×}的子集合设R是集合A上的二元关系:自反关系:对任意的x∈A,都满足<>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的⇔(∀x)((x∈A)→(<>∈R))=1对称关系:对任意的∈A,如果<>∈R,那么<>∈R,则称关系R是对称的,或称R具有对称性,即R在A上是对称的⇔ (∀x)(∀y)((x∈A)∧(y∈A)∧(<>∈R)→(<>∈R))=1传递关系:对任意的∈A,如果<>∈R且<>∈R,那么<>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x∈A)∧(y∈A)∧(z ∈A)∧((<>∈R)∧(<>∈R)→(<>∈R))]=1三、实验原理:通过二元关系与关系矩阵的联系,可以引入N维数组,以数组的运算来实现二元关系的判断。
