Pagini recente » Cod sursa (job #2968862) | Cod sursa (job #1530031) | Cod sursa (job #1293250) | Profil Vlad3108 | Cod sursa (job #2062669)
#include<fstream>
#define dim 1010
#include<string>
#include<vector>
using namespace std;
vector<string> s;
bool lit[91];
string aux;
int i;
bool sau();
bool si();
bool nu();
bool exp();
bool sau()
{
bool rez=si();
while(i<s.size() && s[i]=="OR")
{
++i;
bool rez1=si();
rez=rez||rez1;
}
return rez;
}
bool si()
{
bool rez=nu();
while(i<s.size() && s[i]=="AND")
{
++i;
bool rez1=nu();
rez=rez&&rez1;
}
return rez;
}
bool nu()
{
int nrDeNu=0;
while(i<s.size() && s[i]=="NOT")
{
++i;
nrDeNu++;
}
bool rez=exp();
//numaram cati de not sunt si daca sunt numar impar schimbam rez - din 1 facem 0 si invers
if(nrDeNu%2==1)
rez=(!rez);
return rez;
}
bool exp()
{
bool rez=0;
if(i<s.size() && s[i]=="(")
{
++i;
rez=sau();
++i;
}
else
if(i<s.size() && s[i]=="TRUE")
{
++i;
rez=1;
}
else
if(i<s.size() && s[i]=="FALSE")
{
++i;
rez=0;
}
else
if(i<s.size())
{
rez=lit[s[i][0]];
++i;
}
return rez;
}
int main()
{
int n=0,j;
ifstream fin("bool.in");
ofstream fout("bool.out");
//introducem in fiecare componenta a vectorului de stringuri s cate o unitate de sintaxa(paranteze, litere, true, false)
while(fin>>aux)
{
//daca e numarul de evaluari il retin in n
if(aux[0]>='0' && aux[0]<='9')
{
for(j=0;j<aux.size();j++)
n=n*10+(aux[j]-'0');
break;
//aici oprim citirea ca sa putem citi separat secventa de litere mari
}
else
{
//daca s a citit o paranteza deschisa sau mai multe le copii in vectorul de stringuri s
while(aux.empty()==0 && aux[0]=='(')
{
s.push_back("(");
aux.erase(aux.begin());
}
int nr=0;
while(aux.empty()==false && aux[aux.size()-1]==')')
{
nr++;
aux.erase(aux.size()-1, aux.size()-1);
}
//am curatat stringurile de paranteze, au mai ramas doar true false sau litere mari, le punem in vector
s.push_back(aux);
//acum punem pe rand si parantezele inchise
while(nr!=0)
{
s.push_back(")");
nr--;
}
}
}
//citim secventa, rulam de n ori evaluarea expresiei cu schimabarea corespunzatoare a valorii booleene din literea mare
fin>>aux;
for(j=0;j<n;j++)
{
//resetam i
i=0;
//modificam din true in false si invers
lit[aux[j]]=1-lit[aux[j]];
//apelam evaluarea si afisam
fout<<sau();
}
return 0;
}