课程作业六
题目描述
- 本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
- 学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。
作业要求
- 本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。
- 发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的截图,对界面编程的探索。
对于前几点要求,我在设计计算器的时候就用栈进行了实现。下面是我的思路和代码链接。
- 出题的思路
先由最基本的两个数运算开始,设定两个string变量number1,number2来存储随机数,一个string变量operator来存储随机运算符。由随机生成函数随机生成两个数字和一个随机运算符,比如生成了“a”,“b”和“+”。那么就组合成了“a+b”,在进行随机判断是否添加括号。如果判断为true那么算式就变成了“(a+b)”。把这个新生成的算式赋值给number1.在如此循环,用number1和新的number2,operator结合。获得新的算式之后赋值给number1。如此下去将最后的number1+‘=’,就得到了随机题目。
- 计算的思路
用3个变量,分别记录操作数1,操作数2和运算符。一个循环从左向右读取字符。当读到第一个操作符时,意味着操作数1已经读取完毕,记录下读到的这个操作符,设置往后读的是操作数2的内容。当读到第二个操作符时,意味着操作数2已经读取完毕,这时满足了之前运算符的计算条件:已经有了操作数1,运算符,操作符2。进行计算,并且把计算的结果赋予操作数1变量。从此后,操作数1变量就永远只是存放计算结果了,只有操作数2是从表达式中读取的,不断循环反复,最终计算出表达式的值。
- 先定义运算符比较优先级:
- 加减比较时,左边的运算符优先级高。
- 乘除比较时,左边的运算符优先级高。
- 乘除优先级高于加减。
- “(“左括号的优先级高于乘除,是最高优先级的运算符。
- “)”右括号的优先级低于加减,是最低优先级的运算符。
- “(”和“)”优先级相等。相等的含义是,括号被消除。
代码实现
程序实现截图
C++界面编程
因为QT没有发布QTforVS2017,所以我选择了MFC界面编程,
看了博客教学之后对四则运算器添加一个能看得过去的界面。
贴上代码
void CMFCApplication1Dlg::OnBnClickedButton1()
{
srand(time(0));
UpdateData();
for (int i = 0; i < 50; i++)
{
pr[i] = ' ';
}
msuanshi = " ";
creatmachine cr;
problem = cr.generateExpression();
for (int i = 0; i < problem.length(); i++)
{
pr[i] = problem[i];
}
msuanshi += pr;
UpdateData(FALSE);
}
void CMFCApplication1Dlg::OnBnClickedButton2()
{
UpdateData();
calculator cr;
mresult = cr.calculateResult(problem);
if (manswer == mresult)
{
cright++;
}
else
{
cwrong++;
}
UpdateData(FALSE);
}
遇到的问题
- 创建MFC项目的时候找不到MFC选项。
原因是VS2017没有安装与MFC相关的组件。
- 创建mfc应用程序的时候,出现 “无法找到资源编译器dll,请确保路径正确”。
- 最最最最最需要注意的就是要在你的头文件中加上
#include“stdafx.h”
而且必须要加在第一个!!!否则会报错。
本次作业心得
- 通过两张程序实现图的对比,就可以看出来,有了界面的程序,更加直观和方便使用(终于能写出一个能给别人用的程序了)虽然学习了很久,但是能写出这个四则运算器还是很开心。
- 同时也要感谢周政演同学的帮助!在学习终于到问题,一点点的解决,不懂的和同学一起讨论,享受解决问题的快乐。
- 虽然对MFC编程只是粗浅的了解,但是在今后的博客作业中,我会对界面进行美化。
- 在对按钮函数进行编程时,发现没有主函数的存在。每个按钮都是一个独立的函数,通过互相的联系输出算式并显示结果,也体现了面向对象的思想。