Pagini recente » Cod sursa (job #1112678) | Cod sursa (job #2485138) | Cod sursa (job #2662376) | Cod sursa (job #3200790) | Cod sursa (job #1069971)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream ka("bool.in");
ofstream ki("bool.out");
int k;
struct paranteza
{
bool val;
int lungime;
}paranteze[1005];
string s, expresie, schimbari;
bool val[30],valoare[1005];
int lungime[1005];
bool evalueaza(int inceput, int sfarsit)
{
for(int i=inceput;i<=sfarsit;i++)
{
if(expresie[i]>='A'&&expresie[i]<='Z')
{
valoare[i]=val[expresie[i]-'A'];
lungime[i]=1;
}
else if(expresie[i]==')')
{
for(int j=i-1;j>=inceput;j--)
{
if(expresie[j]=='('&&!lungime[j])
{
valoare[j]=evalueaza(j+1,i-1);
lungime[j]=i-j+1;
break;
}
}
}
else
{
if(expresie[i]!=')'&&expresie[i]!='(')
lungime[i]=1;
if(expresie[i]<=1)
valoare[i]=expresie[i];
}
}
for(int i=sfarsit;i>=inceput;i--)
{
if(expresie[i]=='!')
{
valoare[i]=!valoare[i+1];
lungime[i]=lungime[i+1]+1;
}
}
for(int i=inceput;i<=sfarsit;i++)
{
if(expresie[i+lungime[i]]=='&'&&expresie[i]!='&'&&expresie[i]!='|')
{
valoare[i]=valoare[i]&&valoare[i+lungime[i]+1];
lungime[i]=lungime[i]+1+lungime[i+lungime[i]+1];
i--;
}
}
for(int i=inceput;i<=sfarsit;i++)
{
if(expresie[i+lungime[i]]=='|'&&expresie[i]!='&'&&expresie[i]!='|')
{
valoare[i]=valoare[i]||valoare[i+lungime[i]+1];
lungime[i]=lungime[i]+1+lungime[i+lungime[i]+1];
i--;
}
}
return valoare[inceput];
}
int main()
{
while (ka>>s)
{
if ( s[0] >= '0'&& s[0] <= '9')
break;
if(s=="TRUE")
expresie.push_back(1);
else if(s=="FALSE")
expresie.push_back(0);
else if(s=="AND")
expresie.push_back('&');
else if(s=="NOT")
expresie.push_back('!');
else if(s=="OR")
expresie.push_back('|');
else
{
for(int i=0;i<s.size();i++)
expresie.push_back(s[i]);
}
}
for(int i=0;i<expresie.size();i++)
{
if(expresie[i]=='T'&&expresie[i+1]=='R')
{
expresie[i]=1;
for(int j=i+1;j<=3;j++)
expresie[j]=expresie[j+3];
expresie.erase(i+1,3);
}
if(expresie[i]=='F'&&expresie[i+1]=='A')
{
expresie[i]=0;
for(int j=i+1;j<=i+4;j++)
expresie[j]=expresie[j+4];
expresie.erase(i+1,4);
}
if(expresie[i]=='N'&&expresie[i+1]=='O')
{
expresie[i]='!';
for(int j=i+1;j<=i+2;j++)
expresie[j]=expresie[j+2];
expresie.erase(i+1,2);
}
}
int nr = 0;
for(int i=0;i<s.size();i++)
nr=nr*10+s[i]-'0';
char x;
for(int i=1;i<=nr;i++)
{
ka>>x;
schimbari.push_back(x);
}
for(int i=0;i<nr;i++)
{
val[schimbari[i]-'A']=!val[schimbari[i]-'A'];
for(int j=0;j<expresie.size();j++)
lungime[j]=0;
ki<<evalueaza(0,expresie.size()-1);
}
}