用c语言求真值表以及主析取式,请大神指点

FgFan_ 2018-03-20 08:46:00
//'|'表示'\/','&'表示'/\','!'表示'非','>'表示'→','-'表示'↔'
#include<stdio.h>
#define n 50
//计算输入公式的真值
int key(char *a,int *b){
int i,k;
for(i=0;i<n;i++)
switch(a[i])
{
case'!':
b[i+1]=!b[i+1];break;
case'&':
if(a[i+1]=='!')
{b[i+1]=b[i-1]&&!b[i+2];
b[i+2]=!b[i+1];break;}
else
b[i+1]=b[i-1]&&b[i+1];break;
case'|':
if(a[i+1]=='!')
{b[i+1]=b[i-1]||!b[i+2];
b[i+2]=!b[i+1];break;}
else
b[i+1]=b[i-1]||b[i+1];break;
case'>':
if(a[i+1]=='!')
{b[i+1]=!b[i-1]||!b[i+2];
b[i+2]=!b[i+1];break;}
else
b[i+1]=!b[i-1]||b[i+1];break;
case'-':
if(a[i+1]=='!')
{b[i+1]=(b[i-1]&&!b[i+2])||(!b[i-1]&&b[i+2]);
b[i+2]=!b[i+1];break;}
else
b[i+1]=(b[i-1]&&b[i+1])||(!b[i-1]&&!b[i+1]);break;
case'#':
k=b[i-1];
default:
break;
}
return k;
}
//……………………………………………………………………………………//
int main(){
char a[n],c[3]={'#','#','#'},x[n];
int i,b[n],z=0;
printf("请输入含三个以内变量合法的合式公式(以“#”结尾):\n");
scanf("%s",a);
// 真 值 表 第 一 行
for(i=0;i<n;i++)
{
if(a[i]=='!'||a[i]=='&'||a[i]=='|'||a[i]=='-'||a[i]=='>')
b[i]=-1;
if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))
{
b[i]=1;
if(a[i]!=c[0]||a[i]!=c[1]||a[i]!=c[2])
{
if(c[0]=='#'&&c[1]!=a[i]&&c[2]!=a[i])
c[0]=a[i];
if(c[1]=='#'&&c[0]!=a[i]&&c[2]!=a[i])
c[1]=a[i];
if(c[2]=='#'&&c[0]!=a[i]&&c[1]!=a[i])
c[2]=a[i];
}
}
if(a[i]=='#')
{
b[i]=35;
break;
}
}
for(i=0;i<3;i++)
{
if(c[i]=='#')
break;
printf("%c\t",c[i]);
}
for(i=0;i<n;i++)
{
if(a[i]=='#')
break;
printf("%c",a[i]);
}
putchar(10);
for(i=0;i<3;i++)
{
if(c[i]=='#')
break;
printf("1\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{
if(c[0]!='#'&&c[1]=='#')
x[0]=c[0];
if(c[2]=='#'&&c[1]!='#')
{x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]=')';}
if(c[2]!='#')
{x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';}
}
// 公 式 真 值
printf("%d\n",key(a,b));
// 真 值 表 第 二 行
if(c[1]!='#')
{
for(i=0;i<n;i++)
{
if(c[1]=='#')//1
if(a[i]==c[0])
b[i]=0;
if(c[2]=='#')//2
{if(a[i]==c[0]) b[i]=1;
if(a[i]==c[1]) b[i]=0;}
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=1;
if(a[i]==c[1]) b[i]=1;
if(a[i]==c[2]) b[i]=0;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]=='#')//二1
printf("1\t");
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("1\t");
if(i==1&&c[i]!='#'&&c[i+1]=='#')//二2
printf("0\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("1\t");
if(i==2&&c[i]!='#')//三3
printf("0\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{
if(c[2]=='#')
{x[z++]='|';x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]=')';}
if(c[2]!='#')
{x[z++]='|';x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]='&';x[z++]='!';x[z++]=c[2];x[z++]=')';}
}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 三 行
if(c[1]!='#')
{
for(i=0;i<n;i++)
{
if(c[2]=='#')//2
{if(a[i]==c[0]) b[i]=0;
if(a[i]==c[1]) b[i]=1;}
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=1;
if(a[i]==c[1]) b[i]=0;
if(a[i]==c[2]) b[i]=1;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]=='#')//二1
printf("0\t");
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("1\t");
if(i==1&&c[i]!='#'&&c[i+1]=='#')//二2
printf("1\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("0\t");
if(i==2&&c[i]!='#')//三3
printf("1\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{
if(c[2]=='#')
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]=')';}
if(c[2]!='#')
{x[z++]='|';x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';}
}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 四 行
if(c[2]!='#')
{
for(i=0;i<n;i++)
{
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=1;
if(a[i]==c[1]) b[i]=0;
if(a[i]==c[2]) b[i]=0;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("1\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("0\t");
if(i==2&&c[i]!='#')//三3
printf("0\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{x[z++]='|';x[z++]='(';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[++z]='&';x[++z]='!';x[++z]=c[2];x[++z]=')';}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 五 行
if(c[2]!='#')
{
for(i=0;i<n;i++)
{
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=0;
if(a[i]==c[1]) b[i]=1;
if(a[i]==c[2]) b[i]=1;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("0\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("1\t");
if(i==2&&c[i]!='#')//三3
printf("1\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 六 行
if(c[2]!='#')
{
for(i=0;i<n;i++)
{
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=0;
if(a[i]==c[1]) b[i]=1;
if(a[i]==c[2]) b[i]=0;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("0\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("1\t");
if(i==2&&c[i]!='#')//三3
printf("0\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]=c[1];x[z++]='&';x[z++]='!';x[z++]=c[2];x[z++]=')';}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 七 行
if(c[2]!='#')
{
for(i=0;i<n;i++)
{
if(c[2]!='#')//3
{if(a[i]==c[0]) b[i]=0;
if(a[i]==c[1]) b[i]=0;
if(a[i]==c[2]) b[i]=1;}
}
for(i=0;i<3;i++)
{
if(i==0&&c[i]!='#'&&c[i+1]!='#'&&c[i+2]!='#')//三1
printf("0\t");
if(i==1&&c[i]!='#'&&c[i+1]!='#')//三2
printf("0\t");
if(i==2&&c[i]!='#')//三3
printf("1\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';}
// 公 式 真 值
printf("%d\n",key(a,b));
}
// 真 值 表 第 八 行
for(i=0;i<n;i++)
{
if(a[i]=='!'||a[i]=='&'||a[i]=='|'||a[i]=='-'||a[i]=='>')
b[i]=-1;
if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))
{
b[i]=0;
}
if(a[i]=='#')
{
b[i]=35;
break;
}
}
for(i=0;i<3;i++)
{
if(c[i]=='#')
break;
printf("0\t");
}
// 主 析 取 部 分
if(key(a,b)==1)
{
if(c[0]!='#'&&c[1]=='#')
{x[0]='!';x[1]=c[0];}
if(c[1]!='#'&&c[2]=='#')
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]=')';}
if(c[2]!='#')
{x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]='&';x[z++]='!';x[z++]=c[2];x[z++]=')';}

}
// 公 式 真 值
printf("%d\n",key(a,b));
// 输 出 主 析 取 范 式
putchar(10);
printf("主析取范式:");
if(x[0]!='|')
printf("%c",x[0]);
for(i=1;i<n;i++)
if(x[i]>=0&&x[i]<=127&&x[i]!=35)
printf("%c",x[i]);
putchar(10);
return 0;
}



问题:输入类似“Q|P|R#”的公式时,输出的主析取范式会不完整且输出的真值表也会出现错误。
可能是求主析取范式的部分有错误,把主析取部分都去掉时,输出的真值表是没有问题的。
请求大佬帮助!
...全文
950 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-21
  • 打赏
  • 举报
回复
自信男孩 2018-03-21
  • 打赏
  • 举报
回复
x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';
这么写代码不感觉看着都费劲吗?
赵4老师 2018-03-21
  • 打赏
  • 举报
回复
int L=sprintf(x+z,"|(!%c&!%c&%c)",c[0],c[1],c[2]);z+=L;
FgFan_ 2018-03-21
  • 打赏
  • 举报
回复
引用 2 楼 自信男孩的回复:
x[z++]='|';x[z++]='(';x[z++]='!';x[z++]=c[0];x[z++]='&';x[z++]='!';x[z++]=c[1];x[z++]='&';x[z++]=c[2];x[z++]=')';
这么写代码不感觉看着都费劲吗?
累啊,但是小白刚入门,想不到什么更好的方法。。
FgFan_ 2018-03-20
  • 打赏
  • 举报
回复
用vc++6.0编译的

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