(一)实验日志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)
我的程序所得:
手机计算器所得结果:
进过大量数据检验,代码计算的结果与计算器所得一致。
三、总结
在理解利用堆栈来实现计算器功能后,后续的目标就明确了,总的来说今天是顺利完成任务。
- 完成任务