离散数学关系性质的C++或C语言判断实验报告

合集下载

中南大学离散数学实验报告(实验ABC)

中南大学离散数学实验报告(实验ABC)

“离散数学”实验报告(实验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间的距离通过检验A l中使得a ij为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)。

离散实验报告

离散实验报告

离散实验报告专业:数学与应用数学班级: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)中南大学离散数学实验报告

离散数学实验报告目录第一章实验概述 (3)1.1实验目的 (3)1.2实验内容 (3)1.3实验环境 (3)第二章实验原理和实现过程 (4)2.1实验原理 (4)2.1.1 逻辑连接词的运算 (4)2.1.2 真值表与主范式 (4)2.2实验过程(算法描述) (4)2.2.1 程序整体思路 (4)2.2.2 实现实验A算法 (4)2.2.3 实现实验BC算法 (5)第三章实验数据及结果分析 (7)3.1主程序ABC.C的功能测试及结果分析 (7)3.1.1输入数字“1” (7)3.1.2输入数字“2” (7)3.1.3输入数字“3” (8)3.1.4输入其他字符时 (8)3.2实验A的功能测试和结果分析 (8)3.2.1测试数据为“p=T和q=F” (9)3.2.2测试数据为“p=F和q=F” (9)3.2.3测试数据为“p=A和q=F” (9)3.2.4测试数据为“p=T和q=A” (9)3.2.5测试数据为“p=F和q=F”,之后返回主界面 (10)3.3实验BC的功能测试和结果分析 (10)3.3.1测试数据为“a&b|c#” (10)3.3.2测试数据为“(a>b)|(c&d)#” (11)3.3.3测试数据为“(a>b)|(c&d)” (12)3.3.4测试数据为“a&b|c” (13)第四章实验收获和心得体会 (14)4.1实验收获 (14)4.2心得体会 (14)第五章实验源程序清单 (15)5.1主程序ABC.C的代码 (15)5.2头文件A.H的代码 (17)5.3头文件BC.H的代码 (20)第一章实验概述1.1 实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题,具体说来,有以下几点——1. 掌握离散数学中涉及的相关概念。

2. 培养学生的逻辑思维能力和算法设计的思想。

3. 熟练掌握C/C++语言程序设计的基本方法和各种调试手段。

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]实验成绩:202212202201016学号:【实验题目】1.命题逻辑实验四【实验目的】2.掌握用计算机求集合的交、并、差和补运算的方法。

【实验内容】3.编程实现集合的交、并、差和补运算。

【实验要求】4、++语言编程实现C或C【算法描述】5.10},,,9,6,7,,C,E表示集合。

