Pagini recente » Cod sursa (job #1707446) | Cod sursa (job #2468935) | Cod sursa (job #1996012) | Cod sursa (job #1825657) | Cod sursa (job #1573425)
#include <iostream>
#include <fstream>
#define MAX_N 1000
using namespace std;
char sir[MAX_N + 1];
bool valoare[26];
short int n;
int cntr = 0, poz;
int expresie();
int termen();
int factor();
int trans();
void push(int, char, int);
int expresie() {
int rasp = termen();
while (sir[poz] == '|') {
poz++;
rasp |= termen();
}
return rasp;
}
int termen() {
int rasp = factor();
while (sir[poz] == '&') {
poz++;
rasp &= factor();
}
return rasp;
}
int factor() {
int rasp = 0;
if (sir[poz] >= 'A' && sir[poz] <= 'Z') {
return valoare[sir[poz++] - 'A'];
} else if (sir[poz] == '0') {
poz++;
return 0;
} else if (sir[poz] == '1') {
poz++;
return 1;
} else if (sir[poz] == '(') {
poz++;
return expresie();
poz++;
} else if (sir[poz] == '!') {
poz++;
return !factor();
}
}
void push (int *i, char c, int lungime) {
sir[cntr++] = c;
(*i) += lungime;
}
int trans() {
for (int i = 0; sir[i] != '\0'; i++) {
if (sir[i] == 'A') { // AND
if(sir[i + 1] == 'N') {
push(&i, '&', 2);
} else {
push(&i, 'A', 0);
}
} else if (sir[i] == 'O') { // OR
if(sir[i + 1] == 'R') {
push(&i, '|', 1);
} else {
push(&i, 'O', 0);
}
} else if (sir[i] == 'N') { // NOT
if (sir[i + 1] == 'O') {
push(&i, '!', 2);
} else {
push(&i, 'N', 0);
}
} else if (sir[i] == 'T') { // TRUE
if (sir[i + 1] == 'R') {
push(&i, '1', 3);
} else {
push(&i, 'T', 0);
}
} else if (sir[i] == 'F') { // FALSE
if (sir[i + 1] == 'A') {
push(&i, '0', 4);
} else {
push(&i, 'F', 0);
}
} else if (sir[i] != ' ') {
push(&i, sir[i], 0);
}
}
sir[cntr] = '\0';
}
int main()
{
ifstream file_in ("bool.in");
ofstream file_out ("bool.out");
int rasp, temp;
char c;
/// Citirea datelor
file_in.getline(sir, 1002);
file_in >> n;
/// Calcularea solutiei + Afisarea solutiei
// Transformarea sirului
trans();
//cout << sir;
for (int i = 0; i < n; i++) {
file_in >> c;
valoare[c - 'A'] = !valoare[c - 'A'];
poz = 0;
file_out << expresie();
}
return 0;
}