Pagini recente » Cod sursa (job #6112) | Cod sursa (job #1178738) | Cod sursa (job #2632895) | Cod sursa (job #1421502) | Cod sursa (job #2642931)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s[1002];
int o[27];
int i, lg;
bool EvaluareExpresie();
bool EvaluareTermen();
bool EvaluareFactor();
int main()
{
int n, y;
char h;
fin.get(h);
while(h!='\n')
{
if(h!=' ')
{
lg++;
s[lg-1]=h;
}
fin.get(h);
}
s[lg]='\0';
//cout<<s<<"\n";
fin>>n; fin.get();
for(y=1; y<=n; y++)
{
fin>>h;
o[h-'A'+1]=(o[h-'A'+1]==1?0:1);
i=0;
fout<<EvaluareExpresie();
}
}
bool EvaluareExpresie()
{
bool x=EvaluareTermen();
bool ok;
//cout<<"x= "<<x<<"\ni= "<<i<<"\n\n";
ok=1;
if(s[i]!='O' || s[i+1]!='R')
{
ok=0;
}
else i=i+2;
while(i<lg && ok)
{
//cout<<"i= "<<i<<"\n";
bool evaluare=EvaluareTermen();
//cout<<"evaluare= "<<evaluare<<"\n";
x=(x || evaluare );
//cout<<"x= "<<x<<"\n\n";
if(s[i]!='O' || s[i+1]!='R')
{
ok=0;
}
else i=i+2;
}
if(s[i]==')')
{
i++; //sar peste paranteza
}
return x;
}
bool EvaluareTermen()
{
bool x=EvaluareFactor();
bool ok;
//cout<<"x= "<<x<<"\ni= "<<i<<"\n\n";
ok=1;
if(s[i]!='A' || s[i+1]!='N' || s[i+2]!='D')
{
ok=0;
}
else i=i+3;
while(i<lg && ok )
{
//cout<<"i= "<<i<<"\n";
bool evaluare=EvaluareFactor();
//cout<<"evaluare= "<<evaluare<<"\n";
x=(x && evaluare );
//cout<<"x= "<<x<<"\n\n";
if(s[i]!='A' || s[i+1]!='N' || s[i+2]!='D')
{
ok=0;
}
else i=i+3;
}
return x;
}
bool EvaluareFactor()
{
bool neg=0, aux;
int ver;
while(s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
{
i=i+3; //sar peste "NOT"
neg=(neg==1?0:1);
}
if(s[i]=='(')
{
i++; //sar peste paranteza
aux=EvaluareExpresie();
if(neg==0)return aux;
//else
return (aux==1?0:1);
}
//else
//cout<<"i= "<<i+1<<"\n";
//verific daca este "TRUE" sau "FALSE"
ver=o[ s[i]-'A'+1 ]; //in cazul in care este doar o variabila
if(s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
{
i=i+4;
ver=1;
}
else if(s[i]=='F' && s[i+1]=='A' && s[i+2] == 'L' && s[i+3]=='S' && s[i+4]=='E')
{
i=i+5;
ver=0;
}
else i++; //sar peste caracter
if(neg==0)
{
//cout<<ver<<"\n";
return (ver==1?1:0);
}
//else
// cout<<(ver==1?0:1)<<"\n";
return (ver==1?0:1);
}