假定A={1,34,5,(1)用数组AB10},9,,8,7,4,5,6,34B={2,,3,,7,8,10},E={1,2,,输入数据时要求检查数据是否重复(集合中的E(全集),B,输入数组A 的子集。

B是集合E,要求集合数据要求不重复)A,置成空集。

以下每一个运算都要求先将集合CB}且某)二个集合的交运算:AB={某|某A(2C中的元素进行比较,将相同的元素放在数组中元素逐一与数组B把数组AB的交。

便是集合中,数组CA和集合C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j])c[k++]=a[i];B}或某3)二个集合的并运算:AB={某|某A(中中的元素逐一与数组AC中。

将数组B中各个元素先保存在数组把数组AB和集合C便是集合A 的元素进行比较,把不相同的元素添加到数组C中,数组的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]==c[j])break;if(j==m){c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={某|某A且某B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

C语言算法:for(j=0;j<m;j++){for(i=0;i<n;i++){if(A[j]==B[i]){C[k]=A[j];k++;break;}if(j==n){C[k]=A[i];k++;}}A}且~A=B-A={某|某B某)集合的补运算:(5把不相同的元素保存到中的元素进行比较,E中的元素逐一与数组A将数组关于集合中,数组数组CC便是集合AE的补集。

离散数学实验报告

离散数学实验报告

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

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

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

离散数学实验报告命题逻辑—构造命题公式的真值表

离散数学实验报告命题逻辑—构造命题公式的真值表

【实验目的】使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。

【实验内容】对给出的任意一个命题公式(不超过四个命题变元),使学生会用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;}【实验结果】【实验心得】。

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

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

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

离散数学上机实验报告

离散数学上机实验报告

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

离散数学实验

离散数学实验

离散数学实验实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。

二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q 的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。

#include#includeint main(){int p,q,hequ,xiqu,yunhan,dengjia;printf("请输入命题P和Q的真值(0或1)");scanf("%d%d",&p,&q);if(p!=0&&p!=1||q!=0&&q!=1)printf("输入错误");else{if(p==0&&q==0){hequ=0;xiqu=0;yunhan=1;dengjia=1;}else if(p==0&&q==1){hequ=0;xiqu=1;yunhan=1;dengjia=0;}else if(p==1&&q==0){hequ=0;xiqu=1;yunhan=0;dengjia=0;}else if(p==1&&q==1){hequ=1;xiqu=1;yunhan=1;dengjia=1;}printf("合取的真值为:%d\n",hequ);printf("析取的真值为:%d\n",xiqu);printf("蕴含的真值为:%d\n",yunhan);printf("等价的真值为:%d\n",dengjia);system("pause");return 0;}}实验二两个集合运算(交、并、补)一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。

离散数学实验报告

离散数学实验报告

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

最新离散数学集合运算C++或C语言实验报告

最新离散数学集合运算C++或C语言实验报告

离散数学实验报告专业班级:12级计算机本部一班姓名:鲍佳珍学号:201212201401016 实验成绩:1.【实验题目】命题逻辑实验四2.【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。

3.【实验内容】编程实现集合的交、并、差和补运算。

4、【实验要求】C或C++语言编程实现5.【算法描述】(1)用数组A,B,C,E表示集合。

假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。

以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。

C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。

将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

C语言算法:for (j=0;j<m;j++){ for (i=0;i<n;i++){ if (A[j]= =B[i]){ C[k]=A[j];k++;break; }if (j= =n){ C[k]=A[i];k++; } }(5)集合的补运算:~A=B-A={x|x∈B且x∉A}将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。

离散数学实验报告)

离散数学实验报告)

离散数学实验报告)离散数学实验报告()————————————————————————————————作者:————————————————————————————————⽇期:《离散数学》实验报告专业⽹络⼯程班级姓名学号授课教师⼆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);intf;if(a==0&&b==0)f=0;else f=1;printf("析取的结果为%d\n",f);intg;if(a==1&&b==0)g=0;else g=1;printf("单条件的结果为%d\n",g);inth;if(a==b)h=1;else h=0;printf("双条件的结果为%d\n",h);}内容格式:新罗马,五号,⾏间距固定值18磅五.实验结果六.⼼得体会通过编程,学会了析取、合取、单条件连接词、双条件连接词的⽤法。

离散数学实验报告

离散数学实验报告

实验一一实验内容(选作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;}}七收获与体会通过这次实验使我了解了一些数理逻辑问题可以通过用计算机编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。

离散数学计算笛卡尔乘积C++或C语言实验报告

离散数学计算笛卡尔乘积C++或C语言实验报告

离散数学实验报告专业班级:12级计算机本部一班姓名:鲍佳珍学号:201212201401016 实验成绩:1.【实验题目】通过编程实现求给定集合A和B的笛卡儿乘积C(C=A×B)的运算。

2.【实验目的】已知所给集合A和B,求A与B的笛卡儿乘积C(C=A×B)。

假设集合A={1,2,3,4,5},集合B={2,3,8,9,10},3、实验原理与实现过程笛卡儿集合:设A,B是两个集合,称集合A×B={<x,y>|(x∈A)∧(y∈B)}为集合A与B的笛卡儿积。

换句话说,笛卡儿乘积是以有序偶为元素组成的集合,它的定义为C={<x,y>|x∈A∧y∈B}。

所以,欲求笛卡儿乘积。

只需取尽由集合A的元素及集合B的元素,并构成序偶<ai ,bi>送入C之中即可。

