离散数学实验报告(三)

合集下载

离散实验报告

离散实验报告

离散实验报告专业:数学与应用数学班级: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该命题公式不存在主合取范式。

离散数学实验三

离散数学实验三

实验报告(2014 / 2015 学年第一学期)课程名称离散数学实验名称偏序关系中盖住关系的求取及格论中有补格的判定实验时间2014 年11 月28 日指导单位南京邮电大学指导教师罗卫兰学生姓名沈一州班级学号B12040920学院(系) 计算机软件学院专业NIIT(软嵌)实验报告实验名称偏序关系中盖住关系的求取及格论中有补格的判定指导教师罗卫兰实验类型 Windows+VC 实验学时 4 实验时间 11.28 一、实验目的和要求内容:编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格。

cout<<"因为"<<a[i]<<"∨("<<a[j]<<"∧"<<a[k]<<")!=("<<a[i]<<"∨"<<a[j]<<")∧("<<a[i]<<"∨"<<a[k]<<"),所以这不是一个布尔格。

\n";//验证a∨(b∧c)==(a∨b) ∧ (a∨c)break;}}if(flag)break;}if(flag)break;}if(!flag)cout<<"因为所有成员都满足分配性,所以这是一个分配格。

\n";四、运行结果:首先是输入界面:然后输入24:然后询问是否再次输入:这次输入99:特殊情况,若输入0或者负数:此时会一直提示输入错误直到输入成功。

若输入1:若输入非Y,则退出程序:实验报告五、实验小结这次题目要求是根据整除关系建立偏序关系,集合由一个正整数的因子所构成,所以该偏序集中的最大下界为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磅五.实验结果六.心得体会通过编程,学会了析取、合取、单条件连接词、双条件连接词的用法。

离散数学计算机实验报告

离散数学计算机实验报告

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

离散数学实验报告3

离散数学实验报告3

《离散数学》实验报告学院专业指导教师学号姓名提交日期实验三命题公式的范式一.实验目的熟悉逻辑运算否定、合取、析取、蕴含、等价规则,利用程序语言实现命题公式的真值表运算,求公式的主析取范式及主合取范式。

二.实验内容(一)用真值表法求出下列公式的主析取范式及主合取范式。

p ∧(q ↔r)(二)选课方案某学生要从A、B 、C 三门选修课中选修1~2门,根据学校的排课计划以及该生的实际情况,选择时必须满足以下条件:(1) 若选择A,则必须选择C;(2) 若选择B,则不能选择C;(3) 若不选择C,则可选择A或B。

问该生有几种选择方案。

(三)讨论公司派遣方案:派小李或小张去上海出差。

若派小李去,则小赵要加班。

若派小张去,小王也得去。

但小赵没有加班。

问公司是如何派遣的。

令p:小李去上海q:小张去上海r: 小赵加班s: 小王去上海三. 实验过程(一)求公式的主析取范式及主合取范式。

1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

(二)选课方案- 1 -1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

(三)讨论公司派遣方案:1. 算法分析:列出命题公式,说明程序设计思路。

2. 程序代码:3.实验数据及结果分析列出求解的真值表,并筛选出正确答案。

- 2 -。

离散数学试验报告

离散数学试验报告

学院理学院学生姓名 xxx学号 xxxxxxxxxxx实验:编程二元关系的传递性判别,二元关系闭包方法一.前言引语:二元关系是离散数学中重要的内容。

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

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

二.数学原理: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))]=12.自反闭包、对称闭包、传递闭包:设R是定义在A上的二元关系,若存在A 上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆R〞。

则称R′为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)、(s(R)和t(R))。

