基于MFC编程的计算器

来源:互联网 发布:滴定分析实验数据 编辑:程序博客网 时间:2024/05/21 22:56

欢迎大家和我交流,有什么不懂的,留言即可,想要计算器的,也可以通过留言告诉我。

2.1MFC计算器操作与功能

  本计算器操作简单,且完全是自己编制出来的,直接点击即可输入相应数字,然后选择相应运算即可求出相应结果。对于功能,本计算器可以实现连续运算,无论数的多少,而且只分先后,不分优先级。第二个功能是可以输入括号,这是帮助实现优先级的。第三个功能是能够输入小数,进行小数的运算。还有就是可以输入0,这也许不值一提,但却非常必要,因为在小数点后面0的输入很是困难的。其余的功能是一些单运算,比如求平方,立方,倒数,开平方根,求sinX,cosX,tanX的值,还有求负(由于无法输入负号,故加入求负运算),eX,lnX运算。

2.2模块介绍及详细说明

 首先介绍第一部分,即数字部分,这是最基本也最重要的,对于1,2,3,4,5,6,7,8,9程序基本是相同的,因此只要介绍其中一个即可。在介绍数字模块前,需要对全局变量做下解释。

double m_A,m_B;

double sz[50];

int i=0,j=0;

double m_C=0,x=0;

int k=0,n=0;

int ysf[50];

运算本质上只需两个数,因此m_A为第一个数,m_B是第二个,由于要输入小数,故将类型设定为双精度。i是用来记录输入的运算符,1时代表输入了加号,2代表减号,3代表乘号,4代表除号,j是用来记录该输入第几个数,为0时输入的是m_A的值,为1时输入的是m_B的值。m_C是最后的结果数,因此也是双精度。k是用来记录是否点击了小数点,点击了则记为1,x的作用相当于小数的权值,确定小数的位数。sz【50】和ysf【50】和n是专为输入括号设立的,sz用来记录每一步输入的数,ysf用来记录运算符,n记录输入括号的个数,从上也可看出,输入的括号是有限的。解释完这些基本的,下面是数字1的代码部分。

if(j==0)

{//用来确定现在输入的数是给m_A赋值还是给m_B赋值//

if(k>0)

{

x=x*10;

m_A=m_A+1/x;

m_C=m_A;

UpdateData(FALSE);//这段代码是输入小数点后面数的,k大于0则代表现在输入的1在小数点后面,x是全局变量,点击小数点后每输入一个数,x都扩大10倍,从而可以在数的后面继续加数,从而实现输入小数的功能。还有显示框的类型是双精度,通过m_C对屏幕进行刷新,从而显示出来//

}

else if(m_A==0)

{//此处判断A的值是考虑到A是否有值,为0时说明还没有对其进行赋值,因此直接令其等于1即可。//

m_A=1;

m_C=1;

UpdateData(FALSE);

}

else if(m_A!=0)

{//当A不为0时,说明现在输入的1是中间的,因此将原数扩大1倍再加1即可。//

m_A=m_A*10+1;

m_C=m_A;

UpdateData(FALSE);

}

}

else if(j!=0)

{//当j不为0时,则代表此时输入的数是m_B,道理同上,先判断是否有小数点,然后分别输入数字。最后刷新。//

if(k>0)

{

x=x*10;

m_B=m_B+1/x;

m_C=m_B;

UpdateData(FALSE);

}

else if(m_B==0)

{

m_B=1;

m_C=1;

UpdateData(FALSE);

}

else if(m_B!=0)

{

m_B=m_B*10+1;

m_C=m_B;

UpdateData(FALSE);

}

}

 

现在要单独介绍下0的输入,由于编辑框类型是数字类型,因此输入0,尤其是小数点后面的0很难输入

if(j==0)

{

if(k>0)

x=x*10;

else

{

m_A=m_A*10;

m_C=m_A;

UpdateData(FALSE);

}

}

