Pagini recente » Cod sursa (job #965613) | Cod sursa (job #853567) | Cod sursa (job #1635697) | Cod sursa (job #355776) | Cod sursa (job #2918187)
#include <bits/stdc++.h>
#define nmax 101
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
string in,p,ch;
int n;
void parse()
{
int i=0;
while(i<in.size())
{
string l5=in.substr(i,5);
string l4=in.substr(i,4);
string l3=in.substr(i,3);
string l2=in.substr(i,2);
if(l4=="TRUE")
{
p.push_back('1');
i+=4;
}
else if(l5=="FALSE")
{
p.push_back('0');
i+=5;
}
else if(l3=="AND")
{
p.push_back('&');
i+=3;
}
else if(l3=="NOT")
{
p.push_back('!');
i+=3;
}
else if(l2=="OR")
{
p.push_back('|');
i+=2;
}
else if((in[i]>='A'&&in[i]<='Z')||in[i]=='('||in[i]==')')
{
p.push_back(in[i]);
i++;
}
else
{
i++;
}
//cout<<i<<' '<<p<<' '<<in.size()<<'\n';
}
}
bool evalNot();
bool evalOr();
bool evalAnd();
bool evalVar();
int pt=0;
bool val[27];
bool evalOr()
{
//cout<<"or begin at "<<pt<<'\n';
bool a=evalAnd();
while(p[pt]=='|')
{
pt++;
//cout<<"or continue at "<<pt<<'\n';
bool b=evalAnd();
a=a|b;
}
return a;
}
bool evalAnd()
{
//cout<<"and begin at "<<pt<<'\n';
bool a=evalNot();
while(p[pt]=='&')
{
//cout<<"and continue at "<<pt<<'\n';
pt++;
bool b=evalNot();
a=a&b;
}
return a;
}
bool evalNot()
{
//cout<<"not begin at "<<pt<<'\n';
if(p[pt]=='!')
{
//cout<<"not continue at "<<pt<<'\n';
pt++;
return !evalVar();
}
return evalVar();
}
bool evalVar()
{
if(p[pt]=='(')
{
pt++;
//cout<<"paran eval at "<<pt<<'\n';
bool a=evalOr();
pt++; //paranteza inchisa;
return a;
}
if(p[pt]=='1') {pt++;return 1;}
if(p[pt]=='0') {pt++; return 0;}
bool a=val[p[pt]-'A'];
//cout<<"value of "<<p[pt]<<' '<<a<<" at "<<pt<<'\n';
pt++;
return a;
}
int main()
{
getline(f,in);
parse();
//g<<p<<'\n';
f>>n>>ch;
for(int i=0;i<n;i++)
{
val[ch[i]-'A']^=1;
pt=0;
g<<evalOr();
//cout<<"eval finished\n";
}
return 0;
}