三.实验编程语言:c++四.实验程序源代码:#include<iostream>using namespace std;int cdx(int a[100][100],int n){int b[100][100],i,j;for(i=1;i<=n-1;i++){for(j=1;j<=n;j++){if(a[1][j]==a[i+1][j] && a[1][j]==0)b[i][j]=0;elseb[i][j]=1;}for(j=1;j<=n;j++){if(b[i][j]!=a[1][j])return 0;}}return 1;}void zfbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[i][i]=1;a[j][j]=1;}}}cout<<"自Á?反¤¡ä闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void dcbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[j][i]=1;}}}cout<<"对?称?闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void cdbb(int a[100][100],int n){int i,j,k;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){for(k=1;k<=n;k++){a[i][k]=a[i][k]+a[j][k];}}}}cout<<"传ä?递ÌY闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void main(){int i,j,n,a[100][100],sel,ins;cout<<"请?输º?入¨?二t元a关?系¦Ì矩?阵¨®维?数ºyn"<<endl;cin>>n;cout<<"请?按ã¡äa[1,1],a[1,2]...a[1,n],a[2,1]...a[n.n]的Ì?顺3序¨©输º?入¨?关?系¦Ì矩?阵¨®的Ì?元a素?值¦Ì(ꡧ0,ê?1)ê?"<<endl;for(i=1;i<=n;i++)for(j=1;j<=n;j++){cin>>a[i][j];}INDEX:cout<<"请?输º?入¨?要©a判D定¡§的Ì?性?质¨º:êo"<<endl;cout<<"1、¡é传ä?递ÌY性?"<<endl;cout<<"2、¡é自Á?反¤¡ä闭À?包㨹"<<endl;cout<<"3、¡é对?称?闭À?包㨹"<<endl;cout<<"4、¡é传ä?递ÌY闭À?包㨹"<<endl;cout<<"5、¡é退ª?出?"<<endl;cin>>sel;if(sel==1){ins=cdx(a,n);if(ins==0)cout<<"该?二t元a关?系¦Ì不?具?有®D传ä?递ÌY性?。

离散数学实验报告

离散数学实验报告

“离散数学”实验报告目录一、实验目的 (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)合取:二元命题联结词。

离散数学(集合的运算)实验报告

离散数学(集合的运算)实验报告

大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络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. 熟悉掌握离散逻辑运算规则,包括合取、析取、条件、双条件等。

2. 利用C语言编程实现离散逻辑运算,包括逻辑非、合取、析取、蕴含、双条件等。

3. 理解真值表的概念,并能够根据真值表判断逻辑表达式的真假。

三、实验内容1. 实现逻辑非运算2. 实现合取运算3. 实现析取运算4. 实现蕴含运算5. 实现双条件运算6. 根据真值表判断逻辑表达式的真假四、实验步骤1. 逻辑非运算(1)输入一个命题变量P的真值(0或1);(2)根据逻辑非运算规则,输出P的逻辑非值(若P为0,则输出1;若P为1,则输出0)。

2. 合取运算(1)输入两个命题变量P和Q的真值(0或1);(2)根据合取运算规则,输出P和Q的合取值(若P和Q均为1,则输出1;否则输出0)。

3. 析取运算(1)输入两个命题变量P和Q的真值(0或1);(2)根据析取运算规则,输出P和Q的析取值(若P和Q至少有一个为1,则输出1;否则输出0)。

4. 蕴含运算(1)输入两个命题变量P和Q的真值(0或1);(2)根据蕴含运算规则,输出P蕴含Q的值(若P为1且Q为1,则输出1;否则输出0)。

5. 双条件运算(1)输入两个命题变量P和Q的真值(0或1);(2)根据双条件运算规则,输出P双条件Q的值(若P和Q的真值相同,则输出1;否则输出0)。

6. 根据真值表判断逻辑表达式的真假(1)输入一个逻辑表达式;(2)生成该逻辑表达式的真值表;(3)根据真值表判断逻辑表达式的真假。

五、实验结果与分析1. 通过编程实现离散逻辑运算,验证了逻辑运算规则的正确性;2. 理解了真值表的概念,并能够根据真值表判断逻辑表达式的真假;3. 提高了编程能力,熟悉了C语言的基本语法和逻辑运算。

离散数学教学实践活动(3篇)

离散数学教学实践活动(3篇)

