楼上的思维真是令人吃惊,又学到了一招。我也写了一种方法,虽然比楼上的复杂,既然写出来了,就给你看看吧。没有检测错误输入的功能,不想添加了。
#include <stdio.h>
#include <string.h>
bool Get_Result(char * buff,int start,int end); //求一个表达式的值
bool Char_BOOL(char ch); //求字符V和F的值
void Delete_Space(char * buff); //删除空格
void Delete_Brackets(char * buff); //删除括号
void Delete_Excl(char * buff); //删除感叹号
void main()
{
char buff[1000] = "";
while(gets(buff) != NULL)
{
Delete_Space(buff);
Delete_Brackets(buff);
Delete_Excl(buff);
if(Get_Result(buff,0,strlen(buff)-1))
printf("V\n");
else
printf("F\n");
}
return;
}
bool Char_BOOL(char ch)
{
if(ch == 'V' || ch == 'v')
return true;
return false;
}
bool Get_Result(char * buff,int start,int end)
{
bool result;
char test[1000];
int i;
for(i=start; i<=end; i++)
test[i-start] = buff[i];
test[i-start] = '\0';
Delete_Excl(test);
if(strlen(test) == 1)
return Char_BOOL(test[0]);
else if(strlen(test) == 2)
return !Char_BOOL(test[0]);
else if(strlen(test) == 3)
{
if(test[1] == '|')
return Char_BOOL(test[0]) | Char_BOOL(test[2]);
else if(test[1] == '&')
return Char_BOOL(test[0]) & Char_BOOL(test[2]);
else
return Char_BOOL(test[1]);
}
else
{
result = Get_Result(test,0,strlen(test)-3);
if(test[strlen(test)-2] == '|')
return result | Char_BOOL(test[strlen(test)-1]);
return result & Char_BOOL(test[strlen(test)-1]);
}
}
void Delete_Space(char * buff)
{
char test[1000];
int i,j,k;
k = strlen(buff);
j = 0;
for(i=0; i<k; i++)
{
if(buff[i] != ' ' && buff[i] != '\n')
{
test[j] = buff[i];
j++;
}
}
test[j] = '\0';
strcpy(buff,test);
}
void Delete_Brackets(char * buff)
{
int i,j;
int start,end;
char test[1000];
if(strchr(buff,'(') == NULL)
return;
j = strlen(buff);
for(i=j-1; i>=0; i--)
{
if(buff[i] == '(')
break;
}
start = i;
for(i=start+1; i<j; i++)
{
if(buff[i] == ')')
break;
}
end = i;
buff[start] = '\0';
strcpy(test,buff+start+1);
test[end-start-1] = '\0';
if(Get_Result(test,0,strlen(test)))
sprintf(buff,"%sV%s",buff,buff+end+1);
else
sprintf(buff,"%sF%s",buff,buff+end+1);
Delete_Brackets(buff);
}
void Delete_Excl(char * buff)
{
char * pChar = NULL;
if((pChar = strchr(buff,'!')) == NULL)
return;
pChar[0] = '\0';
if(Char_BOOL(pChar[1]))
sprintf(buff,"%sF%s",buff,pChar+2);
else
sprintf(buff,"%sV%s",buff,pChar+2);
Delete_Excl(buff);
}
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/7aec54e736d12f2ea8b8f6c14bc2d562843568d5?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/838ba61ea8d3fd1f03a3fa9b344e251f94ca5fec?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/960a304e251f95ca9610ca17cd177f3e660952ad?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)