软件实习实验一计算器的开发(第一天)

本文记录了物联网一班的李林青在第一天实习中开发计算器的实验过程,使用C++和MFC,通过两个栈处理运算符和数字,实现包括括号在内的混合运算。经过检验,代码计算结果与标准计算器一致。
摘要由CSDN通过智能技术生成

(一)实验日志12.1

物联网一班-李林青-182210713120
源代码在Github:https://github.com/llq-007/-MFC-


目录

  • 实验任务

  • 工作安排

  • 具体实现

  • 总结


一、实验任务

(1) 能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;
(2)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
(3)并保存历史的表达式运算记录。


二、工作安排

  • 理解并写出实现计算机功能的核心代码
  • 学习MFC,构建计算器的框架
  • 将写好的代码移植到MFC中,使计算器能够正常运行
  • 查找BUG并进一步完善其功能

三、具体实现

(1)使用编辑器及语言

Visio Studio2019,C++

(2)核心思想

利用两个栈分别存放运算符和数字,当指针指到运算符时,先于存放运算符的栈中的运算符进行优先级比较,如果高于栈运算符就入栈否则就将运算符出栈同时将存放数字的栈出栈两次,再将数字和运算符进行算术运算,所得结果继续入栈直至结束。

(3)关键代码

1.对大于一位数的判断,当判断是数字或小数点时,将s[i]的字符加在string类型的keepnum上,在用for循环将后面的数字累加上去,最后一定要清空keepnum。

if (s[i] != '+' && s[i] != '-' && s[i] != '*' && s[i] != '/' && s[i] != '(' && s[i] != ')')
		{
			keepnum += s[i];
			//如果ch是最后一位了则直接入栈
			if (i == size - 1) {
				constantStack.push(double(std::stoi(keepnum)));//将常量压入常量栈
			}
			else {
				//判断下一个字符是不是数字,如果是继续扫描
				for(; s[i + 1] != '+' && s[i + 1] != '-' && s[i + 1] != '*' && s[i + 1] != '/' && s[i + 1] != '(' && s[i + 1] != ')'&&i+1<size;i++)
				{
					keepnum += s[i+1];
				}
				double d = atof(const_cast<const char*>(keepnum.c_str()));
				constantStack.push(d);
				keepnum = "";//这里一定要清空keepnum
			}
		}

2.左括号的优先级最高,直接入栈。

if (s[i] == '(')
		{
			operatorStack.push(s[i]);//左括号优先级最高直接压入运算符栈
			continue;
		}

3.右括号的优先级最低,用while循环进行遍历,将左括号之前的运算符出栈进行运算。

if (s[i] == ')')
		{
			while (operatorStack.top() != '(')
			{
				char s = operatorStack.top();
				operatorStack.pop();
				double a = constantStack.top();
				constantStack.pop();
				double b = constantStack.top();
				constantStack.pop();
				constantStack.push(figure(b, a, s));
			}
			operatorStack.pop();
		}
(3)结果检验

在程序中输入1.5-0.3*(8/3)
我的程序所得:
在这里插入图片描述
手机计算器所得结果:
在这里插入图片描述
进过大量数据检验,代码计算的结果与计算器所得一致。


三、总结

在理解利用堆栈来实现计算器功能后,后续的目标就明确了,总的来说今天是顺利完成任务。

  • 完成任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值