计算器的设计与实现


前言

本项目利用MFC应用程序的基本知识,在Visual Studio2013环境下设计一个计算器应用程序。

1.前缀表达式、中缀表达式、后缀表达式

前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀表达式的运算符位于操作数之前,后缀表达式的运算符位于操作数之前。
例如:(以#为运算符)
前缀表达式:#AB
中缀表达式:A#B
后缀表达式:AB#

2.优先级实现方法

①建立两个栈,一个操作数栈,一个运算操作符栈,设立一表达式结束符。
②首先将结束符入栈,然后依次将表达式元素与操作符栈栈顶元素进行比较。当当前运算操作符优先级大于栈顶元素时,将运算符入栈,否则,操作符栈出栈,进行运算后将运算结果入栈操作数栈,重复进行优先级比较,直至运算表达式结束。


一、项目要求

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

二、设计步骤

1.图形界面

根据功能实现要求,界面如下:
在这里插入图片描述

2.变量、控件、对应的消息处理函数对应表

表格如下:
该处使用的url网络请求的数据。

3.关键函数代码

3.1构造函数
代码如下:

void CMFCApplication1Dlg::Calculator()
{
	
	UpdateData(TRUE);
	tempStr = str0;
	a = "#";
	tempStr.Append(a);
	std::string str=CT2A(tempStr.GetBuffer(0));
	//Caculate c("1+1#");
	Caculate c(str);
	double m = c.caculate();
	//cout << m << endl;
	//str0.Format(_T("%.4f"), m);
	if (m - int(m) <= 1e-5)
	{
		str0.Format(L"%d", (int)m);
	}
	else
	{
		str0.Format(L"%f", m);
	}
	tempStr= tempStr.Left(tempStr.GetLength() - 1);
	tempStr += L"=";
	tempStr += str0;
	str13 = str12;
	str12 = str11;
	str11 = str10;
	str10 = str9;
	str9 = str8;
	str8 = str7;
	str7 = str6;
	str6 = str5;
	str5 = str4;
	str4 = str3;
	str3 = str2;
	str2 = str1;
	str1 = tempStr;
	UpdateData(FALSE);
}

3.2算术运算控件对应函数
以加法为例,代码如下:

void CMFCApplication1Dlg::OnBnClickedButtonjia()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	str0 += L"+";
	UpdateData(FALSE);
}

其他算术运算同理可得。
3.3运算方法
将运算方法封装在一头文件中,在cpp源文件中将控件输入的表达式从CString转为String,调用头文件中运算函数,最后得到结果为数值,再转为CString类型,将内容传至控件中对应文本位置。(以#为结束符)

    a = "#";
	tempStr.Append(a);
	std::string str=CT2A(tempStr.GetBuffer(0));
	//Caculate c("1+1#");
	Caculate c(str);
	double m = c.caculate();
	//cout << m << endl;
	//str0.Format(_T("%.4f"), m);
	if (m - int(m) <= 1e-5)
	{
		str0.Format(L"%d", (int)m);
	}
	else
	{
		str0.Format(L"%f", m);
	}
	tempStr= tempStr.Left(tempStr.GetLength() - 1);
	tempStr += L"=";
	tempStr += str0;

三、程序运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值