算法描述:。

(1)将集合A的元素个数送入N。

(2)将集合B的元素个数送入M。

(3)1⇒i。

(4)若i>N,则结束。

(5)1⇒j。

(6)若j>M,则转(9)。

(7)<ai ,bj>⇒C。

(8)j+1⇒j,转(6)。

(9)i+1⇒i,转(4)。

4、C或C++语言编程实现将实验内容与结果按实验报告格式要求填写并上传。

5. 【算法描述】1.实验原理真值表:表征逻辑事件输入和输出之间全部可能状态的表格。

列出命题公式真假值的表。

通常以1表示真,0 表示假。

命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。

真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。

2.实验过程首先是输入一个合理的式子,生成相应真值表,然后用函数运算,输出结果:要求可生成逻辑非、合取、析取、蕴含、双条件表达式的真值表,例如:输入 !a输出真值表如下:a !a0 110输入a&&b输出真值表如下:a b a&&b0 0 00 1 01 0 01 1 1输入a||b输出真值表如下:a b a||b0 0 00 1 11 0 11 1 1输入a->b输出真值表如下:a b a->b0 0 10 1 11 0 01 1 1输入a<>b (其中<>表示双条件)输出真值表如下:a b a<>b0 0 10 1 01 0 01 1 16.【源程序(带注释)】#include<stdio.h>#include<iostream.h>int main(){int i,j,m,n,k;int a[30],b[30];printf("欢迎使用");printf("请输入集合A的元素个数:");scanf("%d",&m);printf("请输入集合B的元素个数:");scanf("%d",&n);cout<<endl;for(i=0;i<m;i++){printf("请输入集合A的第%d个数:",i+1);scanf("%d",&a[i]);} //输入集合A的元素cout<<endl;for(j=0;j<n;j++){printf("请输入集合B的第%d个数:",j+1); //输入集合B的元素scanf("%d",&b[j]);}k=0;printf("c={");for(i=0;i<m;i++){for(j=0;j<n;j++){printf("<%d,%d>",a[i],b[j]);k++;}} //输出最后结果printf("}\n");return 0;}7.【实验结果与分析总结(含运行结果截图)】。

离散数学实验

离散数学实验

实验一:逻辑真值计算
一、实验目的 熟悉联结词合取、析取、条件和双条件的概念, 编程计算其真值。 二、实验内容 从键盘输入两个命题P和Q的真值,求它们的合取、 析取、条件和双条件的真值。用C语言实现。 三、实验报告和要求 列出实验目的、实验原理、实验内容、实验步骤、 实验结果与分握求关系的自反闭包、对称闭包、传递闭包的 求法,熟悉两种求传递闭包的算法。 二、实验内容 从键盘输入一个关系的关系矩阵,计算它的自发闭 包、对称闭包和传递闭包。用C语言实现。 三、实验报告和要求 列出实验目的、实验原理、实验内容、实验步骤、 实验结果与分析,实验结论,源程序。

离散数学-逻辑学实验报告

离散数学-逻辑学实验报告

离散数学--逻辑学实验报告理学院 11信息与计算科学1班 *** 2011326630131一、实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。

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