第1篇一、前言离散数学是计算机科学、信息科学、数学等学科的基础课程,对于培养学生的逻辑思维、抽象思维和算法设计能力具有重要意义。

为了提高离散数学的教学效果,我们开展了一系列教学实践活动,旨在通过实践操作,让学生更加深入地理解和掌握离散数学的基本概念、方法和应用。

二、活动背景随着计算机科学的飞速发展,离散数学在各个领域中的应用越来越广泛。

为了让学生更好地适应未来社会的发展需求,我们决定开展离散数学教学实践活动,通过实际操作和项目实践,提升学生的综合素质。

三、活动目标1. 提高学生对离散数学基本概念的理解和掌握;2. 培养学生的逻辑思维和抽象思维能力;3. 提升学生的算法设计和编程能力;4. 拓展学生的知识面,激发学习兴趣。

四、活动内容1. 离散数学基本概念讲解与练习在活动开始阶段,我们首先对离散数学的基本概念进行了讲解,包括集合、关系、函数、图论、组合数学等。

通过课堂讲解、例题分析和练习,让学生对离散数学的基本概念有清晰的认识。

2. 算法设计与实现为了让学生更好地理解算法设计,我们选择了几个具有代表性的算法,如排序算法、查找算法、图搜索算法等。

在教师的指导下,学生分组进行算法设计,并使用编程语言实现算法。

通过这一环节,学生能够将理论知识与实际编程相结合,提高编程能力。

3. 项目实践为了让学生将离散数学知识应用于实际项目中,我们设计了几个项目实践任务。

例如,设计一个基于图的社交网络分析系统、实现一个基于组合数学的密码生成器等。

学生分组进行项目实践,通过讨论、分析和编程,完成项目任务。

4. 案例分析在活动过程中,我们选取了几个与离散数学相关的实际案例进行分析,如网络安全、人工智能、大数据等。

通过分析案例,让学生了解离散数学在各个领域的应用,激发学生的学习兴趣。

5. 交流与分享为了促进学生的交流与合作,我们组织了小组讨论和展示活动。

学生分组讨论各自在项目实践中的心得体会,并在全班进行展示。

通过交流与分享,学生能够互相学习、取长补短,共同提高。

离散数学实验3报告讲解

离散数学实验3报告讲解

离散数学实验3报告讲解实验报告⽬录第⼀章实验概述 (3)1.1实验⽬的 (3)1.2实验内容 (3)1.3实验环境 (3)第⼆章实验原理和实现过程 (4)2.1实验原理 (4)2.1.1建⽴图的邻接矩阵,判断图是否连通 (4)2.1.2 计算任意两个结点间的距离 (4)2.1.3对不连通的图输出其各个连通⽀ (5)2.2实验过程(算法描述) (5)2.2.1 程序整体思路 (5)2.2.2具体算法流程 (5)第三章实验数据及结果分析 (7)3.1建⽴图的邻接矩阵并判断图是否连通的功能测试及结果分析 (7)3.1.1输⼊⽆向图的边 (7)3.1.2建⽴图的连接矩阵 (8)3.2其他功能的功能测试和结果分析 (9)3.2.1计算节点间的距离 (9)3.2.2判断图的连通性 (9)3.2.3输出图的连通⽀ (10)3.2.4退出系统 (10)第四章实验收获和⼼得体会 (11)4.1实验收获 (11)4.2⼼得体会 (12)第五章实验源程序清单 (13)5.1程序代码 (13)第⼀章实验概述1.1 实验⽬的理解图论的基本概念,图的矩阵表⽰,图的连通性,图的遍历,以及求图的连通⽀⽅法。

通过实验,帮助学⽣更好地掌握计算机科学技术常⽤的离散数学中的概念、性质和运算,培养逻辑思维;通过实验提⾼学⽣编写实验报告、总结实验结果的能⼒,提⾼理论联系实际的能⼒;使学⽣具备程序设计的思想,能够独⽴完成简单的算法设计和分析。

