A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-1-3 09:17  /  1114 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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,然后在编辑框里显示出来。//

else UpdateData(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;
    int ysf[50];
class CAboutDlg : public CDialog
{
public:
CAboutDlg();

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

// ClassWizard generated virtual function overrides
//{{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 a subsequent 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 system menu.

// IDM_ABOUTBOX must be in the system command range.
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 this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);   // Set big icon
SetIcon(m_hIcon, FALSE);  // Set small icon

// TODO: Add extra initialization here




return TRUE;  // return TRUE  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 need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

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

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

  // Center icon in client rectangle
  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 while the user drags
//  the minimized window.
HCURSOR CJisuanqiDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CJisuanqiDlg::OnUpdateEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.

// TODO: Add your control notification handler code here

}

void CJisuanqiDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(j==0)
{
   if(k>0)
   {
    x=x*10;
             m_A=m_A+1/x;

m_C=m_A;
  UpdateData(FALSE);
   }

   else if(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);
   }
   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);
   }
  }

}

void CJisuanqiDlg::OnButton0()
{
// TODO: Add your control notification handler code 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 handler code 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);
   }
   else if(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 handler code here

}

void CJisuanqiDlg::OnButton3()
{
// TODO: Add your control notification handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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);
   }
   else if(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 handler code 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 handler code 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 handler code 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 handler code 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 handler code 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 handler code 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 handler code here
OnOK();
}

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

void CJisuanqiDlg::OnBUTTONzk()
{
// TODO: Add your control notification handler code 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 handler code 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 handler code here
m_C=m_A*m_A;
}

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

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

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

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

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

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

void CJisuanqiDlg::OnBUTTONjueduizhi()
{
// TODO: Add your control notification handler code 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 handler code here
  m_C=exp(m_A);
}

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


---------------------
转载,仅作分享,侵删
作者:吹成狗的攻城狮
原文:https://blog.csdn.net/yongshi6/article/details/45172833


1 个回复

倒序浏览
奈斯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马