Else

{

if(k>0)

x=x*10;

else

{

m_B=m_B*10;

m_C=m_B;

UpdateData(FALSE);

x=x*10;

}

}

对于0,小数点后面的0比较难输入,这里,当每次点击0时,就将x扩大10倍,为以后输入其他数做准备,一个弊端就是无法显示输入的过程,即比如输入0.001,无法显示0.0,0.00,当输入1时直接显示0.001,这也是本计算器的一个缺点。

 

第二部分是运算符部分,即加减乘除。四种运算方法一样,这里介绍加法,代码部分如下:

k=0;

x=0;//此处的目的是为了下次输入小数做准备。因为之前可能已经输入了小数,现在必须清0,才能顺利进行下次的输入。//

if(m_B==0)

{

j=1;

i=1;

m_C=0;

UpdateData(FALSE);

}//此段代码首先判断是否输入了第二个数,如果没有则说明现在输入的是第一个数,那么此时应该将该运算记下(即加法运算符),然后输入第二个数,当点击等号时候,在输出最终结果,因此将i标记为1,代表加号,将j设为1,代表下次输入的数是第二个数。此时将m_C变0,即显示框变为0.//

Else

{

switch(i)

{

case 1: m_A=m_A+m_B;break;

case 2: m_A=m_A-m_B;break;

case 3: m_A=m_A*m_B;break;

case 4: m_A=m_A/m_B;break;

}

m_B=0;

j=1;

i=1;

m_C=m_A;

UpdateData(FALSE);

}//此段代码是为了实现连续运算而设计的,当输入完两个数的时候,没有点击等号,而是点击了其他运算符时,这时候就会将前两个数的最终结果算出来,并保存在m_A里,此时将m_B清0,i,j都设为1,又可以继续给m_B赋值,继续运算下去,从这也可以看出,做运算的其实只有两个数就可以了。这样处理的方法有一个弊端就是无法实现优先级,因此优先级的实现只能通过加括号的方式了。//

 

现在介绍第三部分,即等号部分,代码如下:

 

k=0;

x=0;

j=0;//等号的点击相当于一次小的结束,因此要将一些必要的东西恢复到原始状态,其实这样做也有些多余,因为计算器有清除功能,这也是此计算器需要优化的一部分。//

if(i==1)

{

m_C=m_A+m_B;

UpdateData(FALSE);

}

else if(i==2)

{

m_C=m_A-m_B;

UpdateData(FALSE);

}

else if(i==3)

{

m_C=m_A*m_B;

UpdateData(FALSE);

}

else if(i==4)

{

m_C=m_A/m_B;

UpdateData(FALSE);

}//此段代码即是单纯的做运算,通过判断运算符的值,来进行最终的运算,将结果赋给m_C,然后在编辑框里显示出来。//

elseUpdateData(FALSE);//这条语句是为了其他的一些情况设计的,因为后面有一些特殊运算,这些运算只需一个数即可,在点击相应的运算时,会将最后结果赋给m_C,但不会立即显示,当点击了“=”后,才会显示出来,因此设计该语句,而且,在涉及括号的时候,该语句同样很重要。//

 

第四部分是小数点部分,该部分功能实现虽然有些复杂,但代码却很简单,如下:

k=1;

x=1;

只需两条语句,提示计算器之后的输入是小数部分,剩余的工作交给了数字部分,通过数字部分的判断来进行小数点后数字的输入。

 

第五部分是清除和退出,这两个功能都十分简单,清除功能将所有全局变量都恢复到初始状态即可。而退出功能只需一条OnOK();语句即可。

 

第六部分简单介绍下特殊运算,其实这部分都有公式的支持。这部分所涉及到得输入数只有m_A,当数输入完成后,点击相应的运算,结果直接赋给m_C,当点击等号时就会显示出来。

 