(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三、实验环境C或C++语言编程环境实现。

四、实验源代码I.实验一#include <iostream>using namespace std;void main(){int p,q;cout<<"请输入命题变元P的真值: ";cin>>p;cout<<"请输入命题变元Q的真值: ";cin>>q;if(q!=0 && p!=0) cout<<"P、Q合取的真值=1"<<endl;else cout<<"P、Q合取的真值=0"<<endl;if(q!=0 || p!=0) cout<<"P、Q析取的真值=1"<<endl;else cout<<"P、Q析取的真值=0"<<endl;if(p!=0 && q==0) cout<<"P→Q的真值=0"<<endl;else cout<<"P→Q的真值=1"<<endl;if(p==q) cout<<"P←→Q的真值=1"<<endl;else cout<<"P←→Q的真值=0"<<endl;}II.实验二#include<iostream>#include<string>#include <sstream>#include <string.h>using namespace std;int suan(int x2,int y2,int n2){int h1=0,h2=0,h3=0,h4=0;if(x2!=0 && y2!=0) h1=1;else h2=0; //合取if(x2!=0 || y2!=0) h2=1;else h2=0; //析取if(x2!=0 && y2==0) h3=0;else h3=1; //条件if(x2==y2) h4=1;else h4=0; //双条件if(n2==0) return h1;else if(n2==1) return h2;else if(n2==2) return h3;else if(n2==3) return h4;}int zhenzhi(int x1,int y1,int z1,int n1,int m1){int zhen1,zhen2;if(n1>=2 && m1<=1) //比较两个运算符优先{zhen1=suan(y1,z1,m1);zhen2=suan(x1,zhen1,n1); //调用suan函数计算两个命题经计算后的真值}else{zhen1=suan(x1,y1,n1);zhen2=suan(zhen1,z1,m1);}return zhen2;}string num2str(int i) //数字转字符串函数{stringstream ss;ss<<i;return ss.str();}void main(){char a[4]={'&','|','>','<'};string str1,zhuxi="",zhuhe="";int n,m,ji;int t=0;int k=0;cout<<"请输入命题公式(合取:& 析取:| 条件:> 双条件:<)"<<endl;cin>>str1;for(int i=0;i<4;i++){if(str1[1]==a[i]) n=i;if(str1[3]==a[i]) m=i; //记录所输入运算符的编号,利于计算}cout<<str1<<"的真值表如下:"<<endl;cout<<"P Q R 真值"<<endl;for(int x=0;x<2;x++) //利用三重循环,分别计算真值表{for(int y=0;y<2;y++){for(int z=0;z<2;z++){ji=zhenzhi(x,y,z,n,m);cout<<x<<" "<<y<<" "<<z<<" "<<ji<<endl;if(ji==1){t++;if(t==1) zhuxi=zhuxi+"("+num2str(x)+"P∧"+num2str(y)+"Q∧"+num2str(z)+"R)"; //记录主析取函数PQR的值,并叠加字符串else zhuxi=zhuxi+"∨("+num2str(x)+"P∧"+num2str(y)+"Q∧"+num2str(z)+"R)";}if(ji==0){k++;if(k==1) zhuhe=zhuhe+"("+num2str(1-x)+"P∨"+num2str(1-y)+"Q ∨"+num2str(1-z)+"R)"; //记录主合取函数PQR的值,并叠加字符串else zhuhe=zhuhe+"∧("+num2str(1-x)+"P∨"+num2str(1-y)+"Q∨"+num2str(1-z)+"R)";}}}}cout<<"0表示命题的非命题,1表示命题本身"<<endl;cout<<"主析取范式:"<<zhuxi<<endl;cout<<"主合取范式:"<<zhuhe<<endl;}五、运行结果1.实验一2.实验二六、感悟经过这次实验,确实让我加深了对真值表,主范式的了解。

中南大学离散数学实验报告(实验2ac)

中南大学离散数学实验报告(实验2ac)

“离散数学”实验报告(实验2AC)专业班级学号姓名日期:目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现进程(算法描述) (3)A题型 (3)C题型 (4)五、实验数据及结果分析 (7)A题型 (7)B题型 (9)六、源程序清单 (11)A题型 (11)B题型 (12)七、其他收成及体会 (18)一、实验目的把握关系的概念与性质,大体的关系运算,关系的各类闭包的求法。

明白得等价类的概念,把握等价类的求解方式。

二、实验内容1. 求有限集上给定关系的自反、对称和传递闭包。

(有两种求解方式,只做一种为A,两种都做为B)2. 求有限集上等价关系的数量。

(有两种求解方式,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。

(C)三、实验环境C或C++语言编程环境实现。

四、实验原理和实现进程(算法描述)A题型求有限集上等价关系的数量。

集合上的等价关系与该集合的划分之间存在一一对应关系。

一个等价关系对应一个划分,一个划分也对应一个等价关系。

咱们把n个元素的集合划分成k 块的方式数叫第二类Stirling数,表示为S(n,k)。

给定S(n,n) = S(n,1) = 1,有递归关系:S(n,k) = S(n − 1,k − 1) + kS(n − 1,k)集合上所有等价类的个数即为k从1到n,所有S(n,k)之和。

那个问题的算法比较简单,仅需两步就可完成,第一依照上式,概念一个递归函数S(n,k),然后对k从1到n,求取sum=∑S(n,k),sum的值确实是给定n元集合上的等价关系数量,最后将其输出即可。

A题型的流程图如下所示:C题型求解商集,输入集合和等价关系,求相应的商集商集即等价类组成的集合,要求商集,第一需要判定输入的关系是不是为等价关系,不然没有商集。

判定输入的关系是不是为等价关系的算法如下:(1)将输入的关系转换为关系矩阵,那个地址概念了一个函数translate(),转换的方式为:依次查找输入的关系中的二元组的两个元素在集合中的位置,例如<a,b>,假设a在集合A中的位置为i,b在集合A中的位置为j,就令寄存关系矩阵的二维数组M[i][j]=1,如此就将输入的关系R转换为关系矩阵的形式。

离散数学数理逻辑C++或C语言实验报告

离散数学数理逻辑C++或C语言实验报告

离散数学实验报告专业班级:12级计算机本部一班姓名:鲍佳珍学号:201212201401016 实验成绩:1.【实验题目】命题逻辑实验一2.【实验目的】熟悉掌握命题逻辑中的联接词,实现二元合取、析取、蕴涵和等价表达式的计算。

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

3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

(A)4、【实验要求】C或C++语言编程实现5. 【算法描述】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)双条件:二元命题联结词。

将两个命题P、Q联结起来,构成一个新的命题P←→Q, 读作P双条件于Q。

这个新命题的真值与构成它的命题P、Q 的真值间的关系为当两个命题变项P = T, Q =T时方可P←→Q =T, 其余均为F。

2.实验过程(1)A题部分,首先是对各个输入量的处理,要确定输入的为0或1,否则则为出错,接下来就是运算处理,在C语言中本身支持的有与或非这三种,可以用!,&&,||来表示,而在这个实验中,不是与或非的可以通过转化而变为与或非的形式,具体流程图如下:6.【源程序(带注释)】#include<stdio.h>void xiqu(int m,int n);void hequ(int m,int n);void yunhan(int m,int n);void shuang(int m,int n); // 声明四个自定义函数int main(){int p,q,a;printf("欢迎使用数理逻辑软件\n");printf("请输入P: ");scanf("%d",&p);while(p!=0&&p!=1){printf("输入错误,请再次输入P: ");//为满足P,Q不是1,0的情况scanf("%d",&p);}printf("请输入Q: ");scanf("%d",&q);while(q!=0&&q!=1){printf("输入错误,请再次输入Q: ");//为满足P,Q不是1,0的情况scanf("%d",&q);}printf("1.析取 2.合取 3.蕴含 4.双条件0.退出5.再次输入\n");//主界面printf("请输入选项:");scanf("%d",&a);while(a) //用switch语句进行选择{switch(a){case 1:xiqu(p,q);break;case 2:hequ(p,q);break;case 3:yunhan(p,q);break;case 4:shuang(p,q);break;case 5: //可重新输入P,Qprintf("请输入P: ");scanf("%d",&p);while(p!=0&&p!=1){printf("输入错误,请再次输入P: ");//为满足P,Q不是1,0的情况scanf("%d",&p);}printf("请输入Q: ");scanf("%d",&q);while(q!=0&&q!=1){printf("输入错误,请再次输入Q: ");//为满足P,Q不是1,0的情况scanf("%d",&q);}case 0:break;default:printf("输入错误,请再次输入\n");break;}scanf("%d",&a);}return 0;}void xiqu(int m,int n){ //定义四个函数int b=1;if(m==0&&n==0){b=0;}printf("析取值为:");printf("%d\n",b);}void hequ(int m,int n){int b=0;if(m==1&&n==1){b=1;}printf("合取值为:");printf("%d\n",b);}void yunhan(int m,int n){int b=1;if(m==1&&n==0){b=0;}printf("蕴含值为:");printf("%d\n",b);}void shuang(int m,int n){int b=0;if(m==1&&n==1){b=1;}if(m==0&&n==0){b=1;}printf("双条件值为:");printf("%d\n",b);}7.【实验结果与分析总结(含运行结果截图)】。

离散数学关系性质的C++或C语言判断实验报告

离散数学关系性质的C++或C语言判断实验报告

1.【实验目的】对称:通过算法设计并编程实现对给定集合上的关系是否为对称关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法自反:通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法。

2.【实验内容】已知关系R 由关系矩阵M 给出,要求判断由M 表示的这个关系是否为对称关系。

假定R 的关系矩阵为:⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=1234210330124321M 3.【实验要求】C 语言编程实现4.【算法描述】对称:从给定的关系矩阵来判断关系R 是否为对称是很容易的。

若M (R 的关系矩阵)为对称矩阵,则R 是对称关系;若M 为反对称矩阵,则R 是反对称关系。

因为R 为对称的是等价关系的必要条件,所以,本算法可以作为判等价关系算法的子程序给出。

算法实现:(1) 输入关系矩阵M (M 为n 阶方阵);(2) 判断对称性,对于i=2,3,….,n ;j=1,2,……,i-1,若存在m ij =m ji ,则R 是对称的;(3) 判断反对称性;(4) 判断既是对称的又是反对称的;(5) 判断既不是对称的又不是反对称的;(6) 输出判断结果。

自反:从给定的关系矩阵来断判关系R是否为自反是很容易的。

若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)的主对角线元素均为0,则R是反自反关系;若M(R的关系矩阵)的主对角线元素既有1又有0,则R既不是自反关系也不是反自反关系。

