采用文法思想用MFC实现简单的计算器程序

本文介绍了一个使用MFC编写的简单计算器程序。该程序通过借鉴编译原理中的文法概念实现了基本的数学运算,并展示了核心函数及按钮点击事件的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       用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编译器打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值