Pagini recente » Cod sursa (job #1939450) | Cod sursa (job #2191677) | Cod sursa (job #1795251) | Cod sursa (job #3162539) | Cod sursa (job #250506)
Cod sursa(job #250506)
#include <fstream>
using namespace std;
int val[1000],n;
char *true1 = "1";
char *false1 = "0";
char* substr(char *s,int i,int j) //guess what it does
{
char *rez = new char[1001];
strcpy(rez,s+i);
rez[j+1-i]=0;
return rez;
}
char* compute_not(char* s)
{
if (s[0]=='1') return false1;
return true1;
}
char* compute_and(char*s,char*t)
{
if((s[0]+t[0])==('1'+'1')) return true1;
return false1;
}
char* compute_or(char*s,char*t)
{
if(s[0]+t[0]=='0'+'0') return false1;
return true1;
}
char* deparantezeaza(char* s)
{
int l=strlen(s);
if(s[0]=='(')
{
int ok=0;
int p=1;
for(int i=1; i<l && !ok ;i++)
{
if(!p) ok=1;
if(s[i]==')') p--;
else if(s[i]=='(') p++;
}
if(!ok)
{
s=substr(s,1,l-2);
s=deparantezeaza(s);
}
}
return s;
}
char* eval(char *s)
{
s=deparantezeaza(s);
int l=strlen(s);
if(l==1) if(val[s[0]-'A'])
return "1";
else
return "0";
else if (!strcmp(s,"TRUE")) return "1";
else if (!strcmp(s,"FALSE")) return "0";
else
{
int and1=-1;
int or1=-1;
int not1=-1;
int p=0;
for(int i=0;i<l-1;i++) //gasesc semnul de prioritate minima
{
if(s[i]=='(') p++;
else if(s[i]==')') p--;
else if(!p)
{
if(s[i]=='A' && s[i+1]=='N') and1=i+4;
else if(!p && s[i]=='O' && s[i+1]=='R') or1=i+3;
else if(s[i]=='N' && s[i+1]=='O') not1=i+4;
}
}
if (or1>-1) return compute_or(eval(substr(s,0,or1-5)),eval(substr(s,or1,l)));
if (and1>-1) return compute_and(eval(substr(s,0,and1-6)),eval(substr(s,and1,l)));
if (not1>-1) return compute_not(eval(substr(s,not1,l))); //pai not1 ar trebui sa fie mereu 4 cred
}
}
int main()
{
fstream f("bool.in",ios::in);
fstream f2("bool.out",ios::out);
char *p,*s;
char *vars;
int it;
vars = new char[101];
p=new char[1001];
f.get(p,1000);
f.get();
f>>it;
f>>vars;
// assign_vars(p,val,n);
val[0]=0;
for(int i=1;i<=it;i++)
{
val[vars[i-1]-'A']^=1;
s=p;
f2<<eval(s);
}
f.close();
f2.close();
return 0;
}