利用真值表法求取主析取范式以及主合取范式的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#define N 50
void pd(int b[N],int f);
int H1 (char T1[N], char T2[N], int T3[N], int y);
int H2 (char T1[N], char T2[N], int T3[N], int y);
int main()
{
int i1,i2,d=1,T3[N],kh=0,jg,j=0,y;
int w=0,hequ[N],h=0,x=0,xiqu[N];
char T1[N],T2[N],T10[N],s;
hequ[0]=-1;
xiqu[0]=-1;
printf("#########################################\n"); printf("## 用!表示否定 ##\n");
printf("## 用&表示合取 ##\n");
printf("## 用|表示析取 ##\n");
printf("## 用^表示条件 ##\n");
printf("## 用~表示双条件 ##\n");
printf("#########################################\n\n"); printf("请输入一个合法的命题公式:\n");
gets(T1);
strcpy(T10,T1);
for(i1=0;i1 { if(T1[i1]==')' || T1[i1]=='(') kh++; if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' && T1[i1]<='Z') { for(i2=0;i2 if(T2[i2]==T1[i1]) d=0; if(d==1) { T2[j]=T1[i1]; j++; } d=1; } } 1 printf("\n输出真值表如下:\n \n"); for(i1=0;i1 printf(" %c ",T2[i1]); printf(" "); puts(T1); printf("\n"); for(i1=0;i1 T3[i1]=0; for(i2=0;i2 printf(" %d ",T3[i2]); jg=H1(T1,T2,T3,y); if(jg==0) hequ[h++]=w; else xiqu[x++]=w; printf(" %d\n",jg); strcpy(T1,T10); for(i1=0;i1<(int)pow(2,j)-1;i1++) { ++w; pd(T3,j-1); jg=H1(T1,T2,T3,y); if(jg==0) hequ[h++]=w; else xiqu[x++]=w; strcpy(T1,T10); for(i2=0;i2 printf(" %d ",T3[i2]); printf(" %d\n",jg); } if(hequ[0]==-1) printf("\n该命题公式不存在主合取范式。\n"); else { printf("\n主合取范式:\n\t"); for(i1=0;i1 { if (i1>0) printf("/\\"); printf("M(%d)",hequ[i1]); } } if(xiqu[0]==-1) 2 printf("\n该命题公式不存在主析取范式。\n"); else { printf("\n\n主析取范式:\n\t"); for(i1=0;i1 { if (i1>0) printf("\\/"); printf("m(%d)",xiqu[i1]); } } printf("\n"); getch(); } void pd(int b[N],int f) { int i; i=f; if(b[f]==0) b[f]=1; else { b[f]=0; pd(b,--i); } } int H1 (char T1[N],char T2[N],int T3[N],int y) { int i,j,h,s,kh=0,wz[N],a; char xs1[N],ckh[N]; s=strlen(T1); for(i=0;i if(T1[i]=='(' || T1[i]==')') { wz[kh]=i; ckh[kh]=T1[i]; kh++; } if(kh==0) return H2(T1,T2,T3,y); else { for(i=0;i if(ckh[i]==')') 3 break; for(j=wz[i-1]+1,h=0;j xs1[h]='\0'; a=H2(xs1,T2,T3,y); if(a==1) T1[wz[i-1]]=1; else T1[wz[i-1]]=-2; for(j=wz[i-1]+1;j T1[j]='\0';