本算法可以作为判等价关系算法的子程序给出。

算法实现(1)输入关系矩阵M(M为n阶方阵)。

(2)判断自反性,对于i=1,2,….,n;若存在m=0,则R不是自反ii=1,则R是自反的;否则R既不是自反关系也不是的;若存在mii反自反关系。

(3)输出判断结果。

源代码#include<stdio.h>void z();void r();void main(){int d;while(d){printf("欢迎使用关系性质的判断系统\n\n 1. 对称关系的判断 2. 自反关系的判断\n\n请输入选项:");scanf("%d",&d);switch(d){case 1: r();break;case 2: z();break;case 0: break;}printf("\n");printf("是否还继续?是请输入1,否请输入0:");scanf("%d",&d);printf("\n\n");}return 0;}void r(){int a[30][30];int m,n,i,j,c,b,d;c=0;d=0;b=0;d=1;printf("请输入矩阵的行数");scanf("%d",&m);printf("请输入矩阵的列数");scanf("%d",&n);for(i=0;i<m;i++){for(j=0;j<n;j++){printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);scanf("%d",&a[i][j]);}}printf("关系矩阵M为:\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%d ",a[i][j]);printf("\n");}for(i=0;i<m;i++){for(j=0;j<n;j++){if(a[i][j]!=a[j][i]){c=1;break;}}}if(c==0){for(i=0;i<m;i++){for(j=0;j<n;j++){if(a[i][j]==1){if(a[j][i]!=0){c=2;break;}}}}if(c==2) printf("该矩阵是对称性的\n");elseif(c==0) printf("该矩阵是既对称又反对称的\n");}elseif(c==1){for(i=0;i<m;i++){for(j=0;j<n;j++){if(a[i][j]==1){if(a[j][i]!=0){c=2;break;}}}}if(c==2) printf("该矩阵不是对称的又不是反对称的\n");else{printf("该矩阵是反对称性的\n");}}}void z(){int m,n,i,j,a[80][80],c;c=0;printf("请输入矩阵的行数");scanf("%d",&m);printf("请输入矩阵的列数");scanf("%d",&n);for(i=0;i<m;i++){for(j=0;j<n;j++){printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);scanf("%d",&a[i][j]);}}printf("关系矩阵M为:\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%d ",a[i][j]);printf("\n");}for(i=0;i<m;i++){if(a[i][i]!=0){c=1;break;}}if(c==1) printf("该矩阵是自反性的\n");if(c==0) printf("该矩阵是反自反性的\n"); }。

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

