开始 检查括号 N 是否是最内级括号 Y 运算内容 分级运算函数 是否是最后结果 Y 返回结果 结束 N 开始 非运算 与运算 或运算 蕴含运算 等值运算 返回结果 结束 主运算函数
- 5 -
五.实验代码
#include \#include \#include \#include \#include \#define N 50
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 i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;//icu[N]用于存放变量值,kh括号计数,jg存放结果
int bj=0,hq[N],h=0,x=0,xq[N];//hq[N]存放合取结果xq[N]存放析取结果 char sz[N],ccu[N],sz0[N],s;//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子 hq[0]=-1; xq[0]=-1;
printf(\标语 printf(\ printf(\欢迎进入逻辑运算软件 **\\n\ printf(\可运算真值表,主范式,支持括号) **\\n\ printf(\ printf(\用!表示非 **\\n\ printf(\用&表示与 **\\n\ printf(\用|表示或 **\\n\ printf(\用^表示蕴含 **\\n\ printf(\用~表示等值 **\\n\ printf(\ printf(\ printf(\请输入一个合法的命题公式:\\n\输入式子 gets(sz);//读取式子
strcpy(sz0,sz);//复制式子 for(i1=0;i1 if(sz[i1]==')' || sz[i1]=='(')//存储括号数量 kh++; if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z') { for(i2=0;i2 - 6 - d=0; if(d==1) { ccu[j]=sz[i1]; j++; } d=1; } } printf(\该式子中的变量个数为:%d\\n\输出变量个数 h0=j; printf(\输出真值表如下:\\n \\n\输出真值表表头 for(i1=0;i1 printf(\ printf(\ puts(sz); printf(\ for(i1=0;i1 for(i2=0;i2 jg=tkh(sz,ccu,icu,h0); //用函数求结果 if(jg==0)//结果为0,合取加1 hq[h++]=bj; else //否则,析取加1 xq[x++]=bj; printf(\输出运算结果 strcpy(sz,sz0); for(i1=0;i1<(int)pow(2,j)-1;i1++) { ++bj; panduan(icu,j-1); //赋值变量 jg=tkh(sz,ccu,icu,h0); if(jg==0)//结果为0,合取加1 hq[h++]=bj; else //否则,析取加1 xq[x++]=bj; strcpy(sz,sz0); //恢复被修改的数组。 for(i2=0;i2 printf(\输出真值表前项 printf(\输出运算结果 } if(hq[0]==-1)//不存在合取范式时 printf(\该命题公式不存在主合取范式。\\n\ - 7 - else { printf(\该命题公式的主合取范式:\\n\\t\ for(i1=0;i1 if (i1>0)//判断并添加符号 printf(\ printf(\输出主合取范式 } } if(xq[0]==-1)//不存在析取范式时 printf(\该命题公式不存在主析取范式。\\n\ else { printf(\该命题公式的主析取范式:\\n\\t\ for(i1=0;i1 if (i1>0)//判断并添加符号 printf(\ printf(\输出主析取范式 } } printf(\ printf(\欢迎下次再次使用!\\n \结束 getch(); } void panduan(int b[N],int f) // 二进制赋值。 { int i; i=f; if(b[f]==0)//加1 b[f]=1; else//进位 { b[f]=0; panduan(b,--i); } } int tkh (char sz[N],char ccu[N],int icu[N],int h0)//分级运算函数 { int i,j,h,s,kh=0,wz[N],a; char xs1[N],ckh[N]; //xs1用来保存括号内的字符 ckh用来保存括号。 - 8 - s=strlen(sz); for(i=0;i if(sz[i]=='(' || sz[i]==')')//判断括号 { wz[kh]=i;//存储括号位置 ckh[kh]=sz[i];//存储括号类型 kh++; } if(kh==0) return fkh(sz,ccu,icu,h0);//如果无括号,直接运行 else { for(i=0;i if(ckh[i]==')')//找到第一个) break; for(j=wz[i-1]+1,h=0;j a=fkh(xs1,ccu,icu,h0);//运行最内级括号的式子,得到结果 if(a==1)//判断并存储结果 sz[wz[i-1]]=1; else sz[wz[i-1]]=-2; for(j=wz[i-1]+1;j return tkh(sz,ccu,icu,h0);//循环执行 } } int fkh(char sz[N],char ccu[N],int icu[N],int h0)//主运算函数 { int i,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s; char dt[N]; s=strlen(sz); if(s==1) if(sz[0]==-2)//判断是否是最后一项 return 0; else return 1; //1 就是sz[0]的值、 else { for(i=0;i - 9 -