作业帮 > 综合 > 作业

用C++实现布尔表达式的真值问题

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/11 15:29:47
用C++实现布尔表达式的真值问题
目的:本课程设计是求中缀算术表达式真值问题.求中缀算术表达式值的问题是数据结构中栈的一个典型应用.通过本题,学生应掌握中缀表达式和后缀表达式的转换方法和后缀表达式求值问题.
要求:已知某种类型的布尔表达式由“T”、“F”、“!”、“&”和“|”组成,其中,“T”代表真值True,“F”代表真值False,”代表逻辑非运算,“&”代表逻辑与运算,“|”代表逻辑或运算.并且,运算符“!”、“&”和“|”的优先级为:”最高,“|”最低,“&”介于“!”和“|”之间.你的任务是,计算给定布尔表达式的真值.
例如,布尔表达式“(T|T)&F&(F|T)”的真值为“F”.
求源代码.
#include <stdio.h>#include <string.h>
bool eval(const char*s){  if(!s) return 0;if(*s==0 || *s==')') return 0; 
if(*s=='(') return eval(s+1); 
const char*p=s; char c=*p++; if(c!='T' && c!='F') printf("Invalid expression.\n"); return 0; bool v=(c=='T')?1:0; 
if(*p=='!') v!=eval(p+1); else if(*p=='|') v|=eval(p+1); else if(*p=='&')v&=eval(p+1); else if(*p!=0 && *p!=')')printf("Invalid expression...\n");  
return v;}
int main(){char*s="(T|T)&F&(F|T)"; 
printf("eval( %s )=%c\nPress Enter to quit...\n", s, (eval(s)==0)?'F':'T');getchar();return 0;}

再问: (T|T)&F&(F|T)这只是我怕有些人看不懂觉得例子,你这样写的话就只能判断这样了的一个了,其他情况的就不能判断了
再答: 处理括号的情况十分复杂,前面的代码有bug, 费了九牛二虎之力才清除掉,而且还是不觉得十分踏实,汗。。。至于输入字符串的代码,你自己添加吧。。。

#include
#include

// 不含括号的情况
bool eva(const char*s){ if(!s) return 0;
const char*p=s;
if(*p!='T' && *p!='F') return 0;
bool c=(*p++=='T')?1:0; bool v=c;
while(*p=='&'){p++; c=(*p++=='T')?1:0; v&=c; };
if(*p=='|') return v|eva(p+1);
else return v;
}

// 允许括号嵌套
bool eval(char*s){ if(!s) return 0; if(*s==0) return 0;

char *p=strrchr(s, '('); if(!p) return eva(s);
char *q=strchr(p+1, ')'); if(!q) {printf("Invalid expression.\n"); return 0;}
bool v=eva(p+1);
char c=(v==true)? 'T':'F';
memmove(p,q,strlen(q)+1);
*p=c;
return eval(s);
}

int main(){ char t[128];
//char s[128]=="(T|T)&F&(F|T)";
char s[128]="(T|T)&F&(F|T)|((F&T)|T)";
//char s[128]=="F|(F|F)&T";
//char s[128]="(T|T)&F&(F|T)|(F&T)|T&F";
strcpy(t,s);
bool v=eval(s);
printf("eval( %s )=%c\nPress Enter to quit...\n", t, (v==0)?'F':'T');
getchar();
return 0;
}