1.2 实验内容以偶对的形式输⼊⼀个⽆向简单图的边,建⽴该图的邻接矩阵,判断图是否连通(A),并计算任意两个结点间的距离(B),对不连通的图输出其各个连通⽀(C)。

注意:题⽬类型分为A,B,C三类,其中A为基本题,完成A类题⽬可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越⾼。

基本要求如下:程序需具有基本的容错控制,在输⼊错误时有处理⼿段;程序界⾯友好,需要输⼊的地⽅有输⼊说明,说明输⼊的内容和格式要求等;实验原理和实现过程应该详细分析问题,给出解决思路,描述算法思想,不能⽤源程序代替算法;测试数据应全⾯,包括⾮法输⼊的处理结果等都应包含在内。

离散数学实验报告

离散数学实验报告

离散数学闭包实验报告专业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.【实验题目】命题逻辑(3)2.【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。

3.【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。

4. 【实验要求】通过以下界面提示实现相应逻辑运算,给出具体逻辑值**************************************************************** 请输入5位董事(分别用A、B、C、D、E表示)的表决值(1或0):A董事表决值(1或0):B董事表决值(1或0):C董事表决值(1或0):D董事表决值(1或0):E董事表决值(1或0):出结果/继续/结束(y/c/exit):****************************************************************5. 【算法描述】①某公司董事会由5个董事组成,公司要对某项决策进行投票表决,只要半数(3位董事)以上都同意(用1表示同意,用0表示不同意)决策通过,否则不通过。

试写出5位董事表决的命题公式(提示:列出表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式)。

②上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。

③输入5人表决值(同意为1,不同意为0),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。

④输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。

6. 【源程序(带注释)】#include <iostream>#include <cstdlib>#include <string.h>using namespace std;int main(){char a[100],b[100],c[100],d[100],e[100]; //定义5个字符型数组,用来储存ABCDE5个董事的表决值char f[100]; //f数组为接收出结果/继续/结束的字符void print(); //声明打****的函数for(;;){print();cout<<"\n\t请输入5位董事(分别用A、B、C、D、E表示)的表决值(1或0):\n\n";cout<<"\tA董事表决值(1或0):\n\tB董事表决值(1或0):\n\tC董事表决值(1或0):\n\tD董事表决值(1或0):\n\tE董事表决值(1或0):";cout<<"\n\n\t出结果/继续/结束(y/c/exit):\n";print();cout<<"请输入A董事表决值(1或0):";cin>>a;while(strcmp(a,"0")!=0 && strcmp(a,"1")!=0)//利用strcmp判断字符串,排除其他错误{print();cout<<"A董事表决值输入有误,请重新输入!\n";print();cout<<"请输入A董事表决值(1或0):";cin>>a;}print();cout<<"请输入B董事表决值(1或0):";cin>>b;while(strcmp(b,"0")!=0 && strcmp(b,"1")!=0){print();cout<<"B董事表决值输入有误,请重新输入!\n";print();cout<<"请输入B董事表决值(1或0):";cin>>b;print();cout<<"请输入C董事表决值(1或0):";cin>>c;while(strcmp(c,"0")!=0 && strcmp(c,"1")!=0){print();cout<<"C董事表决值输入有误,请重新输入!\n";print();cout<<"请输入C董事表决值(1或0):";cin>>c;}print();cout<<"请输入D董事表决值(1或0):";cin>>d;while(strcmp(d,"0")!=0 && strcmp(d,"1")!=0){print();cout<<"D董事表决值输入有误,请重新输入!\n";print();cout<<"请输入D董事表决值(1或0):";cin>>d;}print();cout<<"请输入E董事表决值(1或0):";cin>>e;while(strcmp(e,"0")!=0 && strcmp(e,"1")!=0){print();cout<<"E董事表决值输入有误,请重新输入!\n";print();cout<<"请输入E董事表决值(1或0):";cin>>e;}print();cout<<"您输入的董事会表决值为:\n";cout<<"\tA董事表决值:"<<a<<"\n\tB董事表决值:"<<b<<"\n\tC董事表决值:"<<c<<"\n\tD董事表决值:"<<d<<"\n\tE董事表决值:"<<e<<endl;print();for(;;){cout<<"\t出结果/继续/结束(y/c/exit):";cin>>f;if(strcmp(f,"y")==0)if((a[0]+b[0]+c[0]+d[0]+e[0])>242) {print();cout<<"表决通过!\n";print();}//利用ASC II码判断表决值是否大于242(10进制为3)else{print();cout <<"表决不通过。