1.【实验目的】
对称:
通过算法设计并编程实现对给定集合上的关系是否为对称关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法
自反:
通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法。

2.【实验内容】
已知关系R 由关系矩阵M 给出,要求判断由M 表示的这个关系是否为对称关
系。

假定R 的关系矩阵为:⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛=1234210330124321M 3.【实验要求】
C 语言编程实现
4.【算法描述】
对称:
从给定的关系矩阵来判断关系R 是否为对称是很容易的。

若M (R 的关系矩阵)为对称矩阵,则R 是对称关系;若M 为反对称矩阵,则R 是反对称关系。

因为R 为对称的是等价关系的必要条件,所以,本算法可以作为判等价关系算法的子程序给出。

算法实现:
(1) 输入关系矩阵M (M 为n 阶方阵);
(2) 判断对称性,对于i=2,3,….,n ;j=1,2,……,i-1,若存在m ij =m ji ,
则R 是对称的;
(3) 判断反对称性;
(4) 判断既是对称的又是反对称的;
(5) 判断既不是对称的又不是反对称的;
(6) 输出判断结果。

自反:
从给定的关系矩阵来断判关系R是否为自反是很容易的。

若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)的主对角线元素均为0,则R是反自反关系;若M(R的关系矩阵)的主对角线元素既有1又有0,则R既不是自反关系也不是反自反关系。

