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
|
|