Pagini recente » Cod sursa (job #305544) | Cod sursa (job #127728) | Cod sursa (job #951617) | Cod sursa (job #828714) | Cod sursa (job #2543314)
/// W.I.P /// W.I.P /// W.I.P /// W.I.P /// W.I.P ///
/// W.I.P /// W.I.P /// W.I.P /// W.I.P ///
/// W.I.P /// W.I.P /// W.I.P ///
/// W.I.P /// W.I.P ///
/// WORK IN PROGRESS /// /// W.I.P ///
using namespace std;
#ifdef fisier
#include <fstream>
ifstream in(fisier ".in");
ofstream out(fisier ".out");
#else
#include <iostream>
#define in cin
#define out cout
#endif
const int
MAX_CHAR = 1000,
MAX_ELEMENT = MAX_CHAR + 1,
TRUE = 0,
FALSE = 1,
PARAN_0 = 2,
PARAN_1 = 3,
NOT = 4,
AND = 5,
OR = 6;
bool val_variabila_set['Z' - 'A' + 1];
inline bool val_variabila_get(int tip) {return val_variabila_set[tip - 7];}
struct Element {
int tip;
char* citeste(char* str) {
/**
TIP | VAL
----------
0 | TRUE
1 | FALSE
2 | (
3 | )
4 | NOT
5 | AND
6 | OR
----------
7 | A
8 | B
9 | C
.
.
.
34 | Z
**/
if (*str == 'T' && str[1] == 'R') {tip = 0; return str + 4;}
if (*str == 'F' && str[1] == 'A') {tip = 1; return str + 4;}
if (*str == '(') {tip = 2; return str + 1;}
if (*str == ')') {tip = 3; return str + 1;}
if (*str == 'N' && str[1] == 'O') {tip = 4; return str + 3;}
if (*str == 'A' && str[1] == 'N') {tip = 5; return str + 3;}
if (*str == 'O' && str[1] == 'R') {tip = 6; return str + 2;}
tip = *str - 'A' + 7; return str + 1;
}
} *elem;
struct Expresie {
Element elemente[MAX_ELEMENT];
int nr_elemente;
void citeste() {
char str[MAX_CHAR];
in.getline(str, MAX_CHAR);
for (char* ptr = str; *ptr;) {
if (*ptr == ' ') {
ptr++;
} else {
ptr = elemente[nr_elemente++].citeste(ptr);
}
}
elemente[nr_elemente++].tip = -1; /// -1 | STOP
// element secret
}
void arata_cod() {
for (int i = 0; i < nr_elemente; i++) {
out << elemente[i].tip << ' ';
}
}
bool eval();
bool grad_0_PARAN_TRUE_FALSE_VAR() {
out << (elem++)->tip << endl;
arata_cod(); out << endl;
if (elem->tip < PARAN_0) { /// TRUE FALSE
return !(elem++->tip);
}
if (elem->tip == PARAN_0) { /// PARANTEZA
elem++;
bool rt = eval();
elem++;
return rt;
}
return val_variabila_get(elem++->tip); /// VAR
}
bool grad_1_NOT() {
out << "grad_1_NOT()" << endl;
if (elem->tip == NOT) {
elem++;
out << " NOT ";
return !grad_0_PARAN_TRUE_FALSE_VAR();
}
bool rt = grad_0_PARAN_TRUE_FALSE_VAR();
out << "rt = " << rt;
return rt;
}
bool grad_2_AND() {
out << "grad_1_AND()" << endl;
bool rt = grad_1_NOT();
while (elem->tip == AND) {
out << " AND ";
rt &= grad_1_NOT(); // acceptat conform standardului c++ pentru bool
}
return rt;
}
bool grad_3_OR() {
out << "grad_1_OR()" << endl;
bool rt = grad_2_AND();
while (elem->tip == OR) {
out << " OR ";
rt |= grad_2_AND(); // acceptat conform standardului c++ pentru bool
}
return rt;
}
} expr;
bool Expresie::eval() {return grad_3_OR();}
int main() {
expr.citeste();
char chr;
int n; in >> n;
expr.arata_cod(); out << endl;
while (n--) {
in >> chr;
val_variabila_set[chr] = !val_variabila_set[chr];
elem = expr.elemente;
out << expr.eval();
}
}
//