题目描述
本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。
作业要求
本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。
发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的截图,对界面编程的探索。
关于栈的算法实现,上一次作业已经完成,在这里贴上代码,结合上一次作业,2017《面向对象程序设计》课程作业五 我想应该能看懂。各个部分分工还算清晰吧,compare()就是根据各运算符的优先级来返回值,值越大的优先级越高。calculatResult()是四则运算这件事的栈的具体实现,原理就是上次作业的栈图。因为我是对“a+b+c+d=”类似这样的string进行处理,所以就采用处理字符的方式。
GitHub链接
int Equation::compare(char x)
{
switch (x)
{
case '*':
case '/': return 3;
case '-':
case '+': return 2;
case '(': return 1;
case ')': return -2;
default:return -1;
}
}
void Equation::calculatResult()
{
double num_ = 0;
for(unsigned int i = 0; i < S.size(); i++)
{
if (S[i] >= '0'&&S[i] <= '9')
{
num_ = num_ * 10 + S[i] - '0';
if (i == S.size() - 1)
numstack.push(num_);
}
else
{
if (num_)
{
numstack.push(num_);
num_ = 0;
}
if (opstack.empty())
opstack.push(S[i]);
else if (S[i] == '(')
opstack.push(S[i]);
else if (S[i] == ')')
{
while (opstack.top() != '(')
calculate();
opstack.pop();
}
else if (compare(S[i]) > compare(opstack.top())) //比较优先级函数
opstack.push(S[i]);
else if (compare(S[i]) <= compare(opstack.top()))
{
calculate(); //运算函数
opstack.push(S[i]);
}
else if (S[i] == '=')
break;
}
}
while (!opstack.top())
calculate();
double result = numstack.top();
if ((result - (int)result) >= 0.5)
result = result + 1;
Result = result;
all_f.set_2(argv, result); //到时候要传参给它
all_f.writeFile_2();//把正确答案写入文件
}
void Equation::calculate()
{
char p = opstack.top();
double a, b, result;
b = numstack.top();
numstack.pop();
a = numstack.top();
numstack.pop();
switch (p)
{
case '+':result = a + b; break;
case '-':result = a - b; break;
case '*':result = a*b; break;
case '/':result = a / b; break;
default: break;
}
numstack.push(result);
opstack.pop();
}```
结果:
![](http://images2015.cnblogs.com/blog/1092215/201705/1092215-20170531180612696-1150198137.png)
>至于界面编程,我还没有头绪,我的VS2017的MFC貌似打不开,我还得再捣鼓捣鼓,只好在下次正式布置作业的时候再在我的代码上实现。
注:我现在解决了这个问题,就是去C:Program Files (x86)Windows Kits10in10.0.15063.0x86这个路径里面(目测电脑不同会有差别,不过win10的应该都是类似这种形式的)找到rcdll.dll文件,暴力复制到C:Program Files (x86)Windows Kits10inx86里面,就可以了。
>现在正在学界面中,一开始看的是这篇关于VC++的[C++“窗口”程序设计启蒙 ](http://blog.csdn.net/sxhelijian/article/details/7555812),后来发现有VS2015的[C++“窗口”程序设计启蒙(之二) ](http://blog.csdn.net/sxhelijian/article/details/7558896),和VS2017差不了多少,就是那个“工具箱”2017是在左边的框上,我找了老半天。文章讲得很好,依葫芦画样大致可以做出点什么。基本编程思想就是C++的面向对象,用控件的类实现代替主函数的运行,我写了一个简单的加法,不过不小心删了,现在我直接去改我的代码好了。不过一篇博客里的内容还是不够的,他只给出了最基本的操作,还是要去借几本书回来研究才行。
我又来更新了,目前简单实现了算式生成,结果验证。框图是这样的:
![](http://images2015.cnblogs.com/blog/1092215/201706/1092215-20170602083301118-752815311.png)
在代码上,其实改动不多,几乎就是把Equation类和Random类照搬过来而已,然后去掉了文件读写那部分。button的代码:
![](http://images2015.cnblogs.com/blog/1092215/201706/1092215-20170602083525477-1161141120.png)
实现情况:
![](http://images2015.cnblogs.com/blog/1092215/201706/1092215-20170602083548055-240842763.png)
其实我只是设了一个全局的Equation对象,目前我还不知道不设全局对象就把button1的消息传送给button2要怎么实现。虽然MFC是C++风格的,但是很多名称都挺陌生的,系统学习单词的记忆量不亚于再学一门语言。MFC好像需要用到一堆虚函数和类的继承,我其实还不太会用,呵呵。