Pagini recente » Cod sursa (job #193034) | Cod sursa (job #142761) | Cod sursa (job #2682283) | Cod sursa (job #2600650) | Cod sursa (job #2791285)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
using namespace std;
//ifstream in("bool.in");
//ofstream out("bool.out");
const int MAXS = 1000;
const int MAXC = 26;
bool caract[MAXC];
char e[MAXS];
int size_e;
char s[MAXS];
int size_s;
//-//-//-//-//- Construire ecuatie -//-//-//-//-
void construct_e(){
bool ok = 1;
size_e = 0;
size_s = 0;
while( s[size_s] != '\n' ){
ok = 1;
//cout<<"size: "<<size_s<<" "<<s[size_s]<<" "<<s[size_s + 1]<<" "<<s[size_s + 2];
//TRUE
if(ok == 1 && s[size_s] == 'T' && s[size_s + 1] == 'R' && s[size_s + 2] == 'U' && s[size_s + 3] == 'E' ){
e[size_e] = '1';
size_e++;
size_s += 3;
ok = 0;
}
//FALSE
if(ok == 1 && s[size_s] == 'F' && s[size_s + 1] == 'A' && s[size_s + 2] == 'L' && s[size_s + 3] == 'S' && s[size_s + 4] == 'E' ){
e[size_e] = '0';
size_e++;
size_s += 4;
ok = 0;
}
//AND
if(ok == 1 && s[size_s] == 'A' && s[size_s + 1] == 'N' && s[size_s + 2] == 'D' ){
e[size_e] = '&';
size_e++;
size_s += 2;
ok = 0;
}
//OR
if(ok == 1 && s[size_s] == 'O' && s[size_s + 1] == 'R' ){
e[size_e] = '|';
size_e++;
size_s += 1;
ok = 0;
}
//NOT
if(ok == 1 && s[size_s] == 'N' && s[size_s + 1] == 'O' && s[size_s + 2] == 'T' ){
e[size_e] = '!';
size_e++;
size_s += 2;
ok = 0;
}
//CARACT
if( ok == 1 && s[size_s] >= 'A' && s[size_s] <= 'Z' ){
e[size_e] = s[size_s];
caract[s[size_s] - 'A'] = 0;
size_e++;
ok = 0;
}
//PARANT
if(ok == 1 && ( s[size_s] == '(' || s[size_s] == ')' ) ){
e[size_e] = s[size_s];
size_e++;
ok = 0;
}
//cout<<" "<<e[size_e - 1]<<'\n';
size_s++;
}
}
//-//-//-//-//- Rezolvare ecuatie -//-//-//-//-
bool myOr();
bool fact(){
bool number;
//cout<<e[size_e]<<'\n';
if( e[size_e] == '!' ){
size_e++;
if( e[size_e] == '(' ){
size_e++;
number = !myOr();
size_e++;
}
else{
if( e[size_e] >= 'A' && e[size_e] <= 'Z' ){
number = !caract[e[size_e] - 'A'];
}
else
number = !( e[size_e] - '0' );
size_e++;
}
}
else{
if( e[size_e] == '(' ){
size_e++;
number = myOr();
size_e++;
}
else{
if( e[size_e] >= 'A' && e[size_e] <= 'Z' ){
number = caract[e[size_e] - 'A'];
}
else
number = e[size_e] - '0';
size_e++;
}
}
//cout<<"fact: "<<number<<'\n';
return number;
}
bool myAnd(){
bool rezultat;
rezultat = fact();
while( e[size_e] == '&' ){
size_e++;
rezultat = rezultat & fact();
}
//cout<<"and: "<<rezultat<<'\n';
return rezultat;
}
bool myOr(){
bool rezultat;
rezultat = myAnd();
while( e[size_e] == '|' ){
size_e++;
rezultat = rezultat | myAnd();
}
//cout<<"ori: "<<rezultat<<'\n';
return rezultat;
}
//-//-//-//-//- Int main -//-//-//-//-
int main(){
FILE *fin, *fout;
fin = fopen("bool.in", "r");
fout = fopen("bool.out", "w");
fgets(s, MAXS, fin);
//fputs(s, fout);
construct_e();
//fputs(e, fout);
char c;
int n, i;
size_e = 0;
fscanf(fin,"%d ", &n );
for( i = 0; i < n; i++ ){
c = fgetc(fin);
//fputc(c, fout);
caract[c - 'A'] = caract[c - 'A'] ^ 1;
//fprintf(fout, "%d \n", caract[c - 'A']);
fprintf(fout, "%d", myOr());
size_e = 0;
}
//out<<s;
return 0;
}