Pagini recente » Cod sursa (job #1556098) | Cod sursa (job #1715487) | Cod sursa (job #334849) | Cod sursa (job #2207556) | Cod sursa (job #2832979)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int NMAX = 1e3;
const int MMAX = 2e2;
char s[NMAX + 5];
char t[NMAX + 5], ch;
bool valori[MMAX];
int n, m, modificari;
bool expresie(); // o expresie este formata din mai multi termeni legati prin OR('|')
bool termen(); // un termen este format din mai multi factori legati prin AND('&')
bool factor(); // un factor este o variabila simpla sau o variabila negata ('0' sau "!0")
void build(){
m = 0;
n = 0;
string x;
int i = 0;
while(s[i]){
if(s[i] != char(32)){
if(s[i] == '(' || s[i] == ')')
t[m] = s[i], m++, i++;
else{
x.clear();
while(isupper(s[i]))
x += s[i], i++;
if(x == "OR")
t[m] = '|';
else if(x == "AND")
t[m] = '&';
else if(x == "NOT")
t[m] = '!';
else if(x == "TRUE")
t[m] = '1';
else if (x == "FALSE")
t[m] = '0';
else{
ch = x[0];
t[m] = (valori[ch] + 48);
}
m++;
}
}else
i++;
}
//cout << "expresie = " << t << "\n";
}
bool expresie(){
bool x = termen();
while(t[n] == '|'){
n++;
bool t = termen();
x |= t;
}
return x;
}
bool termen(){
bool x = factor();
while(t[n] == '&'){
n++;
bool f = factor();
x &= f;
}
return x;
}
bool factor(){
bool x = 0, negare = 0;
while(t[n] == '!')
negare = !negare, n++;
if(t[n] == '('){
n++;
x = expresie();
n++;
if(!negare)
return x;
return !x;
}
if(t[n] == '0')
x = 0;
else x = 1;
n++;
if(!negare)
return x;
return !x;
}
int main(){
cin.getline(s, NMAX);
cin >> modificari;
build();
for(int i = 0; i < modificari; i++){
cin >> ch;
valori[ch] = !valori[ch];
build();
cout << expresie();
}
}