本算法可以作为判等价关系算法的子程序给出。

算法实现
(1)输入关系矩阵M(M为n阶方阵)。

(2)判断自反性,对于i=1,2,….,n;若存在m
=0,则R不是自反
ii
=1,则R是自反的;否则R既不是自反关系也不是的;若存在m
ii
反自反关系。

(3)输出判断结果。

源代码
#include<stdio.h>
void z();
void r();
void main()
{
int d;
while(d)
{
printf("欢迎使用关系性质的判断系统\n\n 1. 对称关系的判断 2. 自反关系的判断\n\n请输入选项:");
scanf("%d",&d);
switch(d){
case 1: r();break;
case 2: z();break;
case 0: break;
}
printf("\n");
printf("是否还继续?是请输入1,否请输入0:");
scanf("%d",&d);
printf("\n\n");
}return 0;
}
void r()
{
int a[30][30];
int m,n,i,j,c,b,d;
c=0;
d=0;
b=0;
d=1;
printf("请输入矩阵的行数");
scanf("%d",&m);
printf("请输入矩阵的列数");
scanf("%d",&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);
scanf("%d",&a[i][j]);
}
}
printf("关系矩阵M为:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]!=a[j][i])
{
c=1;
break;
}
}
}
if(c==0)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++){
if(a[i][j]==1){
if(a[j][i]!=0){
c=2;
break;
}
}
}
}
if(c==2) printf("该矩阵是对称性的\n");
else
if(c==0) printf("该矩阵是既对称又反对称的\n");
}
else
if(c==1){
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(a[i][j]==1){
if(a[j][i]!=0){
c=2;
break;
}
}
}
}
if(c==2) printf("该矩阵不是对称的又不是反对称的\n");
else{
printf("该矩阵是反对称性的\n");
}
}}
void z()
{
int m,n,i,j,a[80][80],c;
c=0;
printf("请输入矩阵的行数");
scanf("%d",&m);
printf("请输入矩阵的列数");
scanf("%d",&n);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("请输入矩阵关系中第%d行第%d列的数字:",i,j);
scanf("%d",&a[i][j]);
}
}
printf("关系矩阵M为:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
for(i=0;i<m;i++){
if(a[i][i]!=0){
c=1;break;
}
}
if(c==1) printf("该矩阵是自反性的\n");
if(c==0) printf("该矩阵是反自反性的\n"); }。

相关文档
最新文档