Pagini recente » Cod sursa (job #1705809) | Cod sursa (job #3002283) | Cod sursa (job #692223) | Cod sursa (job #458257) | Cod sursa (job #2543616)
/// 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,
STOP = -1,
FALSE = 0,
TRUE = 1,
PARAN = 2,
NOT = 3,
AND = 4,
OR = 5,
VAR = 6;
bool variabila_set['Z' - 'A' + 1];
inline bool variabila_get(int tip) {return variabila_set[tip - VAR];}
int *elem;
int citeste_elem(char*& str) {
/**
TIP | VAL
----------
-1 | STOP
0 | FALSE
1 | TRUE
2 | PARAN
3 | NOT
4 | AND
5 | OR
----------
6 | A
7 | B
8 | C
.
.
.
29 | X
30 | Y
31 | Z
**/
if (*str == ')') {str += 1; return STOP; }
if (*str == 'F' && str[1] == 'A') {str += 5; return FALSE;}
if (*str == 'T' && str[1] == 'R') {str += 4; return TRUE; }
if (*str == '(') {str += 1; return PARAN;}
if (*str == 'N' && str[1] == 'O') {str += 3; return NOT; }
if (*str == 'A' && str[1] == 'N') {str += 3; return AND; }
if (*str == 'O' && str[1] == 'R') {str += 2; return OR; }
str += 1; return str[-1] - 'A' + VAR;
}
struct Expresie {
int 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 {
elemente[nr_elemente++] = citeste_elem(ptr);
}
}
elemente[nr_elemente++] = STOP;
}
void arata_cod() {
for (int i = 0; i < nr_elemente; i++) {
out << elemente[i] << ' ';
}
}
bool eval();
bool grad_0_PARAN_TRUE_FALSE_VAR() {
out << "grad_0_PARAN_TRUE_FALSE_VAR()" << endl;
if (*elem < PARAN) { /// TRUE FALSE
out << " rt = " << *elem << endl;
return *(elem++);
}
if (*elem == PARAN) { /// PARANTEZA
elem++;
bool rt = eval();
out << " rt = " << rt << endl;
elem++;
return rt;
}
out << " rt = " << variabila_get(*elem) << endl;
return variabila_get(*(elem++)); /// VAR
}
bool grad_1_NOT() {
out << "grad_1_NOT()" << endl;
if (*elem == NOT) {
elem++;
out << " NOT ";
return !grad_0_PARAN_TRUE_FALSE_VAR();
}
bool rt = grad_0_PARAN_TRUE_FALSE_VAR();
out << " rt = " << rt << endl;
return rt;
}
bool grad_2_AND() {
out << "grad_1_AND()" << endl;
bool rt = grad_1_NOT();
while (*elem == AND) {
out << " AND ";
rt &= grad_1_NOT(); // acceptat conform standardului c++ pentru bool
}
out << " (AND)rt = " << rt << endl;
return rt;
}
bool grad_3_OR() {
out << "grad_1_OR()" << endl;
bool rt = grad_2_AND();
while (*elem == OR) {
out << " OR ";
rt |= grad_2_AND(); // acceptat conform standardului c++ pentru bool
}
out << " (OR)rt = " << rt << endl;
return rt;
}
} expr;
bool Expresie::eval() {elem = Expresie::elemente; return grad_3_OR();}
int main() {
expr.citeste();
out << expr.eval();
}
//