Pagini recente » Cod sursa (job #2681540) | Cod sursa (job #1336155) | Cod sursa (job #577871) | Autentificare | Cod sursa (job #698767)
Cod sursa(job #698767)
#include <iostream>
#include <fstream>
#include <string>
#define H(C) ((C) - 64)
bool v[30];
std::string exp;
std::string::iterator it;
void transform(std::string& aux);
bool unu();
bool doi();
bool trei();
bool patru();
int main()
{
char c;
int n;
std::string aux;
std::ifstream fin("bool.in");
std::ofstream fout("bool.out");
getline(fin,aux);
transform(aux);
fin >> n;
getline(fin,aux);
for(; n; --n)
{
c = fin.get();
v[H(c)] = !v[H(c)];
it = exp.begin();
fout << unu();
}
fin.close();
fout.close();
return 0;
}
bool unu()
{
bool r = doi();
while(*it == '|')
{
++it;
r = r || doi();
}
return r;
}
bool doi()
{
bool r = trei();
while(*it == '&')
{
++it;
r = r && trei();
}
return r;
}
bool trei()
{
bool r = patru();
while(*it == '!')
{
++it;
r = !patru();
}
return r;
}
bool patru()
{
bool r = false;
if(*it == '(')
{
++it;
r = unu();
++it;
}
else
{
if(*it == '0' || *it == '1')
r = *it - '0';
else
r = v[H(*it)];
}
return r;
}
void transform(std::string& aux)
{
for(int i = 0; i < aux.size(); )
{
if(aux[i] == ' ')
{
++i;
continue;
}
if(aux[i] == 'A' && aux.substr(i,3) == "AND")
{
exp += '&';
i += 4;
}
else if(aux[i] == 'T' && aux.substr(i,4) == "TRUE")
{
exp += '1';
i+=5;
}
else if(aux[i] == 'F' && aux.substr(i,5) == "FALSE")
{
exp += '0';
i += 6;
}
else if(aux[i] == 'N' && aux.substr(i,3) == "NOT")
{
exp += '!';
i += 4;
}
else if(aux[i] == 'O' && aux.substr(i,2) == "OR")
{
exp += '|';
i += 3;
}
else
{
exp += aux[i];
++i;
}
}
}