Pagini recente » Cod sursa (job #1334405) | Cod sursa (job #1348132) | Cod sursa (job #701112) | Cod sursa (job #745320) | Cod sursa (job #1464492)
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
int N,dimsirorig,dimsir; // vezi a treia metoda de rezolvare de la problema evaluare pentru explicatii
bool val[105];
char sirorig[1010],sir[1010];
inline void prelucrare();
bool eval(char*&);
bool termen(char*&);
bool factor(char*&);
int main()
{
f.getline(sirorig,1005);
dimsirorig=strlen(sirorig);
prelucrare();
f>>N;
FOR (i,1,N) {
char x;
f>>x;
int nr=x-'A';
val[nr]=!val[nr];
char *p=sir;
g<<eval(p);
}
f.close();g.close();
return 0;
}
bool eval(char*& p) {
bool rez=termen(p);
while (*p=='|') {
++p;
bool da=termen(p);
rez=(rez || da);
}
return rez;
}
bool termen(char*& p) {
bool rez=factor(p);
while (*p=='&') {
++p;
bool da=factor(p);
rez=(rez && da);
}
return rez;
}
bool factor(char*& p) {
bool neg=false;
while (*p=='!') {
neg=!neg;
++p;
}
if (*p=='(') {
bool rez;
++p;
rez=eval(p);
++p;
if (neg) {
return !rez;
}
else {
return rez;
}
}
else {
char first=*p;
if (*p=='T' && *(p+1)=='R') {
p=p+4;
if (neg) {
return false;
}
else {
return true;
}
}
else if (*p=='F' && *(p+1)=='A') {
p=p+5;
if (neg) {
return true;
}
else {
return false;
}
}
else {
int nr=first-'A';
++p;
if (neg) {
return !val[nr];
}
return val[nr];
}
}
}
inline void prelucrare() { // prelucrez expresia data astfel incat "NOT" = "!", "OR"="|", "AND"="&" si nu exista spatii
int contor;
char word[4]={"NOT"};
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
++contor;
if (contor==3) {
sirorig[i]=' ';
sirorig[i-1]=' ';
sirorig[i-2]='!';
contor=0;
}
}
else {
contor=0;
}
}
word[0]='O';
word[1]='R';
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
++contor;
if (contor==2) {
sirorig[i]=' ';
sirorig[i-1]='|';
contor=0;
}
}
else {
contor=0;
}
}
word[0]='A';
word[1]='N';
word[2]='D';
contor=0;
FOR (i,0,dimsirorig-1) {
if (word[contor]==sirorig[i]) {
++contor;
if (contor==3) {
sirorig[i]=' ';
sirorig[i-1]=' ';
sirorig[i-2]='&';
contor=0;
}
}
else {
contor=0;
}
}
FOR (i,0,dimsirorig-1) {
if (sirorig[i]!=' ') {
sir[dimsir++]=sirorig[i];
}
}
}