基于mfc实现可以进行优先级运算的计算器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


实验目的

        利用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;

最终的实现界面:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值