前言
本项目利用MFC应用程序的基本知识,在Visual Studio2013环境下设计一个计算器应用程序。
1.前缀表达式、中缀表达式、后缀表达式
前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀表达式的运算符位于操作数之前,后缀表达式的运算符位于操作数之前。
例如:(以#为运算符)
前缀表达式:#AB
中缀表达式:A#B
后缀表达式:AB#
2.优先级实现方法
①建立两个栈,一个操作数栈,一个运算操作符栈,设立一表达式结束符。
②首先将结束符入栈,然后依次将表达式元素与操作符栈栈顶元素进行比较。当当前运算操作符优先级大于栈顶元素时,将运算符入栈,否则,操作符栈出栈,进行运算后将运算结果入栈操作数栈,重复进行优先级比较,直至运算表达式结束。
一、项目要求
计算器要求:
1)能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;
2)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
3)并保存历史的表达式运算记录。
二、设计步骤
1.图形界面
根据功能实现要求,界面如下:
2.变量、控件、对应的消息处理函数对应表
表格如下:
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;