课程作业六

课程作业六

题目描述

  • 本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
  • 学习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编程只是粗浅的了解,但是在今后的博客作业中,我会对界面进行美化。
  • 在对按钮函数进行编程时,发现没有主函数的存在。每个按钮都是一个独立的函数,通过互相的联系输出算式并显示结果,也体现了面向对象的思想。
原文地址:https://www.cnblogs.com/031602523liu/p/6923687.html