离散数学上机实验报告

离散数学上机实验报告

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

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

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

《离散数学》课程设计学院计算机学院学生姓名学号指导教师评阅意见提交日期 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维数组,以数组的运算来实现二元关系的判断。

离散数学实验报告(极大相容类)

离散数学实验报告(极大相容类)

华侨大学离散数学实验报告极大相容类姓名:吴非凡专业:计算机科学与技术班级: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++的知识已经逐渐淡忘,编译过程中出现的错误都是很低级的错误,甚至于有一个小错误我竟耗费了不短的时间才找到,这又一次提醒了我身为一名程序员,必须经常动手,找找“手感”,而不能仅仅在脑中模拟,不去实践。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验内容:Kruskal算法求解最小生成树
二、实验源码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX 100
struct Node{
int vertex1;
int vertex2;
int weight;
struct Node *next;
};
typedef struct Node * Edge;
Edge head = NULL;
int visited[MAX];
Edge read(){
int v1, v2, w;
Edge newNode = NULL, pointer = NULL;
while(1){
scanf("%d %d %d", &v1, &v2, &w);
if(v1 == -1 || v2 == -1 || w == -1)
break;
newNode = (Edge)malloc(sizeof(struct Node));
newNode->vertex1 = v1;
newNode->vertex2 = v2;
newNode->weight = w;
newNode->next = NULL;
pointer = head;
if(pointer == NULL)
head = newNode;
else{
if(newNode->weight < pointer->weight){
newNode->next = pointer;
head = newNode;
}else{
while(pointer != NULL && pointer->next != NULL){
if(pointer->weight < newNode->weight && newNode->weight < pointer->next->weight){
newNode->next = pointer->next;
pointer->next = newNode;
break;
}
pointer = pointer->next;
}
pointer->next = newNode;
}
}
}
return head;
}
void printLink(Edge edge){
Edge pointer = edge;
printf("\n\n图中所有边按权值递增的排序如下: \n");
while(pointer != NULL){
printf("[%d %d]", pointer->vertex1, pointer->vertex2);
printf("(%d)",pointer->weight);
if(pointer->next != NULL)
printf(" ==> ");
pointer = pointer->next;
}
printf("\n");
}
void kruskal(Edge edge, int vexnum){
int visitedEdgeNum = 0, weight = 0;
printf("\n最小生成树的路径为: \n");
while(visitedEdgeNum < vexnum){
if(visited[edge->vertex1] == 0 || visited[edge->vertex2] == 0){ printf("[%d %d]", edge->vertex1, edge->vertex2);
printf("(%d) ",edge->weight);
weight += edge->weight; visitedEdgeNum++;
visited[edge->vertex1] = 1;
visited[edge->vertex2] = 1;
}
edge = edge->next;
if(edge == NULL){
break;
}
}
printf("\n\n最短路径长度为:%d \n\n", weight);
}
void main(){
int vexnum, i;
Edge edge = NULL;
printf("请输入定点个数、各顶点和权值:\n输入形式如下:n i j w ... -1 -1 -1\nn 表示图的顶点个数,i j w 表示从顶点i 到顶点j 的权为w 的一条边,均以-1结尾。

\n");
scanf("%d", &vexnum);
for(i=0; i<vexnum; i++)
visited[i] = 0;
edge = read();
printLink(edge);
kruskal(edge, vexnum);
}。

相关文档
最新文档