zoukankan      html  css  js  c++  java
  • 第六次作业

    题目描述
    本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
    学习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好像需要用到一堆虚函数和类的继承,我其实还不太会用,呵呵。
  • 相关阅读:
    backup-rsync主机配置
    msyqldump备份
    会话固定攻击(session fixation attack)
    正确理解 Session 的安全性
    Yii自定义辅助函数
    php缓冲机制及嵌套级别 ob_get_level
    method_exists 与 is_called
    给类动态添加新方法
    PHP Closure(闭包)类详解
    PHP Closure(闭包)类详解
  • 原文地址:https://www.cnblogs.com/s0316026/p/6923596.html
Copyright © 2011-2022 走看看