第七部分是此计算器最复杂的部分,加括号部分,左括号和右括号的代码完全不同。可以打个比方说,左括号是肆无忌惮的做事,而右括号则是给它收拾烂摊子。点击了几个左括号,那么点击相应的右括号时,就要做相应的运算了。下面先介绍左括号的代码部分,如下:

j=0;//此处将j是考虑到括号可能有连续运算的情况比如2+3*(2+4),此时,计算器会先将2+3的值算出,然后进行括号运算。此时算出的值均放到m_A中。//

if(m_A==0)

{

sz[n]=0;

ysf[n]=0;

n++;

}//本段代码是考虑到可能连续输入括号的情况,比如((。因为当输入括号后,一般情况要输入数字,此时应将m_A,m_B清0以便重新输入运算数,那之前的m_A的值就需要记下来。而如果连续输入括号时,m_A必然没有值,此时将其值记为0存入sz[n]中,而将运算符记为0,即没有运算符,然后将n加1,记录左括号的个数。//

else if(m_A!=0)

{

sz[n]=m_A;

ysf[n]=i;

m_A=0;

i=0;

n++;

}//此处代码就是当输入一个括号时,m_A有值,此时应该将该值记录下,等括号输入完成后在进行相应的计算,同样,此时必然会有运算符,即3*(,所以也要将该运算符记下。同时将m_A,i清0,以便下一步的输入。//

介绍完左括号后,现在开始介绍右括号的工作。按照道理,当输入完左括号时,右括号开始做运算,即往回走。代码如下:

switch(i)

{

case 1: m_A=m_A+m_B;break;

case 2: m_A=m_A-m_B;break;

case 3: m_A=m_A*m_B;break;

case 4: m_A=m_A/m_B;break;

}//此段代码很好理解,当点击一下右括号,必然会有两个数和一个运算符等着计算,此时,直接将其结果计算出来赋给m_A,等待下一步的运算。

m_C=m_A;

UpdateData(FALSE);//当算出来结果后,迅速将结果在编辑框中显示出来即可。//

m_B=0;

i=0;//这两条语句是为了以后更为复杂些的情况的输入做准备,比如2*(2+3)*(5-3)。//

if(ysf[n-1]!=0&&n-1>=0)

switch(ysf[n-1])

{

case 1: m_A=m_A+sz[n-1];break;

case 2: m_A=sz[n-1]-m_A;break;

case 3: m_A=m_A*sz[n-1];break;

case 4: m_A=sz[n-1]/m_A;break;

}//本段代码就是回溯的过程,n记录着括号数,当ysf[n-1]且n-1不为0时,说明左括号前有值,要将括号中算出来的值与之前的值再进行运算,因此判断保存的运算符,进行相应的运算。//

n--;//一个运算结束后,可能还要数,于是n减1,继续下一步的运算。//

m_C=m_A;//此语句是为当括号运算全部结束,点击等号时设计的。//

顺便说一下,这样设计出来,是可以进行更复杂点的运算的,比如2*(3*(3+4)),或者2*(3*(2+4)+4*(2+3)),因为每一步都循序渐进,所以不会乱,都可以算出最后结果。//

2.4制作过程中遇到的问题

在制作过程中,遇到了很多困难与问题,我深有体会。

①刚开始,是无法响应数字的输入。由于我不是很熟悉编辑框的用法,因此将它的类型定义为双精度浮点型,这样的话只能输入数字,而不能显示出其他的东西。这也是一个比较严重的问题,比如在输入0.001时,无法显示0.0,0.00的输入过程,只能直接显示0.001,还有就是无法很好地实现优先级的运算,如果类型为edit,可以先将运算式显示在编辑框中,然后逐个读取输入的符号来进行相应的运算,这样则会非常方便。而由于我不熟悉edit,因此采用现输现付的道理,,每输入一个数,就将其赋给编辑框显示,从而达到相应数字点击的效果。

