第六次作业

题目描述
本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
学习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 Kits\10\bin\10.0.15063.0\x86这个路径里面(目测电脑不同会有差别,不过win10的应该都是类似这种形式的)找到rcdll.dll文件,暴力复制到C:\Program Files (x86)\Windows Kits\10\bin\x86里面,就可以了。

>现在正在学界面中,一开始看的是这篇关于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好像需要用到一堆虚函数和类的继承,我其实还不太会用,呵呵。
posted @ 2017-05-31 13:38  溯説  阅读(187)  评论(0编辑  收藏  举报