2015-01-27 2 views
0

Я пытаюсь написать код, который будет принимать выражение, отформатированное похожи наЧтения логического выражения операторов для таблицы истинности C++

(((p∨q)∧((q→r)⊕(p∧r)))↔(r∧q))→(p∨r) 

и его нужно распечатать таблицу истинности для него, которая выглядит примерно так

p q r (p V q) (q→r) etc... until it gets to (((p∨q)∧((q→r)⊕(p∧r)))↔(r∧q))→(p∨r) 
t t t  t   t  
t t f  t   f 
t f t  t   t 
t f f  t   t 
f t t  t   t 
f t f  t   f 
f f t  f   t 
f f f  f   t 

я придумал способ борьбы с XOR и подразумевает оператор, но я понял, что он работает только тогда, когда операторы находятся внутри внутренних скобок, а не тогда, когда операторы между двумя наборами скобок ...

Я работаю над этим слишком много часов, может ли кто-нибудь дать мне представление о том, что я могу использовать вместо этого?

Теперь, когда я думаю об этом больше, могу ли я попытаться прочитать в первом(), затем втором() и так далее, как отдельные переменные, преобразовать их в логические точки, которые компьютер будет понимать, а затем ввести эти вернуться в правильный формат в правильном порядке?

Исходный код, я работаю прямо сейчас

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    bool p[8] = { true, true, true, true, false, false, false, false };   // Declare the init T/F values 
    bool q[8] = { true, true, false, false, true, true, false, false }; 
    bool r[8] = { true, false, true, false, true, false, true, false }; 

    std::string expression;          
    std::cout << "Enter expression (using^for AND, V for OR, X for XOR, and I for Implies (-->): \n"; 
    std::getline(std::cin, expression); 


    int i = 0; 
    int j = 0; 
    std::vector<std::string> exprVector; 
    for (std::string::iterator it = expression.begin; it != expression.end(); it++) 
    { 
     if (expression.at(i) == 'p') 
     { 
      exprVector[i] = "p[i]"; 
     } 
     else if (expression.at(i) == 'q') 
     { 
      exprVector[i] = "q[i]"; 
     } 
     else if (expression.at(i) == 'r') 
     { 
      exprVector[i] = "r[i]"; 
     } 

     else if (expression.at(i) == '(') 
     { 
      exprVector[i] = "("; 
     } 
     else if (expression.at(i) == ')') 
     { 
      exprVector[i] = ") "; 
     } 
     else if (expression.at(i) == '^') 
     { 
      exprVector[i] = "&&"; 
     } 
     else if (expression.at(i) == 'V') 
     { 
      exprVector[i] = "||"; 
     } 
     else if (expression.at(i) == 'X') 
     { 
      char temp1; 
      char temp2; 
      i--; 
      if (exprVector[i] == "p[i]")          // (p XOR q) 
      { 
       i++; 
       i++; 
       if (exprVector[i] == "q[i]") 
       { 

        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((p[i] || q[i]) && ((p[i] && q[i]) == false))"; 

       } 
       else if (exprVector[i] == "r")         // (p XOR r) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((p[i] || r[i]) && ((p[i] && r[i]) == false))"; 
       } 
      } 
      else if (exprVector[i] == "q")          // (q XOR p) 
      { 
       i++; 
       i++; 
       if (exprVector[i] == "p") 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((q[i] || p[i]) && ((q[i] && p[i]) == false))"; 

       } 
       else if (exprVector[i] == "r")         // (q XOR r) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((q[i] || r[i]) && ((q[i] && r[i]) == false))"; 
       } 
      } 
      else if (exprVector[i] == "r")          
      { 
       i++; 
       i++; 
       if (exprVector[i] == "p")          // (r XOR p) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((r[i] || p[i]) && ((r[i] && p[i]) == false)"; 
       } 
       if (exprVector[i] == "q")          // (r XOR q) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((r[i] || q[i]) && ((r[i] && q[i]) == false)"; 
       } 
      } 


     } 
     else if (expression.at(i) == 'I') 
     { 
      if (exprVector[i] == "p[i]")          // (p ---> q) 
      { 
       i++; 
       i++; 
       if (exprVector[i] == "q[i]") 
       { 

        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((p[i] == true) || (q[i] == false)"; 

       } 
       else if (exprVector[i] == "r")         // (p ---> r) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((p[i] == true) || (r[i] == false)"; 
       } 
      } 
      else if (exprVector[i] == "q")          // (q ---> p) 
      { 
       i++; 
       i++; 
       if (exprVector[i] == "p") 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((q[i] == true) || (p[i] == false))"; 

       } 
       else if (exprVector[i] == "r")         // (q ---> r) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((q[i] == true) || (r[i] == false))"; 
       } 
      } 
      else if (exprVector[i] == "r") 
      { 
       i++; 
       i++; 
       if (exprVector[i] == "p")          // (r ---> p) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((r[i] == true) || (p[i] == false))"; 
       } 
       if (exprVector[i] == "q")          // (r ---> q) 
       { 
        i--; 
        //clear vector[i] from exprVector 
        i--; 
        //clear vector[i] from exprVector 

        exprVector[i] = "((r[i] == true) || (q[i] == false))"; 
       } 

     } 
     else if (expression.at(i) == '!') 
     { 
      i++ 
      if (exprVector[i] == "p") 
      { 
       //clear vector[i] from exprVector 
       i--; 
       //clear vector[i] from exprVector 
       exprVector[i] == "(p[i] == false)" 
      } 
      if (exprVector[i] == "q") 
      { 
       //clear vector[i] from exprVector 
       i--; 
       //clear vector[i] from exprVector 
       exprVector[i] == "(p[i] == false)" 
      } 
      if (exprVector[i] == "r") 
      { 
       //clear vector[i] from exprVector 
       i--; 
       //clear vector[i] from exprVector 
       exprVector[i] == "(p[i] == false)" 
      } 

     } 
     else if (expression.at(i) == ' ') 
     { 
     } 

     i++; 
     j++; 

    } 

} 
+0

Вы считаете что-то вроде структуры данных, которая дает вам дерево, позволяя вам вызывать print/eval на каждом узле. Каждый узел является либо одной из ваших переменных, либо оператором с дочерними узлами. – Charlie

+0

Я хотел сделать это первым, но я не уверен, как иметь дело с круглыми скобками .. – Duncan

ответ

0

Рассматривали ли вы рекурсивный спуск парсер? http://en.wikipedia.org/wiki/Recursive_descent_parser

Возможно, какой-то другой вид синтаксического анализа. Затем вы можете сгенерировать дерево, которое представляет выражение, а затем вы можете оценить дерево для всех возможных входов.

+0

Будет ли это работать, если вы поместите ввод в любом порядке? или() (∨)) ↔ (∧)) → (∨) – Duncan

+0

Это общий подход к принятию любых выражений, так что они могут быть представлены и оценены программно. –

+0

Просто пытаюсь понять это лучше .. но он кажется немного сложным, когда мы не делали ничего подобного в моих pre-req C++-классах, а мой текущий класс - Discrete Math – Duncan

 Смежные вопросы

  • Нет связанных вопросов^_^