#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
string str;
int in;//读
//循环定义,先申明
bool term();
bool expression();
bool factor();
bool expression(){
//表达式
bool result = term();
bool more =true;//假设还有新的项
while(more){
if(str[in] == '|'){
in++;//从输入取走字符
bool value = term();//大问题递归分解成小问题
result |= value;//或运算
}
else if(str[in] == ' '){
in++;
continue;
}
else if(str[in] == '\n'){
in++;
return result;
}
else more = false;//走完了
}
return result;
}
bool term(){
//项
bool result = factor();
bool more =true;//假设还有新的因子
while(more){
if(str[in] == '&'){
in++;
bool value = factor();//大问题递归分解成小问题
result &= value;//与
}
else if(str[in] == ' '){
in++;
continue;
}
else break;//项录入完了
}
return result;
}
bool factor(){
//因子
bool result;
bool more = true;
while(more){
if(str[in] == '!'){
in++;
result = !factor();
}
else if(str[in]=='('){
in++;
result = expression();
in++;//取走右括号
}
else if(str[in]==' '){
in++;
continue;
}
else{
if(str[in]=='V'){
in++;
result = 1;
}
else if(str[in]=='F'){
in++;
result = 0;
}
}
return result;
}
}
int main(){
int i = 1;
in = 0;
//freopen("in.txt","r",stdin);
while(getline(cin,str)){//强制类型转换运算符的重载(把istream转换)
in = 0;
bool result = expression();
cout<<"Expression "<<i<<": ";
if(result)cout<<"V\n";
else cout<<"F\n";
i++;
}
getchar();
return 0;
}
主要参考老师上课时的代码
- 对一个不固定长度的行来说,换行符就是终止;而对于不固定长度的文件来说,EOF就是终止,getline遇到EOF会停止提取,并且返回一个istream对象
- 之所以返回值istream在while中会进行真假判断,是因为C++进行了强制类型转换运算符的重载。
另外,学会了使用freopen,对流对象的理解加深了一点