Pagini recente » Statistici Ionescu Maria-Dorina (Ionescu_Maria) | Cod sursa (job #1178082) | Monitorul de evaluare | Cod sursa (job #3041331) | Cod sursa (job #2843587)
//
// main.cpp
// Bool (infoarena)
//
// Created by Andrei Bădulescu on 02.02.22.
//
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
char s[1005], aux[1001], randomvar[1005];
int p = 0, paux = 0;
bool var[30], result;
void replacement() {
while (s[p] != '\0') {
if (s[p] == 'A' && s[p + 1] == 'N') {
aux[paux] = '&';
s[p + 1] = ' ';
s[p + 2] = ' ';
paux++;
p += 2;
} else if (s[p] == 'O' && s[p + 1] == 'R') {
aux[paux] = '|';
s[p + 1] = ' ';
paux++;
p++;
} else if (s[p] == 'N' && s[p + 1] == 'O') {
aux[paux] = '!';
s[p + 1] = ' ';
s[p + 2] = ' ';
paux++;
p += 2;
} else if ((s[p] == 'T' && s[p + 1] == 'R') || (s[p] == 'F' && s[p + 1] == 'A')) {
if (s[p] == 'T') {
aux[paux] = '1';
s[p + 1] = ' ';
s[p + 2] = ' ';
s[p + 3] = ' ';
paux++;
p += 3;
} else {
aux[paux] = '0';
s[p + 1] = ' ';
s[p + 2] = ' ';
s[p + 3] = ' ';
s[p + 4] = ' ';
paux++;
p += 4;
}
} else if (isupper(s[p])) {
aux[paux] = s[p];
paux++;
} else if (s[p] == ')' || s[p] == '(') {
aux[paux] = s[p];
paux++;
}
p++;
}
}
int expresie();
int termen();
int factor();
int expresie() {
int first = termen();
while (s[p] == '&') {
p++;
int temp = termen();
if (first > 0) {
result = var[first];
} else if (first == 0) {
result = false;
} else if (first == -1) {
result = true;
}
if (temp > 0) {
result = result && var[temp];
} else if (temp == 0) {
result = false;
} else if (temp == -1) {
result = result && true;
}
if (first > 0 || temp > 0) {
out << result;
}
if (temp > 0) {
first = temp;
var[first] = result;
}
}
if (first > 0)
return first;
if (result)
return -1;
return 0;
}
int termen() {
int first = factor();
while(s[p] == '|') {
p++;
int temp = termen();
if (first > 0) {
result = var[first];
} else if (first == 0) {
result = false;
} else if (first == -1) {
result = true;
}
if (temp > 0) {
result = result || var[temp];
} else if (temp == 0) {
result = result || false;
} else if (temp == -1) {
result = true;
}
if (first > 0 || temp > 0) {
out << result;
}
if (temp > 0) {
first = temp;
var[first] = result;
}
}
if (first > 0)
return first;
if (result)
return -1;
return 0;
}
int factor() {
int sign = 1, val;
while(s[p] == '!') {
sign *= -1;
p++;
}
if (s[p] == '(') {
p++;
val = expresie();
p++;
if (val > 0) {
if (sign == -1) {
var[val] = !var[val];
}
return val;
} else if (val == 0) {
if (sign == -1) {
return -1;
}
return 0;
} else if (val == -1) {
if (sign == -1) {
return 0;
}
return -1;
}
}
if ('A' <= s[p] && s[p] <= 'Z') {
val = s[p] - 'A' + 1;
p++;
if (sign == - 1) {
var[val] = !var[val];
out << var[val];
}
return val;
}
if (s[p] == '1') {
if (sign == -1) {
return 0;
}
return -1;
}
if (sign == -1) {
return -1;
}
return 0;
}
int main() {
in.getline(s, 1001);
int n;
in >> n;
in.getline(randomvar, 1000);
replacement();
strcpy(s, aux);
p = 0;
expresie();
return 0;
}