离散数学实验一
- 格式:doc
- 大小:271.00 KB
- 文档页数:8
离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。
四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。
通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。
例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。
五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。
图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。
例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。
结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。
通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。
希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。
离散数学上机实验报告————————————————————————————————作者:————————————————————————————————日期:ﻩ《离散数学》实验报告姓名:学号:班级:ﻬ实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容从键盘输入两个命题变元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>intmain(){ﻩ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;ﻩﻩelseﻩﻩp=0;ﻩﻩﻩprintf("\t%d",p);ﻩ}ﻩ}ﻩprintf("\n 非Q的值");ﻩfor(P=0;P<2;P++)ﻩ{ﻩfor(Q=0;Q<2;Q++)ﻩﻩ{ﻩﻩif(Q==1)/*判断非Q的值*/ﻩﻩﻩq=0;ﻩelseﻩﻩq=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的值*/ﻩa=0;ﻩﻩelseﻩﻩa=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;ﻩelseﻩﻩb=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;ﻩﻩelseﻩc=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;ﻩﻩelseﻩﻩd=0;ﻩﻩprintf("\t%d",d);}ﻩ}printf("\n");return 0;}3.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
离散数学上机实验指导徐凤生如果你需要索取源程序,请发邮件至xfs@。
实验11实验内容(1)求任意一个命题公式的真值表。
(2)利用真值表求任意一个命题公式的主范式。
(3)利用真值表进行逻辑推理。
注:(2)和(3)可在(1)的基础上完成。
2实验目的真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。
例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。
本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。
目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。
3算法的主要思想利用计算机求命题公式真值表的关键是:①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。
真值表中命题变元的取值具有如下规律:每列中0和1是交替出现的,且0和1连续出现的个数相同。
n个命题变元的每组赋值的生成算法可基于这种思想。
含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。
为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、条件和双条件联结词分别用!、&、|、-、+来表示。
算符之间的优先关系如表1-32所示:为实现算符优先算法,另一个称作OPND,用以寄存操作数或运算结果。
算法的基本思想是:(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd(按字典序排列,同一个命题变元只出现一次);(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。
实验21实验内容(1)求任意两个集合的交集、并集、差集。
(2)求任意一个集合的幂集。
《离散数学》实验报告专业网络工程班级姓名学号授课教师二 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的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验二关系闭包计算一、实验目的熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
二、实验内容从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,计算传递闭包时使用Warshall算法。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验三计算两结点间长度为m的路的数目一、实验目的熟悉邻接矩阵和两结点间长度为m的路的数目的关系并编程计算。
二、实验内容从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。
考虑有向图和无向图。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
实验四最优树的构造一、实验目的熟悉最优树的构造算法,掌握最优树的构造过程。
二、实验内容从键盘输入一组权值,构造出对应的最优树,列出构造过程。
用C语言或MATLAB实现。
三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
部分参考答案:实验二C++源程序#include<iostream.h>int num;class guanxi{public:int jz[100][100];void set(){cout<<"shu ru yuan su shu"<<endl;cin>>num;cout<<"put in the guanxi"<<endl;int i,j;for(i=0;i<num;i++)for(j=0;j<num;j++)cin>>jz[i][j];cout<<"关系剧阵是:"<<endl;for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<jz[i][j]<<" ";if (j==num-1)cout<<endl;}cout<<endl;}friend void zifan();friend void duichen();friend void chuandi();};void zifan(guanxi ox){int i,j;for(i=0;i<num;i++)ox.jz[i][i]=1;for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}void duichen(guanxi ox){int i,j;for(i=0;i<num;i++)for(j=0;j<num;j++){if(ox.jz[i][j]==1)ox.jz[j][i]=1;}for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}void chuandi(guanxi ox){int i,j,k;for(i=0;i<num;i++)for(k=0;k<num;k++)if(ox.jz[k][i]==1){for(j=0;j<num;j++)if(ox.jz[i][j]==1)ox.jz[k][j]=1;}for(i=0;i<num;i++)for(j=0;j<num;j++){cout<<ox.jz[i][j]<<" ";if (j==num-1)cout<<endl;}}main(){guanxi o1;o1.set();cout<<"它的自反闭包是:"<<endl;zifan(o1);cout<<"它的对称闭包是:"<<endl;duichen(o1);cout<<"它的传递闭包是:"<<endl;chuandi(o1);return 0;}C源程序#include<stdio.h>int main(){int i,j,k,n;static int str[122],zifan[122],chuandi[122],duich[122];printf("Please input the jie:\n");scanf("%d",&n);printf("A=%d\n",n);for(i=0;i<n*n;i++){scanf("%d",&str[i]);}printf("The shu zu is:\n");for(j=0;j<n*n;j++){printf("%4d",str[j]);if((j+1)%n==0)printf("\n");}for(j=0;j<n*n;j++){zifan[j]=str[j];chuandi[j]=str[j];duich[j]=str[j];}printf("The zifan bibao is:\n");for(i=0;i<n*n;i++){if(i%(n+1)==0)zifan[i]=zifan[i]||1;printf("%4d",zifan[i]);if((i+1)%n==0)printf("\n");}printf("The duich bibao is:\n");for(i=0,j=0;i<n*n&&j<n;i++){if(i>j*(n+1)&&i<(j+1)*n){ duich[i]=duich[(i-j*(n+1))*(n-1)+i]||duich[i];duich[(i-j*(n+1))*(n-1)+i]=duich[(i-j*(n+1))*(n-1)+i]||duich[i];}else if(i>=(j+1)*n)j++;}for(i=0;i<n*n;i++){printf("%4d",duich[i]);if((i+1)%n==0)printf("\n");}printf("The chuandi bibao is:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)if(chuandi[j*n+i]){for(k=0;k<n;k++)chuandi[j*n+k]=chuandi[j*n+k]||chuandi[i*n+k];}for(i=0;i<n*n;i++){printf("%4d",chuandi[i]);if((i+1)%n==0)printf("\n");}return 0;}实验三#include <iostream.h>class luchang{private:int N;int **p;public:luchang(int n);~luchang();int input();luchang &operator =(luchang &A);luchang &mul(luchang &A,luchang &B);void disply();int disply(int M);};luchang::luchang(int n){N=n;int i;p=new int*[N];for (i=0;i<N;i++)p[i]=new int[N];}luchang::~luchang(){int i;for (i=0;i<N;i++)delete p[i];delete p;}int luchang::input(){int i,j;for (i=0;i<N;i++){for (j=0;j<N;j++)cin>>p[i][j];}return 0;}luchang& luchang::operator =(luchang &A){int i,j;for (i=0;i<N;i++){for(j=0;j<N;j++)p[i][j]=A.p[i][j];}return *this;}luchang& luchang::mul(luchang &A,luchang &B) {int i,j,k,sum=0;for (i=0;i<N;i++){for (j=0;j<N;j++){for (k=0;k<N;k++){sum+=B.p[i][k]*A.p[k][j];p[i][j]=sum;}sum=0;}}return *this;}void luchang::disply(){for (int i=0;i<N;i++){for (int j=0;j<N;j++)cout<<p[i][j]<<" ";cout<<endl;}}int luchang::disply(int M){int i,j;int count=0;for (i=0;i<N;i++){for (j=0;j<N;j++){if (p[i][j]==M)count++;else continue;}}cout<<count<<endl;return 0;}void main(){cout<<"请输入图中的点数V"<<endl;int n=0;cin>>n;luchang ob1(n),ob2(n),ob3(n);cout<<"请输入邻接矩阵"<<endl;ob1.input();ob2=ob1;ob3=ob1;cout<<"请输入要查找的路长M"<<endl;int M=0;cin>>M;for (int i=0;i<M-1;i++){ob3.mul(ob1,ob2);ob2=ob3;}ob3.disply();ob3.disply(M);cout<<endl;}。
【实验目的】通过编程实现求给定集合A和B的并集C(C=A∪B)的运算。
【实验内容】已知所给集合A和B,求A与B 的并集C(C=A∪B)。
【实验原理】因为并集的定义为:C={x|x∈A∨x∈B},所以,只要将集合A与B合在一起就得到了并集C。
但是,在一个集合中,同样的元素没必要出现两次或两次以上,所以,在将集合A送入并集C后,应将集合B中与A中相同的元素删除,再将集合B送入并集C之中。
【程序代码】#include<stdio.h>int main(){int a[101],b[101],c[201]={0};int m,n;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);for(int i=1;i<=m;i++)c[i]=a[i];int i=m+1;int k;for(int j=1;j<=n;j++){int t=1;for(k=1;k<=m;k++){if(a[k]==b[j])t=0;}if(t==1){c[i]=b[j];i++;}}for(int i=1;i<=m+n;i++){if(c[i]!=0)printf("%d ",c[i]);}}【实验结果】【实验心得】首先想到的是数组,先将数组a[],赋值给c[],然后通过两层for循环来判断b[],是否与a[]重复,如若不重复,将b[]赋值给c[]。
在开始的时候由于for循环套错位置出错,后设置一flag来判断b[]和a[]是否有重复的元素。
【实验目的】使学生熟练掌握利用计算机语言实现逻辑运算的基本方法。
【实验内容】对给出的任意一个命题公式(不超过四个命题变元),使学生会用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;}【实验结果】【实验心得】。
离散数学实验报告(实验一)专业:自动化班级:学号:姓名:日期2010.10.28一实验内容(二选一)1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值(A)2. 求任意一个命题公式的真值表(B),并根据真值表求主范式(C)。
二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
三实验环境进入Visual C++ 环境后,选择菜单“File | New”,在弹出的对话框中单击上方的选项卡“Projects”,选择“Win32 Console Application”工程类型,在“Project name”一栏中填写工程名例如MyFirst,在“Location”一栏中填写工程路径(目录). 选择菜单“Project | Add to Project | New”,为工程添加新的C++源文件。
选择菜单为工程添加新源文件在“File Name”栏填入新添加的源文件名,如MyFirst.cpp,“Location”一栏指定文件路径,按按钮“OK”完成C++源程序的系统新建操作。
编译源程序:选择Build | Build菜单(F7为快捷键),系统将会在Output窗口给出所有的错误信息和警告信息。
当所有错误修正之后,系统将会生成扩展名为.exe的可执行文件。
对于Output窗口给出的错误信息,双击可以使输入焦点跳转到引起错误的源代码处以进行修改。
执行程序:选择Build | Execute菜单项(Ctrl + F5为快捷键),执行程序,将会出现一个DOS窗口,按照程序输入要求正确输入数据后,程序即正确执行。
四实验原理和实现过程(算法描述)1.程序主界面本程序界面主要有两个操作,1:求真值。
2:求任何公式的真值。
操作1完成A 类题要求,操作2完成A,B类题要求。
如果出输入的操作项不是0,1,2,则会提示出错,再次选择。
其界面如图所示:2.算法描述和实现过程在做A类题时,算法实现,首先判断输入格式是否正确,在把蕴含(→),等值(←→),通过变换,化成只有非,合取和析取的等价公式,在利用C语言中的运算符非(!),与(&&)和或(||)算出任何两元变量的真值。
大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络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中元素存储完毕。
实验报告
(2013 / 2014 学年第一学期)
课程名称离散数学
实验名称利用真值表法求取主析取范式
以及主合取范式的实现
实验时间2013 年10 月23 日指导单位计算机学院、软件学院
指导教师
学生姓名班级学号
学院(系) 计算机、软件
专业软件工程
学院
实验报告
实验名称利用真值表法求取主析取范式
指导教师
以及主合取范式的实现
实验类型验证实验学时 4 实验时间2013.10.23
一、实验目的和要求
1、编程实现用真值表法求取含三个以内变量的合式公式的主析取范式和主合取范式。
2、要求:
1)从屏幕输入含三个以内变量的合式公式(其中联结词按照从高到底
的顺序出现)
2)规范列出所输合式公式的真值表
3)给出相应主析取和主合取范式
二、实验内容
1.可用字符数组a记录输入的合式公式(其中'&'代表与,'|'代表或,'~'
代表非,'>'代表单条件,'='代表双条件)
2.多重循环显示真值表(1表示T,0表示F,先1后0)并对公式进行相
应赋值得数组b
3.函数递归计算各种赋值情况下b的取值
4.联接词运算符定义
三、实验设计及代码
1、求取真值表
void truetable(){ /*求真值表函数*/
char s1[30],s2[30],s3[30],s4[30];
int n,i,j,k,m;
printf("您要计算真值表!\n");
printf("***************** 输入要计算的表达式(A~Z,a~z) ****"
"************ \n");
printf("(其中'&'代表与 '|'代表或 '~'代表非 '>'代表单条件 "
"'='代表双条件)\n");
gets(s4);
printf(" \n您输入要计算的表达式为:%s \n",s4);
n=got(s1, s4);
if(!n)
{printf("输入有误!\n");return;}
m = (int)pow(2,n);
printf("计算真值表如下:\n");
for(j=0;j<(int)strlen(s1);j++){
printf("%c ",s1[j]);
}
printf(" %s\n",s4);
for(j=0;j<m;j++){
strcpy(s2,s4);
int num[30];
digit(j,s1,s2);
transform(s3,s2);
k=calculate_exp(s3);
if(k==5)
{printf("输入有误!\n");return;}
else
{for(i=0;i<(int)strlen(s1);i++){
num[i] = (j/(int)pow(2,i)%2);
printf("%d ",num[i]);
}
printf("%d\n",k);
}
}
}
2、求取范式的函数
void paradigm(char d){
char s1[30],s2[30],s3[30],s4[30];
int n,j,i,k,m;
printf("***************** 输入要计算的表达式(A~Z,a~z) ******"
"********** \n");
printf("其中'&'代表与 '|'代表或 '~'代表非 '>'代表单条件 '='"
"代表双条件\n ");
gets(s4);
printf("\n您输入要计算的表达式为:%s \n答案如下:\n",s4);
n=got( s1, s4);
if(!n)
{printf("输入有误!\n");return;}
m = (int)pow(2,n);
for(j=0;j<m;j++){
strcpy(s2,s4);
digit(j,s1,s2);
transform(s3,s2);
k=calculate_exp(s3);
int num[30];
for(i=0;i<(int)strlen(s1);i++){
num[i] = (j/(int)pow(2,i)%2);
}
switch(k){
case 5 : printf("输入有误!"); return;
case 1 :
if(d=='2'){
if (num[0]==1)
printf("\n %c",s1[0]);
else
printf("\n ~%c",s1[0]);
for(i=1;i<(int)strlen(s1);i++){
if (num[i]==1)
printf("&%c",s1[i]);
else
printf("&~%c",s1[i]);
} break;
}
else break;
case 0 :
if(d=='3'){
if (num[0]==1)
printf("\n %c",s1[0]);
else
printf("\n ~%c",s1[0]);
for(i=1;i<(int)strlen(s1)-1;i++){
if (num[i]==1)
printf("|~%c",s1[i]);
else
printf("|%c",s1[i]);
}break;
}
else break;
default: printf("输入有误!");return;
}
}
三、实验结果。