提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
实验目的
利用mfc类库实现可视化的计算器界面;并利用双栈法实现计算器的运算。
一、实现可视化界面
1.在vs中下载mfc模块
在vs中选择工具--获取工具--选择mfc模块并装载
2.创建mfc可视化窗口
在vs中选择创建新项目--mfc应用程序,即可得到一个基础的mfc对话框窗口
二、计算器的编写
1.按键的设置
首先对每个按键及其功能进行编写
在工具箱中可以选择并添加按键,如图所示:
添加按键之后,可以双击按键来自动生成该按键的操作代码
也可以选中按键之后改变按键的属性。
效果如下:
添加按键之后,可以在函数中对按键进行设置
其中,数字按键的设置和字符按键的设置实例代码如下:
void C计算器Dlg::OnBnClickedNum1()
{
calc.Showtext += change.changestring(1);
all += "1";
Showresult.SetWindowTextW(all);
if (calc.state == true) {
calc.Old = (calc.Old) * 10 + 1;
Result.SetWindowTextW(change.changestring(calc.Old));
}
if (calc.state == false) {
calc.New = (calc.New) * 10 + 1;
Result.SetWindowTextW(change.changestring(calc.New));
}
// TODO: 在此添加控件通知处理程序代码
}
void C计算器Dlg::OnBnClickedNum2()
{
all += "2";
Showresult.SetWindowTextW(all);
if (calc.state == true) {
calc.Old = (calc.Old) * 10 + 2;
Result.SetWindowTextW(change.changestring(calc.Old));
}
if (calc.state == false) {
calc.New = (calc.New) * 10 + 2;
Result.SetWindowTextW(change.changestring(calc.New));
}
// TODO: 在此添加控件通知处理程序代码
}
void C计算器Dlg::OnBnClickedAdd()
{
all += "+";
Showresult.SetWindowTextW(all);
if (calc.state == true)
{
sign = '+';
calc.Opnum.push(calc.Old);
calc.Opsign.push(sign);
calc.state = false;
}
else {
calc.top = sign;
sign = '+';
calc.Opnum.push(calc.New);
calc.Opsign.push(sign);
Result.SetWindowTextW(change.changestring(calc.enter(sign)));
}
// TODO: 在此添加控件通知处理程序代码
}
2.转换类
要想进行运算和显示,首先要将输入的字符串类型转换为double类型来进行计算,再将计算结果转换为字符串类型进行输出,此时就需要转换类,转换类的代码如下:
class Change {
public:
Change() {
}
//double转换到Cstring
CString changestring(double num) {
CString str;
str.Format(L"%.2f", num);
return str;
}
//string转换到double
double changedouble(string str) {
const char* s = str.c_str();
return atof(s);
}
};
3.计算类
接下来就是计算类的编写,需要使用两个栈,一个用来储存数字,一个用来储存计算符号
代码示例如下:
//加法
double add() {
state = false;
this->Old+=this->New;
this->New = 0;
return this->Old;
}
//减法
double minu() {
state = false;
this->Old -= this->New;
this->New = 0;
return this->Old;
}
//乘法
double mul() {
state = false;
this->Old *= this->New;
this->New = 0;
return this->Old;
}
//除法
double div() {
state = false;
this->Old /= this->New;
this->New = 0;
return this->Old;
}
//清空
void CA() {
this->Old = 0;
this->New = 0;
}
两个栈的定义以及运算符等级的设置:
#include<stack>
#include<unordered_map>
unordered_map<char, int>map = { {'(',0},{'+',1},{'-',1},{'*',2},{'/',2},{')',3} };
stack<double> Opnum;
stack<char> Opsign;
最终的实现界面: