计算逻辑表达式的真值

摘要

【基本要求】

  • 程序运行有菜单选择。
  • 利用二叉树来计算公式的真值。首先利用堆栈将中缀形式的公式变为后缀
    形式;然后根据后缀形式,从叶结点开始构造相应的二叉树;最后按后序遍历该
    树,求各子树之值,即每到达一个结点,其子树之值已经计算出来,当到达根结
    点时,求得的值就是公式之真值。
  • 逻辑变元的标识符用单字母表示。
  • 打印公式的后序遍历序列。
  • 根据用户的要求,输入各变量的值,计算并显示表达式的真值。
    【扩展要求】
  • 设计多种不同形式的命题演算公式,对各个命题演算公式进行合法性检查。
  • 逻辑变元的标识符不限于单字母,而可以是任意长的字母数字串。
  • 打印创建的二叉树的结构。
  • 根据用户的要求显示公式的真值表。
  • 将命题演算公式中的逻辑运算符增加异或、蕴含、等价。
  • 实现程序的可视化界面。

因为可以使用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本来也被淘汰了。

猜你喜欢

转载自www.cnblogs.com/luanma-2333/p/12655965.html