VC++实现标准型计算器步骤及源码

2013年06月19日 09:48:47 无敌的成长日记 阅读数:4686
 
    最近一段时间一直在做这个东西,刚刚拿到题目的时候认为这是一个简单的程序,可是随着编写程序的深入,发现这也不是一个很简单的程序,主要是需要考虑到一些连续加减以及混合运算的情况。
   首先介绍一下这个小计算器的功能。其实也没有什么新的功能啦,只是有一些简单的+、-、*、/运算,能够完成混合运算,是一个标准型的计算器。
 
建立文件
(1)建立应用程序外壳
    创建一个新的AppWizard项目,命名为shiyan,选择Dialog based;其他都选用默认属性,单击Finish完成生成应用程序的步骤。
VC++实现标准型计算器步骤及源码-LMLPHP
    进入对话框界面以后,按下图所示布置显示框和功能按钮,这个小计算器一共需要10个数字键,9个功能键两个文本框。(下面的显示窗口是在测试程序时用的跟踪窗口,一般的计算器可以删去)。
(2)设置窗口属性
    将上面的显示框属性设置成为CString型,下面的跟踪显示框设置成为Double型,并且绑定两个变量给他们。分别是m_text(显示框),m_show(跟踪显示框)ID改成IDC_text,IDC_show。数字键的ID号更改成为IDC_OnX,Caption改为相应的数字。
(3)设置公有变量
    这个程序中我用的公共变量比较得多,主要是因为我是新手吗!!下面是所有公有变量的列表:
 
 
 
 
  1.  
    int numb;
  2.  
    int h; //.计数
  3.  
    double temp4;
  4.  
    double temp1;
  5.  
    double temp3;
  6.  
    double temp2;
  7.  
    CString ss;
  8.  
    char sign;
  9.  
    int a; //减法计数
  10.  
    int b; //乘法计数
  11.  
    int c; //除法计数
  12.  
    int d; //加法计数
   要给公有变量赋值需要在 OnInitDialog()函数中赋值,而这个函数就是在运行对话框时首先要运行的初始化函数,现在给需要赋初值的公有变量赋初值。
  1.  
    sign=0;
  2.  
    CString ss="0";
  3.  
    temp4=0;
  4.  
    temp2=0;
  5.  
    a=b=c=d=0;
  6.  
    h=0;
  7.  
    numb=0;
(3)编写按钮程序
数字键
    双击你所要编写的数字键进入相应的按键程序编写,例如1建,双击后编写程序:
  1.  
    void CShiyanDlg::OnOn1()
  2.  
    {
  3.  
    UpdateData(1);//上传数据开启
  4.  
    if(numb==1)//判断是否已经按下=号建
  5.  
    {
  6.  
    ss="";
  7.  
    m_text;
  8.  
    numb=0;
  9.  
    }
  10.  
    int a;
  11.  
    a=ss.GetLength();//截取当前显示框字符串长度
  12.  
    ss.Insert(a,"1");//插入字符
  13.  
    m_text=ss;
  14.  
    UpdateData(0);//上传数据关闭
  15.  
    // TODO: Add your control notification handler code here
  16.  
     
  17.  
    }

“+”号键程序:

  1.  
    void CShiyanDlg::Onadd()
  2.  
    {
  3.  
    h=0;
  4.  
    a=b=c=0;
  5.  
    d++;
  6.  
    UpdateData(1);
  7.  
    temp1=atof(ss);
  8.  
    if((sign=='-')||(sign=='*')||(sign=='/'))
  9.  
    {
  10.  
    switch(sign)//change
  11.  
    {
  12.  
    case'-':
  13.  
    {
  14.  
    temp1=atof(ss);
  15.  
    temp4=temp4-temp1;
  16.  
    break;
  17.  
    }
  18.  
    case'*':
  19.  
    {
  20.  
    temp1=atof(ss);
  21.  
    temp4=temp4*temp1;
  22.  
    break;
  23.  
    }
  24.  
    case'/':
  25.  
    {
  26.  
    temp1=atof(ss);
  27.  
    temp4=temp4/temp1;
  28.  
    break;
  29.  
    }
  30.  
    }
  31.  
    }
  32.  
    else
  33.  
    {
  34.  
    if (d==1)///carefull!!
  35.  
    temp4=temp1;
  36.  
    else
  37.  
    temp4=temp4+temp1;
  38.  
    }
  39.  
    ss="";
  40.  
    m_text=ss;
  41.  
    m_show=temp4;
  42.  
    sign='+';
  43.  
    //numb++;
  44.  
    UpdateData(0);
  45.  
    // TODO: Add your control notification handler code here
  46.  
     
  47.  
    }

