摘要
【基本要求】
- 程序运行有菜单选择。
- 利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀
形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该
树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结
点时,求得的值就是公式之真值。 - 逻辑变元的标识符用单字母表示。
- 打印公式的后序遍历序列。
- 根据用户的要求,输入各变量的值,计算并显示表达式的真值。
【扩展要求】 - 设计多种不同形式的命题演算公式,对各个命题演算公式进行合法性检查。
- 逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
- 打印创建的二叉树的结构。
- 根据用户的要求显示公式的真值表。
- 将命题演算公式中的逻辑运算符增加异或、蕴含、等价。
- 实现程序的可视化界面。
因为可以使用C++,且因为疫情闲得慌,于是打算尽量使用已知的C++特性来实现要求的所用功能,即《C++ primer》书的前十五章,结果是C with classes + STL。虽然不如人意,但知道大概是目前自己的极限了。此次考察之后可能一段时间内不会再使用C++11,因此作为记载。
可视化版本
可视化版本最终的成品还有很大的问题,集中在实现可视化根据用户的输入来得到表达式的真值的功能上,在获取用户的输入上,不能使用std::getline(std::cin,str)
,因为Qplaintext不能用输入输出流!最终用如下代码实现:
for (auto& i : solver.VariableSet)
{QString beforInput, value;
do
{
beforInput = text;
beforInput += QString::fromStdString(std::string("please input the logical value of " + i.first + ":\n"));
text= beforInput;
ui.plainTextEdit->setPlainText(text);
ui.plainTextEdit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
//休眠来创造能够输入数据的时间
QTime t;
t.start();
while(t.elapsed()<2000)
{
QCoreApplication::processEvents();
}
value = text[text.size() - 1];
} while (text.size()-beforInput.size()!=1||( value != one && value != zero));
i.second = value.toInt();
}
可以看出用休眠等待的方式给用户输入的时间,但实际上最好的效果是用户输入并且告知程序输入完毕,再进行while中的检测。
而且在这个过程中如果按重新输入键会导致
因为老师傻逼,所以没认真学MFC,而且工业界MFC本来也被淘汰了。