②对于输入小数点,采用的方法与输入数字类似,当点击小数点时,使用一个全局变量标记下小数点被点击,则以后输入的数字均是小数点后面的。此时还需要一个全局变量x,来记录小数点位数,每输入一个数字,位数扩大10倍,然后用相应的数字除以x,得出的数与之前的数相加即得到想要输入的数。存在的问题是如果点击了多次小数点,计算器便出现错误,无法进行错误纠正。还有就是小数的位数是有限输入的,超过位数则会出错,这也是一个缺点。还有就是小数点后面0的输入是不显示的。比如输入5000,会依次显示5,50,500,5000,对于0.1234,也会依次显示0.1,0.12,0.123,0.1234,但是对于0.001,由于无法显示0.0,即无法显示0.0,0.00,当点击1时直接显示0.001,这是需要改进的地方。

③还有一个问题是该计算器无法直接输入整数,这很好理解,因为无法判断是输入减号还是符号,于是,为了解决这个问题,特意加了一个求负的功能键,使得可以对任何输入的数都可直接求负数,从而弥补无法直接输入负数的不足。这也是有待改进的一个地方。

④对于括号的输入,同样编辑框里是无法显示的。还有一个问题是,我所设计的计算器对括号的输入是有限的,最多50个,不过考虑到实际问题,这远远足够,所以不需要再做改进。对于括号的输入,上面已经说明,为了弥补没有优先级的不足,对于括号之前的数,统统保存在一个固定的数组里,当后续工作全部完成,则从相应数组中读出所需数据,从而完成整个运算。

⑤对于清屏键Clear,在此要说明下。通常我们使用的计算器再输入完等号后,就可以继续做运算。而对于我的计算器,由于功能不是特别强大,因此点击等号后,必须对使用过的变量做一下清除才能继续做下面的运算。这样设计也是为了编程方便。同时也是一个需要改进的地方。

⑥对一些按钮的名称,由于无法插入特殊字符,因此有些显得不伦不类。比如按钮x2,该意思是求x的平方,当由于无法将2显示在右上角,只好这样处理。同理x3,eX都是这样。

⑦报错功能不完善,对于该计算器,对一些认为错误,不能很好地识别,比如说输入括号的个数,左右括号个数不同时,必然导致计算器不知该如何处理,从而显示出错符号。还有些常规的错误,比如连续输入了两个运算符,也是不能很好的处理。还有就是本次运算所得到的结果无法直接运用到下一次运算中,即结果不能直接参加下一次的运算。还有一个问题就是如果输入0,则不能正常识别,因为设计过程中,数为0即代表没有输入,这是因为考虑到实际中不会单独输入0做运算,因为没有意义,所以没有考虑这方面的问题。

摘要:

本次设计是基于API和MFC的计算器,其中,API计算器是参照于网络资源,而MFC计算器则是完全独立完成。本计算器均可实现现实计算器的基本功能,而且MFC计算器而可以输入小数点并且加入0,其中也加入了括号的功能,使得可以实现优先级运算,达到了课程设计的要求。

 

附录:

完整的MFC计算器代码

#include "stdafx.h"
#include "jisuanqi.h"
#include "jisuanqiDlg.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
 double m_A,m_B;
 double sz[50];
 int i=0,j=0;
 double m_C=0,x=0;
 int k=0,n=0;
    intysf[50];
class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// Dialog Data
 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual functionoverrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange*pDX);    //DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJisuanqiDlg dialog

