Pagini recente » Cod sursa (job #2771821) | Cod sursa (job #3260707) | Cod sursa (job #96075) | Cod sursa (job #977970) | Cod sursa (job #2428669)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s[2003];
bool v[27];
void strcp(char a[2003],char b[2003])
{
int i;
char aux[2003];
for (i=0; i<strlen(b); i++)
aux[i]=b[i];
aux[i]=NULL;
for (i=0; i<strlen(aux); i++)
a[i]=aux[i];
a[i]=NULL;
}
int jump(int indice)
{
int nr_ec_in_rama=0;
for (int i=indice+1; true; i++)
{
if (s[i]=='(')
nr_ec_in_rama++;
if (s[i]==')')
nr_ec_in_rama--;
if (nr_ec_in_rama<0)
return i;
}
}
int b_jump(int indice)
{
int nr_ec_in_rama=0;
for (int i=indice-1; true; i--)
{
if (s[i]==')')
nr_ec_in_rama++;
if (s[i]=='(')
nr_ec_in_rama--;
if (nr_ec_in_rama<0)
return i;
}
}
void influentare(bool &raspuns,bool informatie,bool cerinta,bool &negare)
{
if (negare==1)
{
negare=0;
if (cerinta==0)
raspuns=raspuns||!informatie;
else
raspuns=raspuns&&!informatie;
return;
}
if (cerinta==0)
raspuns=raspuns||informatie;
else
raspuns=raspuns&&informatie;
return;
}
bool ecuatie(int indice)
{
bool raspuns=false;
bool cerinta=false; // false - || , true - &&
bool negare=false;
int nr_ec_in_rama=0;
int i=indice;
while (nr_ec_in_rama>=0)
{
if (s[i]<='Z'&&s[i]>='A'&&(s[i+1]>'Z'||s[i+1]<'A')) // e o variabila
{
influentare(raspuns,v[s[i]-'A'],cerinta,negare);
}
else if (s[i]=='(')
{
bool c=ecuatie(i+1);
influentare(raspuns,c,cerinta,negare);
i=jump(i);
}
else if (s[i]==')')
nr_ec_in_rama--;
if (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
{
cerinta=true;
i+=2;
}
else if (s[i]=='O'&&s[i+1]=='R')
{
cerinta=false;
i+=1;
}
else if (s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
{
i+=2;
negare=1;
}
else if (s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S')
{
influentare(raspuns,false,cerinta,negare);
i+=4;
}
else if (s[i]=='T'&&s[i+1]=='R')
{
influentare(raspuns,true,cerinta,negare);
i+=3;
}
i++;
}
return raspuns;
}
int main()
{
fin.getline(s,1001);
int l=strlen(s);
s[l]=')';
s[l+1]=NULL;
strcp(s+1,s);
s[0]='(';
cout << s <<"\n";
for (int i=0; i<strlen(s); i++)
{
if (s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
{
int inainte=i-1;
int dupa=i+3;
for (int j=dupa; j<=strlen(s); j++)
{
if (s[j]=='(')
{
j=jump(j);
strcp(s+j+1,s+j);
break;
}
if (s[j]<='Z'&&s[j]>='A'&&(s[j+1]>'Z'||s[j+1]<'A')&&(s[j-1]>'Z'||s[j-1]<'A')) // e o variabila
{
strcp(s+j+1,s+j);
s[j+1]=')';
break;
}
if (s[j]=='F'&&s[j+1]=='A'&&s[j+2]=='L'&&s[j+3]=='S')
{
j+=4;
strcp(s+j+1,s+j);
s[j+1]=')';
break;
}
if (s[j]=='T'&&s[j+1]=='R')
{
j+=3;
strcp(s+j+1,s+j);
s[j+1]=')';
break;
}
}
//cout << s << "\n";
for (int j=inainte; j>=0; j--)
{
if (s[j]==')')
{
j=b_jump(j);
//cout << j <<endl;
strcp(s+j+1,s+j);
break;
}
if (s[j]<='Z'&&s[j]>='A'&&(s[j+1]>'Z'||s[j+1]<'A')&&(s[j-1]>'Z'||s[j-1]<'A')) // e o variabila
{
strcp(s+j+1,s+j);
s[j]='(';
break;
}
if (s[j]=='F'&&s[j+1]=='A'&&s[j+2]=='L'&&s[j+3]=='S')
{
strcp(s+j+1,s+j);
s[j]='(';
break;
}
if (s[j]=='T'&&s[j+1]=='R')
{
strcp(s+j+1,s+j);
s[j]='(';
break;
}
}
i+=3;
}
}
int n;
cout << s << "\n";
fin >> n;
for (int i=1; i<=n; i++)
{
char x;
fin >> x;
v[x-'A']=!v[x-'A'];
fout << ecuatie(1);
}
return 0;
}