Pagini recente » Cod sursa (job #2133198) | Cod sursa (job #2616650) | Cod sursa (job #2175742) | Cod sursa (job #890300) | Cod sursa (job #2059106)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int n, val[200], i;
char ch;
string str;
vector<string> s;
int evalueaza();
int factor();
int termen1();
int termen2();
int evalueaza(){
int r = termen1();
while(i < s.size() && s[i] == "OR"){
++ i;
int aux = termen1();
r = r || aux;
}
return r;
}
int termen1(){
int r = termen2();
while(i < s.size() && s[i] == "AND"){
++ i;
int aux = termen2();
r = r && aux;
}
return r;
}
int termen2(){
int nr = 0;
while(i < s.size() && s[i] == "NOT"){
++ nr;
++ i;
}
int r = factor();
if(nr % 2 == 1)
r = !r;
return r;
}
int factor(){
int r = 0;
if(i < s.size() && s[i] == "("){
++ i;
r = evalueaza();
++ i;
}
else if(i < s.size() && s[i] == "TRUE"){
++ i;
r = 1;
}
else if(i < s.size() && s[i] == "FALSE"){
++ i;
r = 0;
}
else if(i < s.size()){
r = val[s[i][0]];
++ i;
}
return r;
}
int main(){
while(true){
f>>str;
int nr = 0;
if(str[0] <= '9' && str[0] >= '0'){
for(int i = 0; i < str.size(); ++ i)
n = n * 10 + str[i] - '0';
break;
}
else{
while(!str.empty() && str[0] == '('){
s.push_back("(");
str.erase(str.begin());
}
while(!str.empty() && str[str.size() - 1] == ')'){
++nr;
str.erase(str.size() - 1, str.size() - 1);
}
s.push_back(str);
for(int i = 1; i <= nr; ++ i)
s.push_back(")");
}
}
for(int j = 1; j <= n; ++ j){
i = 0;
f>>ch;
val[ch] = 1 - val[ch];
int res = evalueaza();
g<<res;
}
/*g<<'\n';
for(int i = 0; i < s.size(); ++ i){
g<<s[i]<<" ";
}*/
return 0;
}