CJisuanqiDlg::CJisuanqiDlg(CWnd* pParent )
 : CDialog(CJisuanqiDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CJisuanqiDlg)
 m_C = 0.0f;
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require asubsequent DestroyIcon in Win32
 m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CJisuanqiDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CJisuanqiDlg)
 DDX_Control(pDX, IDC_BUTTON_Exit, m_Exit);
 DDX_Control(pDX, IDC_BUTTON_Clear,m_Clear);
 DDX_Control(pDX, IDC_BUTTONo, m_bnto);
 DDX_Control(pDX, IDC_BUTTONjj, m_bntjj);
 DDX_Control(pDX, IDC_BUTTONj, m_bntj);
 DDX_Control(pDX, IDC_BUTTONdd, m_bntdd);
 DDX_Control(pDX, IDC_BUTTONcc, m_bntcc);
 DDX_Control(pDX, IDC_BUTTON9, m_bnt9);
 DDX_Control(pDX, IDC_BUTTON8, m_bnt8);
 DDX_Control(pDX, IDC_BUTTON7, m_bnt7);
 DDX_Control(pDX, IDC_BUTTON6, m_bnt6);
 DDX_Control(pDX, IDC_BUTTON5, m_bnt5);
 DDX_Control(pDX, IDC_BUTTON4, m_bnt4);
 DDX_Control(pDX, IDC_BUTTON3, m_bnt3);
 DDX_Control(pDX, IDC_BUTTON2, m_bnt2);
 DDX_Control(pDX, IDC_BUTTON1, m_bnt1);
 DDX_Control(pDX, IDC_BUTTON0, m_bnt0);
 DDX_Text(pDX, IDC_EDIT1, m_C);
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CJisuanqiDlg, CDialog)
 //{{AFX_MSG_MAP(CJisuanqiDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_EN_UPDATE(IDC_EDIT1, OnUpdateEdit1)
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 ON_BN_CLICKED(IDC_BUTTON0, OnButton0)
 ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
 ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1)
 ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
 ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
 ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
 ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
 ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
 ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
 ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
 ON_BN_CLICKED(IDC_BUTTONj, OnBUTTONj)
 ON_BN_CLICKED(IDC_BUTTONdd, OnBUTTONdd)
 ON_BN_CLICKED(IDC_BUTTONjj, OnBUTTONjj)
 ON_BN_CLICKED(IDC_BUTTONc, OnBUTTONc)
 ON_BN_CLICKED(IDC_BUTTONcc, OnBUTTONcc)
 ON_BN_CLICKED(IDC_BUTTON_Clear,OnBUTTONClear)
 ON_BN_CLICKED(IDC_BUTTON_Exit,OnBUTTONExit)
 ON_BN_CLICKED(IDC_BUTTONo, OnBUTTONo)
 ON_BN_CLICKED(IDC_BUTTONzk, OnBUTTONzk)
 ON_BN_CLICKED(IDC_BUTTONyk, OnBUTTONyk)
 ON_BN_CLICKED(IDC_BUTTONpingfang,OnBUTTONpingfang)
 ON_BN_CLICKED(IDC_BUTTONlifang,OnBUTTONlifang)
 ON_BN_CLICKED(IDC_BUTTONdaoshu,OnBUTTONdaoshu)
 ON_BN_CLICKED(IDC_BUTTONgenhao,OnBUTTONgenhao)
 ON_BN_CLICKED(IDC_BUTTONsin, OnBUTTONsin)
 ON_BN_CLICKED(IDC_BUTTONtan, OnBUTTONtan)
 ON_BN_CLICKED(IDC_BUTTONcos, OnBUTTONcos)
 ON_BN_CLICKED(IDC_BUTTONjueduizhi,OnBUTTONjueduizhi)
 ON_BN_CLICKED(IDC_BUTTONex, OnBUTTONex)
 ON_BN_CLICKED(IDC_BUTTONlnx, OnBUTTONlnx)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJisuanqiDlg message handlers

BOOL CJisuanqiDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to systemmenu.

 // IDM_ABOUTBOX must be in the system commandrange.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) ==IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if(!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for thisdialog.  The framework does thisautomatically
 //  when the application's mainwindow is not a dialog
 SetIcon(m_hIcon,TRUE);   // Setbig icon
 SetIcon(m_hIcon,FALSE);  // Set small icon
 
 // TODO: Add extra initialization here
 

 
 
 return TRUE;  // returnTRUE  unless you set the focus to a control
}

void CJisuanqiDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID,lParam);
 }
}

// If you add a minimize button to your dialog, you will needthe code below
//  to draw the icon.  For MFCapplications using the document/view model,
//  this is automatically done for you by theframework.

void CJisuanqiDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // devicecontext for painting

  SendMessage(WM_ICONERASEBKGND,(WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in clientrectangle
  int cxIcon =GetSystemMetrics(SM_CXICON);
  int cyIcon =GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon+ 1) / 2;
  int y = (rect.Height() - cyIcon+ 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y,m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display whilethe user drags
//  the minimized window.
HCURSOR CJisuanqiDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

void CJisuanqiDlg::OnUpdateEdit1()
{
 // TODO: If this is a RICHEDIT control, thecontrol will not
 // send this notification unless you override theCDialog::OnInitDialog()
 // function to send the EM_SETEVENTMASK messageto the control
 // with the ENM_UPDATE flag ORed into the lParammask.
 
 // TODO: Add your control notification handlercode here
 
}

void CJisuanqiDlg::OnButton1()
{
 // TODO: Add your control notification handlercode here
if(j==0)
 {
   if(k>0)
   {
    x=x*10;
            m_A=m_A+1/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
   
   elseif(m_A==0)
  {
   m_A=1;
   m_C=1;
   UpdateData(FALSE);
  }
 
  else if(m_A!=0)
  {
       m_A=m_A*10+1;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else if(j!=0)
  {
   if(k>0)
   {
   x=x*10;
             m_B=m_B+1/x;
    
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=1;
    m_C=1;
    UpdateData(FALSE);
   }
   elseif(m_B!=0)
   {
    m_B=m_B*10+1;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
 
}

void CJisuanqiDlg::OnButton0()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
 if(k>0)
  x=x*10;
     else
   {
   m_A=m_A*10;
  m_C=m_A;
  UpdateData(FALSE);
  
  
 }
  else {
   if(k>0)
   x=x*10;
  else
  {
   m_B=m_B*10;
    m_C=m_B;
    UpdateData(FALSE);
    x=x*10;
  }
  }
 
 
}

void CJisuanqiDlg::OnButton2()
{
 // TODO: Add your control notification handlercode here
if(j==0)
 {
  if(k>0)
   {
   x=x*10;
   m_A=m_A+2/x;
   
m_C=m_A;
  UpdateData(FALSE);
  
 else if(m_A==0)
  {
   m_A=2;
   m_C=2;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+2;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+2/x;
   
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=2;
    m_C=2;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+2;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
 
}

void CJisuanqiDlg::OnSetfocusEdit1()
{
 // TODO: Add your control notification handlercode here
 
}

void CJisuanqiDlg::OnButton3()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+3/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=3;
   m_C=3;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+3;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+3/x;
   
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=3;
    m_C=3;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+3;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton4()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+4/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=4;
   m_C=4;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+4;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+4/x;
   
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=4;
    m_C=4;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+4;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton5()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
  if(k>0)
   {
   x=x*10;
   m_A=m_A+5/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
  
  else if(m_A==0)
  {
   m_A=5;
   m_C=5;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+5;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+5/x;
   
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=5;
    m_C=5;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+5;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton6()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+6/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=6;
   m_C=6;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+6;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+6/x;
   
 m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=6;
    m_C=6;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+6;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton7()
{
 // TODO: Add your control notification handlercode here
if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+7/x;
   
m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=7;
   m_C=7;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+7;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+7/x;
   
m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=7;
    m_C=7;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+7;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton8()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+8/x;
   
 m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=8;
   m_C=8;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+8;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+8/x;
   
m_C=m_B;
    UpdateData(FALSE);
  
   elseif(m_B==0)
   {
    m_B=8;
    m_C=8;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+8;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnButton9()
{
 // TODO: Add your control notification handlercode here
  if(j==0)
 {
   if(k>0)
   {
   x=x*10;
   m_A=m_A+9/x;
   
 m_C=m_A;
  UpdateData(FALSE);
   }
  else if(m_A==0)
  {
   m_A=9;
   m_C=9;
   UpdateData(FALSE);
  }
 
  else {
       m_A=m_A*10+9;
  m_C=m_A;
  UpdateData(FALSE);
  }
 }
  else {
   if(k>0)
   {
   x=x*10;
   m_B=m_B+9/x;
 m_C=m_B;
    UpdateData(FALSE);
   }
   elseif(m_B==0)
   {
    m_B=9;
    m_C=9;
    UpdateData(FALSE);
   }
   else {
    m_B=m_B*10+9;
    m_C=m_B;
    UpdateData(FALSE);
   }
  }
}

void CJisuanqiDlg::OnBUTTONj()
{
 // TODO: Add your control notification handlercode here
 k=0;
 x=0;
 if(m_B==0)
 {
  j=1;
  i=1;
  m_C=0;
  UpdateData(FALSE);
 }
 else {
  switch(i)
  {
  case 1:m_A=m_A+m_B;break;
  case 2:m_A=m_A-m_B;break;
  case 3:m_A=m_A*m_B;break;
  case 4:m_A=m_A/m_B;break;
  }
    m_B=0;
  j=1;
  i=1;
  m_C=m_A;
  UpdateData(FALSE);

}
}

 

void CJisuanqiDlg::OnBUTTONdd()
{
 // TODO: Add your control notification handlercode here
   k=0;
    x=0;
  j=0;
 if(i==1)
 {
 m_C=m_A+m_B;
 UpdateData(FALSE);
 }
else if(i==2)
 {
 m_C=m_A-m_B;
 UpdateData(FALSE);
 }
else if(i==3)
 {
 m_C=m_A*m_B;
 UpdateData(FALSE);
 }
else if(i==4)
 {
 m_C=m_A/m_B;
 UpdateData(FALSE);
 }
else UpdateData(FALSE);
}
void CJisuanqiDlg::OnBUTTONjj()
{
 // TODO: Add your control notification handlercode here
k=0;
 x=0;
 if(m_B==0)
 {
  j=1;
  i=2;
  m_C=0;
  UpdateData(FALSE);
 }
 else {
  switch(i)
  {
  case 1:m_A=m_A+m_B;break;
  case 2:m_A=m_A-m_B;break;
  case 3:m_A=m_A*m_B;break;
  case 4:m_A=m_A/m_B;break;
  }
    m_B=0;
  j=1;
  i=2;
  m_C=m_A;
  UpdateData(FALSE);

}
}

void CJisuanqiDlg::OnBUTTONc()
{
 // TODO: Add your control notification handlercode here
 k=0;
 x=0;
 if(m_B==0)
 {
  j=1;
  i=3;
  m_C=0;
  UpdateData(FALSE);
 }
 else {
  switch(i)
  {
  case 1:m_A=m_A+m_B;break;
  case 2:m_A=m_A-m_B;break;
  case 3:m_A=m_A*m_B;break;
  case 4:m_A=m_A/m_B;break;
  }
    m_B=0;
  j=1;
  i=3;
  m_C=m_A;
  UpdateData(FALSE);

}
}

void CJisuanqiDlg::OnBUTTONcc()
{
 // TODO: Add your control notification handlercode here
  k=0;
 x=0;
 if(m_B==0)
 {
  j=1;
  i=4;
  m_C=0;
  UpdateData(FALSE);
 }
 else {
  switch(i)
  {
  case 1:m_A=m_A+m_B;break;
  case 2:m_A=m_A-m_B;break;
  case 3:m_A=m_A*m_B;break;
  case 4:m_A=m_A/m_B;break;
  }
    m_B=0;
  j=1;
  i=4;
  m_C=m_A;
  UpdateData(FALSE);

}
}

void CJisuanqiDlg::OnBUTTONClear()
{
 // TODO: Add your control notification handlercode here
 int q;
 k=0;
 x=0;
 i=0;
 j=0;
   for(q=0;q<=n;q++)
 {
  sz[q]=0;
  ysf[q]=0;
 }
n=0;
 m_A=0;
 m_B=0;
 m_C=0;
 UpdateData(FALSE);
 
}

void CJisuanqiDlg::OnBUTTONExit()
{
 // TODO: Add your control notification handlercode here
 OnOK();
}

void CJisuanqiDlg::OnBUTTONo()
{
 // TODO: Add your control notification handlercode here
  k=1;
 x=1;
}

void CJisuanqiDlg::OnBUTTONzk()
{
 // TODO: Add your control notification handlercode here
 j=0;
 if(m_A==0)
 {
  sz[n]=0;
  ysf[n]=0;
  n++;
 }
 else if(m_A!=0)
 {
  sz[n]=m_A;
  ysf[n]=i;
  m_A=0;
  i=0;
  n++;
 }
}

void CJisuanqiDlg::OnBUTTONyk()
{
 // TODO: Add your control notification handlercode here
  switch(i)
  {
  case 1:m_A=m_A+m_B;break;
  case 2:m_A=m_A-m_B;break;
  case 3:m_A=m_A*m_B;break;
  case 4:m_A=m_A/m_B;break;
  }
 m_C=m_A;
 UpdateData(FALSE);
 m_B=0;
 i=0;
 if(ysf[n-1]!=0&&n-1>=0)
 switch(ysf[n-1])
  {
  case 1:m_A=m_A+sz[n-1];break;
  case 2:m_A=sz[n-1]-m_A;break;
  case 3:m_A=m_A*sz[n-1];break;
  case 4:m_A=sz[n-1]/m_A;break;
  }
   n--;
   m_C=m_A;

}

void CJisuanqiDlg::OnBUTTONpingfang()
{
 // TODO: Add your control notification handlercode here
 m_C=m_A*m_A;
}

void CJisuanqiDlg::OnBUTTONlifang()
{
 // TODO: Add your control notification handlercode here
 m_C=m_A*m_A*m_A;
}

void CJisuanqiDlg::OnBUTTONdaoshu()
{
 // TODO: Add your control notification handlercode here
 if(m_A==0) AfxMessageBox("输入不正确");
 else m_C=1/m_A;
}

void CJisuanqiDlg::OnBUTTONgenhao()
{
 // TODO: Add your control notification handlercode here
 if(m_A<0) AfxMessageBox("输入不正确");
 else m_C=sqrt(m_A);
}

void CJisuanqiDlg::OnBUTTONsin()
{
 // TODO: Add your control notification handlercode here
 m_C=sin(m_A);
}

void CJisuanqiDlg::OnBUTTONtan()
{
 // TODO: Add your control notification handlercode here
 m_C=tan(m_A);
}

void CJisuanqiDlg::OnBUTTONcos()
{
 // TODO: Add your control notification handlercode here
 m_C=cos(m_A);
}

void CJisuanqiDlg::OnBUTTONjueduizhi()
{
 // TODO: Add your control notification handlercode here
 if(j==0)
 {
  
  m_A=0-m_A;
   m_C=m_A;
   UpdateData(FALSE);
 
 }
 else
 {
  
   m_B=0-m_B;
            m_C=m_B;
UpdateData(FALSE);
  
 }
}

void CJisuanqiDlg::OnBUTTONex()
{
 // TODO: Add your control notification handlercode here
  m_C=exp(m_A);
}

void CJisuanqiDlg::OnBUTTONlnx()
{
 // TODO: Add your control notification handlercode here
 m_C=log(m_A);
}

 

0 0