用MFC实现简单的计算器程序。在大二上学期之前,学过的编程语言都还是像C、C++运行起来都是DOC命令框,当时更多的想法是把写出的程序能像我们在PC机上运行的桌面应用程序,有华丽的界面。恰好,在大二上学期有位刘老师(至今都非常感谢这位老师,授课非常认真负责)开设了MFC的公共选修课,就去蹭这门课程,学习了一段时间的MFC程序设计。
本程序就是在学习了几节课之后,有了一些想法完成的。程序界面并算不上多么的华丽、美观,程序代码也算不上多么的复杂和优美。但是,作为笔者完成的第一个带界面的程序有非常重要的纪念意义。这是想把此程序贴出来的最重要的动机。另外,本程序在完成数值计算的过程中,借鉴了文法概念的(编译原理中的文法概念,当时并不知道是编译原理中的,只是在学习C++语言时,看过一点文法的知识)思想,也是本程序比较独特的一方面。
程序运行结果如下图所示:
数值计算的核心函数代码如下图所示:
double First(Data a[])
{
i=0;
double left=a[i].volue;
while(a[i].ch!=' ')
{
switch(a[i].ch)
{
case'+':left+=term(a);
break;
case'-':left-=term(a);
break;
case'*':
if((a[i+1].volue==0)&&(a[i+1].ch=='-'))
{
left*=(a[i+1].volue-a[i+2].volue);
i=i+2;
break;
}
else
{
left*=a[++i].volue;
break;
}
case'/':
if((a[i+1].volue==0)&&(a[i+1].ch=='-'))
{
left/=(a[i+1].volue-a[i+2].volue);
i=i+2;
break;
}
else
{
left/=a[++i].volue;
break;
}
default:return left;
}
}
return left;
}
double term(Data a[])
{
double left=a[++i].volue;
while(a[i].ch=='*'||a[i].ch=='/')
{
switch(a[i].ch)
{
case'*':if((a[i+1].volue==0)&&(a[i+1].ch=='-'))
{
left*=(a[i+1].volue-a[i+2].volue);
i=i+2;
break;
}
else
{
left*=a[++i].volue;
break;
}
case'/':if((a[i+1].volue==0)&&(a[i+1].ch=='-'))
{
left/=(a[i+1].volue-a[i+2].volue);
i=i+2;
break;
}
else
{
left/=a[++i].volue;
break;
}
}
}
return left;
}
Data类型我们看做{char A;double volue}的结构体。文法的思路就是体现在这两个函数当中。
按键1的点击事件代码:
void CCalculatorDlg::OnButton11()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_BUTTON11, str);
strCtrl=strCtrl+str;
SetDlgItemText(IDC_EDIT1,strCtrl);
str="";
}
按键+的点击事件代码:
void CCalculatorDlg::OnAdd()
{
// TODO: Add your control notification handler code here
num1=atof(strCtrl);
++i;
a[i].ch='+';
a[i].volue=num1;
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
pedt->SetWindowText("");
strCtrl="";
strCtr2='+';
}
按键退格的点击事件代码:
void CCalculatorDlg::OnBackspace()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
strCtrl = strCtrl.Left(strCtrl.GetLength()-1);
SetDlgItemText(IDC_EDIT1,strCtrl);
}
按键清除的点击事件代码:
void CCalculatorDlg::OnClear()
{
// TODO: Add your control notification handler code here
CEdit* pedt = (CEdit*)GetDlgItem(IDC_EDIT1);
pedt->SetWindowText("");
strCtrl="";
}
按键=的点击事件代码:
void CCalculatorDlg::OnEqual()
{
// TODO: Add your control notification handler code here
num2=atof(strCtrl);
++i;
a[i].ch=' ';
a[i].volue=num2;
num3=First(a);
strCtr3.Format("%0.2f",num3);
SetDlgItemText(IDC_EDIT1,strCtr3);
strCtrl="";
strCtr2=' ';
strCtr3="";
i=-1;
num3=0;
}
本工程的源码下载地址:https://github.com/XiaoYaoNet/Calculator
由于本工程年代有点远,所以,本工程最好使用VC6.0编译器打开。