“-”号键程序:

  1.  
    void CShiyanDlg::Onsub()
  2.  
    {
  3.  
    h=0;
  4.  
    b=c=d=0;
  5.  
    a++;
  6.  
    UpdateData(1);
  7.  
    temp1=atof(ss);
  8.  
    if((sign=='+')||(sign=='*')||(sign=='/'))
  9.  
    {
  10.  
    switch(sign)//change
  11.  
    {
  12.  
    case'+':
  13.  
    {
  14.  
    temp1=atof(ss);
  15.  
    temp4=temp4+temp1;
  16.  
    break;
  17.  
    }
  18.  
    case'*':
  19.  
    {
  20.  
    temp1=atof(ss);
  21.  
    temp4=temp4*temp1;
  22.  
    break;
  23.  
    }
  24.  
    case'/':
  25.  
    {
  26.  
    temp1=atof(ss);
  27.  
    temp4=temp4/temp1;
  28.  
    break;
  29.  
    }
  30.  
    }
  31.  
    }
  32.  
    else
  33.  
    {
  34.  
    if (a==1)///carefull!!
  35.  
    temp4=temp1;
  36.  
    else
  37.  
    temp4=temp4-temp1;
  38.  
    }
  39.  
    ss="";
  40.  
    m_text=ss;
  41.  
    m_show=temp4;
  42.  
    sign='-';
  43.  
    //numb++;
  44.  
    UpdateData(0);
  45.  
    // TODO: Add your control notification handler code here
  46.  
     
  47.  
    }

“*”号键程序:

  1.  
    void CShiyanDlg::Onmul()
  2.  
    {
  3.  
    a=c=d=0;
  4.  
    h=0;
  5.  
    b++;
  6.  
    UpdateData(1);
  7.  
    temp1=atof(ss);
  8.  
    if((sign=='+')||(sign=='-')||(sign=='/'))
  9.  
    {
  10.  
    switch(sign)//change
  11.  
    {
  12.  
    case'+':
  13.  
    {
  14.  
    temp1=atof(ss);
  15.  
    temp4=temp4+temp1;
  16.  
    break;
  17.  
    }
  18.  
    case'-':
  19.  
    {
  20.  
    temp1=atof(ss);
  21.  
    temp4=temp4-temp1;
  22.  
    break;
  23.  
    }
  24.  
    case'/':
  25.  
    {
  26.  
    temp1=atof(ss);
  27.  
    temp4=temp4/temp1;
  28.  
    break;
  29.  
    }
  30.  
    }
  31.  
    }
  32.  
    else
  33.  
    {
  34.  
    if (b==1)///carefull!!
  35.  
    temp4=temp1;
  36.  
    else
  37.  
    temp4=temp4*temp1;
  38.  
    }
  39.  
    ss="";
  40.  
    m_text=ss;
  41.  
    m_show=temp4;
  42.  
    sign='*';
  43.  
    //numb++;
  44.  
    UpdateData(0);
  45.  
    // TODO: Add your control notification handler code here
  46.  
     
  47.  
    }

“.”键程序:

  1.  
    void CShiyanDlg::Onpoint()
  2.  
    {
  3.  
    UpdateData(1);
  4.  
    int a;
  5.  
    if(h==0)
  6.  
    {
  7.  
    a=ss.GetLength();
  8.  
    ss.Insert(a,".");
  9.  
    m_text=ss;
  10.  
    }
  11.  
    else
  12.  
    {;}
  13.  
    h=1;
  14.  
    UpdateData(0);
  15.  
    //sign=0;
  16.  
    //a=0;
  17.  
    // TODO: Add your control notification handler code here
  18.  
     
  19.  
    }

乘方键程序:

  1.  
    void CShiyanDlg::Onsqrt() //try again
  2.  
    {
  3.  
    UpdateData(1);
  4.  
    temp4=atof(ss)*atof(ss);
  5.  
    ss.Format(_T("%f"),temp4);
  6.  
    m_text=ss;
  7.  
    m_show=temp4;
  8.  
    //sign=0;
  9.  
    UpdateData(0);
  10.  
    // TODO: Add your control notification handler code here
  11.  
     
  12.  
    }

