Pagini recente » Cod sursa (job #2017206) | Cod sursa (job #94792)
Cod sursa(job #94792)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool chars[30];
char operatori[1000];
int poperatori;
char poloneza[1000];
int ppoloneza;
void transform(string& expresie)
{
poperatori = 0;
ppoloneza = 0;
while(expresie.length() > 0)
{
while(expresie.at(0) == ' ')
{
if(expresie.length() > 1)
expresie = expresie.substr(1);
else
expresie = "";
}
if(expresie.length() == 0)
break;
if(expresie.at(0) == '(')
{
operatori[poperatori++] = '(';
expresie = expresie.substr(1);
continue;
}
if(expresie.at(0) == ')')
{
while(poperatori >= 0)
{
if(operatori[poperatori--] == '(')
break;
poloneza[ppoloneza] = operatori[poperatori+1];
}
if(expresie.length() > 1)
expresie = expresie.substr(1);
else
expresie = "";
continue;
}
size_t poz1 = expresie.find_first_of(" ");
size_t poz2 = expresie.find_first_of(")");
string s1;
if(poz1 > 0 && poz2 > 0)
{
size_t min = poz1;
if(poz2<poz1)
min = poz2;
s1 = expresie.substr(0, min);
if(min < expresie.length())
expresie = expresie.substr(min);
else
expresie = "";
}
else
{
if(poz1 > 0)
{
s1 = expresie.substr(0, poz1);
if(poz1 < expresie.length())
expresie = expresie.substr(poz1);
else
expresie = "";
}
else
{
if(poz2 > 0)
{
s1 = expresie.substr(0, poz2);
if(poz2 < expresie.length())
expresie = expresie.substr(poz2);
else
expresie = "";
}
else
{
s1 = expresie;
expresie = "";
}
}
}
if(s1.length() == 1 && s1.at(0) >= 'A' && s1.at(0) <='Z')
poloneza[ppoloneza++] = s1.at(0);
if(s1.compare("TRUE") == 0)
poloneza[ppoloneza++] = '1';
if(s1.compare("FALSE") == 0)
poloneza[ppoloneza++] = '0';
if(s1.compare("NOT") == 0)
{
operatori[poperatori++] = '!';
}
if(s1.compare("AND") == 0)
{
while(poperatori > 0)
{
char c = operatori[poperatori];
if(c == '!' )
{
poperatori--;;
poloneza[ppoloneza++] = c;
continue;
}
break;
}
operatori[poperatori++] = '*'; //and
}
if(s1.compare("OR") == 0)
{
while(poperatori > 0)
{
char c = operatori[poperatori];
if(c == '+' || c == '(')
{
break;
}
poperatori--;
poloneza[ppoloneza++] = c;
break;
}
operatori[poperatori++] = '+'; //or
}
}
while(poperatori>0)
{
poloneza[ppoloneza++] = operatori[poperatori--];
}
}
int main(void)
{
ifstream in;
ofstream out;
in.open("bool.in");
out.open("bool.out");
string expresie;
char read[1001];
in.getline(read, 1001);
expresie.assign(read);
transform(expresie);
for(int i=0;i<30;++i)
chars[i] = false;
int n;
in >> n;
for(int i=0;i<n;++i)
{
char ch;
in >> ch;
bool value[1001];
int pvalue = 0;
chars[ch-'A'] = !chars[ch-'A'];
for(int k=0;k<ppoloneza;++k)
{
if(poloneza[k]>= 'A' && poloneza[k] <='Z')
value[pvalue++] = chars[poloneza[k] - 'A'];
if(poloneza[k] == '1')
value[pvalue++] = true;
if(poloneza[k] == '0')
value[pvalue++] = false;
if(poloneza[k] == '!')
{
value[pvalue-1] = !value[pvalue-1];
}
if(poloneza[k] == '*')
{
bool b = value[pvalue-1];
pvalue--;
bool a = value[pvalue-1];
pvalue--;
value[pvalue++] = a & b;
}
if(poloneza[k] == '+')
{
bool b = value[pvalue-1];
pvalue--;
bool a = value[pvalue-1];
pvalue--;
value[pvalue++] = a | b;
}
}
if(value[0])
out << "1";
else
out << "0";
}
out << "\n";
in.close();
out.close();
return 0;
}