логическое — чтение выражения логических операторов для таблицы истинности Переполнение стека

Я пытаюсь написать код, который будет принимать выражение в формате, похожем на

(((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

Решение

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

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

0

Другие решения


По вопросам рекламы [email protected]