“+/-”键程序:

  1.  
    void CShiyanDlg::Onsign()
  2.  
    {
  3.  
    UpdateData(1);
  4.  
    numb=0;
  5.  
    temp2=-atof(ss);
  6.  
    ss.Format(_T("%f"),temp2);
  7.  
    m_text=ss;
  8.  
    m_show=temp2;
  9.  
    temp2=0;
  10.  
    UpdateData(0);
  11.  
    // TODO: Add your control notification handler code here
  12.  
     
  13.  
    }

“C”键程序:

  1.  
    void CShiyanDlg::OnCE() //C
  2.  
    {
  3.  
    numb=0;
  4.  
    h=0;
  5.  
    UpdateData(1);
  6.  
    ss="";
  7.  
    m_text=ss;
  8.  
    m_show=atof(ss);
  9.  
    temp1=0;
  10.  
    temp2=0;
  11.  
    temp3=0;
  12.  
    temp4=0;
  13.  
    sign='o';
  14.  
    UpdateData(0);
  15.  
    a=b=c=d=0;
  16.  
     
  17.  
    // TODO: Add your control notification handler code here
  18.  
     
  19.  
    }

“DEL”键程序:

  1.  
    void CShiyanDlg::Ondel()
  2.  
    {
  3.  
    UpdateData(1);
  4.  
    int u,v;
  5.  
    ss=m_text;
  6.  
    v=ss.GetLength();
  7.  
    u=v-1;
  8.  
    ss.Format("%s",ss.Left(u));
  9.  
    m_text=ss;
  10.  
    UpdateData(0);
  11.  
    // TODO: Add your control notification handler code here
  12.  
     
  13.  
    }

“=”号建:

  1.  
    void CShiyanDlg::Onequ()
  2.  
    {
  3.  
    numb=1;
  4.  
    h=0;
  5.  
    UpdateData(1);
  6.  
    switch(sign)
  7.  
    {
  8.  
    case '+':
  9.  
    {
  10.  
    a=b=c=0;
  11.  
    temp1=atof(ss);
  12.  
    d++;
  13.  
    if (d==1)
  14.  
    temp4=temp1;
  15.  
    else
  16.  
    temp4=temp4+temp1;
  17.  
    ss.Format(_T("%f"),temp4);
  18.  
    m_text=ss;
  19.  
    m_show=temp4;
  20.  
    temp1=0;
  21.  
    temp4=0;
  22.  
    d=0;
  23.  
    break;
  24.  
    }
  25.  
    case '-':
  26.  
    {
  27.  
    b=c=d=0;
  28.  
    temp1=atof(ss);
  29.  
    a++;
  30.  
    if (a==1)
  31.  
    temp4=temp1;
  32.  
    else
  33.  
    temp4=temp4-temp1;
  34.  
    ss.Format(_T("%f"),temp4);
  35.  
    m_text=ss;
  36.  
    m_show=temp4;
  37.  
    temp1=0;
  38.  
    temp4=0;
  39.  
    a=0;
  40.  
    break;
  41.  
    }
  42.  
    case '*':
  43.  
    {
  44.  
    a=c=d=0;
  45.  
    temp1=atof(ss);
  46.  
    b++;
  47.  
    if (b==1)
  48.  
    temp4=temp1;
  49.  
    else
  50.  
    temp4=temp4*temp1;
  51.  
    ss.Format(_T("%f"),temp4);
  52.  
    m_text=ss;
  53.  
    m_show=temp4;
  54.  
    temp1=0;
  55.  
    temp4=0;
  56.  
    b=0;
  57.  
    break;
  58.  
    }
  59.  
    case '/':
  60.  
    {
  61.  
    a=b=d=0;
  62.  
    temp1=atof(ss);
  63.  
    c++;
  64.  
    if (c==1)
  65.  
    temp4=temp1;
  66.  
    else
  67.  
    temp4=temp4/temp1;
  68.  
    ss.Format(_T("%f"),temp4);
  69.  
    m_text=ss;
  70.  
    m_show=temp4;
  71.  
    temp1=0;
  72.  
    temp4=0;
  73.  
    c=0;
  74.  
    break;
  75.  
    }
  76.  
    //a=b=c=d=0;
  77.  
    }
  78.  
    sign=0;
  79.  
    UpdateData(0);
  80.  
    // TODO: Add your control notification handler code here
  81.  
     
  82.  
    }
05-11 18:15