Pagini recente » Istoria paginii utilizator/barticiulia | Monitorul de evaluare | Monitorul de evaluare | Clasament dupa rating | Cod sursa (job #1574158)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
const int MAX = 2005, MAXI = 2005;
char s[MAX], a[MAXI];
int n, p;
bool var[500];
bool expresie();
bool termen();
bool factor();
int main()
{
cin.get(s, MAX);
cin>>n;
int poz = 0, bune = 0;
for(poz = 0; s[poz]; ++poz)
{
if(s[poz] == 'N' and s[poz+1] == 'O')
{
s[bune++] = '!';
poz += 2;
continue;
}
if(s[poz] == 'A' and s[poz+1] == 'N')
{
s[bune++] = '&';
poz += 2;
continue;
}
if(s[poz] == 'O' and s[poz+1] == 'R')
{
s[bune++] = '|';
poz += 1;
continue;
}
if(s[poz] == 'T' and s[poz+1] == 'R')
{
s[bune++] = '1';
poz += 3;
continue;
}
if(s[poz] == 'F' and s[poz+1] == 'A')
{
s[bune++] = '0';
poz += 4;
continue;
}
if(s[poz] == ' ') continue;
s[bune++] = s[poz];
}
s[bune] = NULL;
//cout<<s<<endl;
for(int i=1; i<=n; ++i)
{
char ch; cin>>ch;
var[ ch-'A' ] = ! var[ ch-'A' ];
p = 0;
cout<<expresie();
}
return 0;
}
bool expresie()
{
bool rez, ans = termen();
while(s[p] == '|')
{
p++;
rez = termen();
ans = (ans or rez);
}
return ans;
}
bool termen()
{
bool rez, ans = factor();
while(s[p] == '&')
{
p++;
rez = factor();
ans = (ans and rez);
}
return ans;
}
bool factor()
{
bool ans, rez;
if(s[p] == '!')
{
p++;
rez = expresie();
return !rez;
}
if(s[p] == '(')
{
p++;
ans = expresie();
p++;
return ans;
}
if(s[p]!='0' and s[p]!='1')
ans = var[s[p] - 'A'];
if(s[p] == '0') ans = false;
if(s[p] == '1') ans = true;
p++;
return ans;
}