Cod sursa(job #2543616)

Utilizator KPP17Popescu Paul KPP17 Data 11 februarie 2020 12:45:18
Problema Bool Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.95 kb
/// 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();

}









//