离散数学实验一
离散数学 实验报告
离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,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;}。
离散数学上机实验报告
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#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");
离散数学实验报告求集合的运算——并运算
【实验目的】通过编程实现求给定集合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中元素存储完毕。
离散数学实验
离散数学实验实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(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;}}实验二两个集合运算(交、并、补)一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。
离散数学实验——真值表
#include<iostream.h>void main(){ int m,s;char a,b,c,d,e;do{cout<<"\n ********欢迎进入该系统******** "<<"\n";cout<<" 1.与运算p&&q "<<"\n";cout<<"2.或运算p||q "<<"\n";cout<<"3.非运算!q "<<"\n";cout<<" 4.则运算p->q "<<"\n";cout<<”5.蕴涵运算p<->q "<<"\n\n";cout<<"请选择你需要的操作序号: ";cin>>m;switch (m) {case 1:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"&&"<<b<<"\n";for(int i=0;i<2;i++)for(int k=0;k<2;k++){ c out<<i<<"\t"<<k<<"\t";if(i+k==2) cout<<"1"<<"\n";elsecout<<"0"<<"\n";}break; }case 2:{cout<<"\n请输入两个字母:";cin>>c>>d;cout<<c<<"\t"<<d<<"\t"<<c<<"||"<<d<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j+k>0)cout<<1<<"\n";else cout<<0<<"\n";}break; }case 3:{cout<<"\n请输入一个字母:";cin>>e;cout<<e<<"\t"<<"!"<<e<<"\n";for(int j=0;j<2;j++){ cout<<j<<"\t";if(j==0)cout<<1<<"\n";elsecout<<0<<"\n";}break; }case 4:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==0)cout<<1<<"\n";else{if(k==1)cout<<1<<"\n";elsecout<<0<<"\n";} }break;}case 5:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"<->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==k)cout<<1<<"\n";elsecout<<0<<"\n";}break;}}cout<<"\n 你还需要继续操作吗?(YES=1,NO=0): ";cin>>s;}while(s);}1运算:a&&b2运算:p->q3运算:c<—>d。
离散数学实验指导书(附带模板)
《离散数学》实验指导书一、实验目的《离散数学》是现代数学的一个重要分支,是计算机科学与技术专业的基础理论课,也是该专业的核心课程和主干课程。
“离散数学”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。
该课程一方面为后继课程如数据结构、编绎原理、操作系统、数据库原理、人工智能和形式语言与自动机等提供必要的理论基础;同时,更为重要的是培养学生的抽象思维能力和逻辑推理能力,为今后的学习和工作打好基础。
无论从计算机学科发展的过去、现在和未来看,《离散数学》都是计算机科学与技术专业不可缺少的重要组成部分。
这门课程有着其它课程不可替代的地位和作用,是一门承前启后的课程。
根据《离散数学》课程本身的理论性较强的特性,为了帮助学生更好地学习本课程,理解和掌握所学基本概念和方法,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,设置实践环节十分重要。
通过实验实践内容的训练,突出逻辑性思维训练的特征, 目的是学习离散数学中的基本算法和方法,掌握数理逻辑、关系和图论中的基本算法,提高学生学习的兴趣及实际动手的能力。
通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所学知识,培养分析、解决实际问题的能力。
二、实验要求掌握真值表技术,熟悉联结词合取、析取、条件和双条件的概念。
熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
熟悉邻接矩阵和两结点间长度为m 的路的数目的关系。
熟悉最优树的构造算法,掌握最优树的构造过程。
实验前作好准备,分析问题并确定算法,设计代码。
做实验过程中认真分析和调试程序,记录并分析实验结果。
实验后完成实验报告,实验报告包括实验目的、实验内容、源程序、运行结果及分析。
可以使用C、VC或MATLAB完成实验。
实验题目包括真值计算、关系闭包计算、计算两结点间长度为m的路的数目、最优树的构造四个实验,每个实验要求2个学时完成。
三、实验设备及环境PC机一台,软件C、VC或MATLAB四、实验内容实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
离散数学实验——求真值表
一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (7)七其他收获和体会。
(16)一实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。
四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。
最后提示按#键退出,否则继续循环求真值。
B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi()每次调用zzhi()时都使数组zhi[]中的真值加1,(利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhi()将真值指派的数组加1,最后外围利用while语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2个栈,一个作为临时存储运算符的栈fu[],一个作为输入逆波兰式的栈nibol[],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。
同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较,如果bianl[]中还没有该字母,则该字母是新出现的变量,将其录入数组bianl[]中。
离散数学实验报告求满射函数
【实验目的】通过算法设计并编程实现求出从集合A 到B 上的所有满射函数的个数,加深学生对函数性质的理解。
【实验内容】设A 、B 为有限集合,且|A|=m ,|B|=n ,求出从集合A 到B 的所有满射函数个数。
【实验原理】从A 到B 的满射函数定义为:设 f : A →B ,若ran f = B , 则称 f : A →B 是满射的(或称为映到的),函数f 为满射的必要条件是 |A|≥|B|。
否则就不是满射函数了。
对于所给的问题,可以使用公式:F=n n C ·m n -1-n n C ·m n )1(-+2-n n C ·m n )2(--…….+ 1)1(--n 1n C ·m 1来求得其解。
但是在这儿,我们也可以使用计算机中常用的一种方法——枚举法来求解。
枚举法就是一个个的列出所有满足条件的函数,并将其记录下来,当枚举结束时就可得到欲求函数的数目。
对于上面提出的问题,相当于把n 个不同的数字放到m 个位置上去的所有不同的方法。
其中,数字是可重复出现的,但是每个数字必须都出现过至少一次才是满射函数。
【程序代码】#include<stdio.h>#include<math.h>int c(int n,int m){if(m==0)return 1;long long int sum=1,sum1=1,sum2=1;for(int i=1;i<=n;i++){sum=sum*i;}for(int i=1;i<=m;i++){sum1*=i;}for(int i=1;i<=(n -m);i++){sum2*=i;}return sum/sum1/sum2;}int main(){int n,m;scanf("%d%d",&n,&m);long long int sum=0;for(int i=0;i<=m-1;i++){sum+=pow(-1,i)*c(m,i)*(pow((m-i),n));}printf("%d",sum);}【实验结果】【实验心得】。
离散数学 实验报告
离散数学实验报告离散数学实验报告一、引言离散数学是一门研究离散结构及其运算规则的数学学科,它在计算机科学、信息科学、通信工程等领域具有重要的应用价值。
本实验旨在通过实际案例,探索离散数学在现实生活中的应用。
二、实验目的本实验的目的是通过离散数学的理论知识,解决一个实际问题。
我们选择了图论中的最短路径问题作为案例,以展示离散数学在网络路由、物流规划等领域的应用。
三、实验过程1.问题描述我们的实验场景是一个城市的交通网络,其中各个交叉路口被看作是图的节点,而道路则是图的边。
我们需要找到两个给定节点之间的最短路径,以便规划出行路线。
2.建模为了解决这个问题,我们需要将实际情况抽象成数学模型。
我们将交通网络表示为一个有向图,每个节点代表一个交叉路口,每条边代表一条道路。
每条边上还需要标注距离或时间等权重。
3.算法选择在离散数学中,有多种算法可以解决最短路径问题,如迪杰斯特拉算法、弗洛伊德算法等。
根据实际情况和需求,我们选择了迪杰斯特拉算法。
4.算法实现我们使用编程语言实现了迪杰斯特拉算法,并将其应用于我们的交通网络模型。
算法的核心思想是通过不断更新节点之间的最短距离,逐步找到最短路径。
5.实验结果经过实验,我们成功找到了两个给定节点之间的最短路径,并计算出了最短距离。
这对于规划出行路线具有重要意义,可以帮助人们节省时间和资源。
四、实验总结通过这个实验,我们深入理解了离散数学在实际问题中的应用。
离散数学的概念和算法不仅仅是理论上的抽象,它们可以帮助我们解决现实生活中的复杂问题。
离散数学的应用远不止于此,它还可以用于密码学、数据压缩、人工智能等领域。
通过学习离散数学,我们能够培养出良好的抽象思维和问题解决能力,为未来的科学研究和工程实践打下坚实的基础。
总之,离散数学是一门具有广泛应用前景的学科,通过实验,我们对其应用领域有了更深入的了解。
希望未来能有更多的人关注和研究离散数学,为推动科学技术的发展做出贡献。
离散数学实验报告
离散数学实验报告离散数学实验报告一、引言离散数学是现代数学的一个重要分支,它研究离散的数学结构和离散的数学对象。
本实验报告将介绍我对离散数学的学习和实践的一些心得体会。
二、集合论集合论是离散数学的基础,它研究集合及其运算。
在实验中,我学习了集合的表示方法和运算规则。
集合的表示方法有枚举法、描述法和图示法等。
集合的运算包括并、交、差和补等。
通过实践操作,我深刻理解了集合的概念和运算规则。
三、逻辑与命题逻辑是离散数学的另一个重要内容,它研究推理和思维的规律。
在实验中,我学习了逻辑的基本概念和符号表示法。
逻辑中的命题是逻辑推理的基本单位,它可以是真或假。
通过实践操作,我能够正确地分析和判断命题的真值,并进行逻辑推理。
四、关系与函数关系与函数是离散数学中的重要内容,它们描述了元素之间的联系。
在实验中,我学习了关系的定义和性质,包括自反性、对称性和传递性等。
函数是一种特殊的关系,它将一个集合的元素映射到另一个集合。
通过实践操作,我能够正确地定义和分析关系与函数。
五、图论图论是离散数学中的重要分支,它研究图及其性质。
在实验中,我学习了图的基本概念和表示方法。
图由顶点和边组成,可以分为有向图和无向图。
通过实践操作,我能够正确地定义和分析图的性质,如度、路径和连通性等。
六、组合数学组合数学是离散数学的另一个重要分支,它研究离散对象的组合和排列。
在实验中,我学习了组合数学的基本原理和方法。
组合数学中的排列和组合是常见的计数问题,通过实践操作,我能够正确地计算排列和组合的数量。
七、实践应用离散数学在计算机科学、通信工程和运筹学等领域有着广泛的应用。
在实验中,我了解了离散数学在实际问题中的应用。
例如,图论可以用于网络路由算法的设计,组合数学可以用于密码学中的加密算法设计。
通过实践操作,我能够将离散数学的知识应用到实际问题中,提高问题的解决效率。
八、总结通过本次离散数学实验,我深入了解了离散数学的基本概念和方法,并通过实践操作加深了对离散数学的理解。
离散数学实验报告
离散数学实验报告————————————————————————————————作者:————————————————————————————————日期:ﻩ重庆交通大学学生实验报告实验课程名称离散数学开课实验室数学实验室学院理学院专业信息与计算科学学生姓名谭冰学号631122020212班级2班开课时间2011 至2012学年第二学期教师评语:总成绩教师签名ﻬ目录实验一:教材第17页习题(1)(b);教材第39页习题(4)(b)…………3.实验二:教材第127页习题(2)(b);教材第113页习题(2)(b)9ﻩ实验一(此实验包含两题)一、实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的非,合取,析取,条件和双条件的真值。
2.求任意一个命题公式的真值表。
二、实验目的熟悉掌握命题逻辑中的联接词,真值表,主范式等,进一步能用它们来解决实际问题。
三、实验环境MATLAB软件的编程环境实现四、实现两题的算法与原理(教材第17页习题(1)(b),39页习题(4)(d))根据析取,合取的定义可用简单的算术运算求出结果,并将结果转换成逻辑值。
同样根据等价关系可将条件式及双条件式转换成析取和合取的运算。
五、实验数据及结果分析实验所用函数:functiony=Not(x)if x==0y=1;else y=0;endfunction m=Vee(x,y)ifx==0&y==0m=0;else m=1;endfunction y=Wedge(P,Q)ifP==1&Q==1y=1;else y=0;endfunction y=If(P,Q)y=Vee(Not(P),Q);endfunctiony=Hh(P,Q,R)y=Vee(Wedge(P,R),If(P,Q));endfunction y=Ss(P,Q,R)y=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));endA=[0 000 010 100 1 11 0 01 0 11101 1 1];P=A(:,1);Q=A(:,2);R=A(:,3);In=input(‘请输入含有三个变元的命题公式:’);S={‘真值表为’};T=num2str([P,Q,R,In]);T%保存命名为Zzb'此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值'P=[0 0 00 11 1 1];Q=[00 1 1 0 0 11];R=[0 1 0 1 0 1 0 1];' P QR'Z=[P;Q;R]'K=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));'主析取范式:'A=[];V=[];for i=find(K)switch icase 1A=[A,'(¬P∧¬Q∧¬R)∨'];case 2A=[A,'(¬P∧¬Q∧R)∨'];case 3A=[A,'(¬P∧Q∧¬R)∨'];case 4A=[A,'(¬P∧Q∧R)∨'];case 5A=[A,'(P∧¬Q∧¬R)∨'];case 6A=[A,'(P∧¬Q∧R)∨'];case 7A=[A,'(P∧Q¬∧R)∨'];case 8A=[A,'(P∧Q∧R)'];otherwise'此为永假式'endendA'主合取范式'for i=find(Not(K))switch icase1V=[V,'(P∨Q∨R)∧'];case 2V=[V,'(P∨Q¬∨R)∧'];case 3V=[V,'(P∨¬Q∨R)∧'];case 4V=[V,'(P∨¬Q∨¬R)∧'];case 5V=[V,'(¬P∨Q∨R)∧'];case 6V=[V,'(¬P∨Q∨¬R)∧'];case 7V=[V,'(¬P∨¬Q∨R)∧'];case 8V=[V,'(¬P∨¬Q∨¬R)'];otherwise'此为永真式'endendVif all(K)==1'K是重言式'else'K不是重言式'end %保存文件名为ZyP17 (1) (b):(P∧R)∨(P→Q)运行过程及结果:>> P=[00 0 0 1 11 1],Q=[0 0 1 1 0 0 11],R=[010 1 0 1 0 1]P=0 0 0 0 1 1 1 1Q=0 0 1 1 001 1R =0 1 0 1 0 1 0 1>> Zzb本程序可以求真值表, 请输入含有三个变元的命题公式: Vee(Wedge(P,R),If(P,Q))T =00 0 10 0 1 10 1 0 10 1 1 1100 01 0 1 11 1 0 11111P39 (4)(d):(P→(Q∧R))∧(¬P→(¬Q∧¬R))运行过程及结果:>>Zyans =此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值ans =P QRZ =0 0000 10 1 00 1 11 0 01 0 11 1 01 1 1ans =主析取范式:A =(¬P∧¬Q∧¬R)∨(P∧Q∧R)ans =主合取范式V=(P∨Q¬∨R)∧(P∨¬Q∨R)∧(P∨¬Q∨¬R)∧(¬P∨Q∨R)∧(¬P∨Q∨¬R)∧(¬P∨¬Q∨R)ans =K不是重言式六、收获与体会通过实验使我了解了一些数理逻辑问题可以通过用计算编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。
离散数学实验1
“离散数学”实验报告(实验1)专业班级学号姓名目录一.实验目的; ....................................... - 1 -二.实验内容; ....................................... - 2 -1. 逻辑联接词的运算 ..................................................................................................... - 2 -2. 求任意一个命题公式的真值表 ................................................................................. - 2 -三.实验环境; ....................................... - 2 -四. 实验原理和实现进程(算法描述);................. - 2 -1.实验原理 ....................................................................................................................... - 2 -2.实验进程 ....................................................................................................................... - 3 -五.实验数据及结果分析;.............................. - 7 -题A:................................................................................................................................ - 7 - B,C题:............................................................................................................................ - 9 - 六. 源程序清单; ................................... - 13 -A题部份源代码: .......................................................................................................... - 13 - tt:printf("***************************************\n");其他收成和体会。
离散数学实验
实验一:逻辑真值计算
一、实验目的 熟悉联结词合取、析取、条件和双条件的概念, 编程计算其真值。 二、实验内容 从键盘输入两个命题P和Q的真值,求它们的合取、 析取、条件和双条件的真值。用C语言实现。 三、实验报告和要求 列出实验目的、实验原理、实验内容、实验步骤、 实验结果与分握求关系的自反闭包、对称闭包、传递闭包的 求法,熟悉两种求传递闭包的算法。 二、实验内容 从键盘输入一个关系的关系矩阵,计算它的自发闭 包、对称闭包和传递闭包。用C语言实现。 三、实验报告和要求 列出实验目的、实验原理、实验内容、实验步骤、 实验结果与分析,实验结论,源程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
(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;
}
}
三、实验结果。