VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 649|回复: 1

[求助] 对于计算器退格,小数点等的运算无法实现

[复制链接]
55_avatar_middle
在线会员 发表于 2016-6-23 11:19:22 | 显示全部楼层 |阅读模式
3驿站币
一开始点退格,小数点,清空,逆运算都无法实现是什么原因
void CBKWDlg::OnNumberKey(UINT nID)
{
       
        int n=0;
        switch(nID)
        {
        case IDC_BUTTON0:n=0;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
    case IDC_BUTTON1:n=1;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON2:n=2;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON3:n=3;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON4:n=4;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON5:n=5;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON6:n=6;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON7:n=7;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON8:n=8;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        case IDC_BUTTON9:n=9;GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;break;
        }

if(m_num>=0)
  m_result=m_num*10+n;
else
  m_result=m_num*10-n;
m_num=m_result;
UpdateData(FALSE);
}

void CBKWDlg::OnOperationKey(UINT nID)
{
        switch(nID)
        {
    case IDC_D1:
            num1 = m_num;
            m_num=0;
            operation_type = ADD ;
                GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
                break;//加
        case IDC_D2:       
                num1 = m_num;
            m_num=0;
            operation_type = SUB ;
                GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
                break;//减
        case IDC_D3:
                num1 = m_num;
            m_num=0;
            operation_type = MUL ;
                GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
                break;//乘
        case IDC_D4:
            num1 = m_num;
            m_num=0;
            operation_type = DIV ;
                GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
                break;//除

        case IDC_D5:
            m_num= - atof( num_buffer ) ;
            // 转化为字符串
            num_buffer.Format( _T("%0.0f"), m_num );
            GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;
            break;//正负号

        case IDC_D6:
                    if ( num_buffer.IsEmpty() )
                        {
                    num_buffer = "0." ;
                        }
                else if ( num_buffer.ReverseFind('.') == -1 )
                        {
                    num_buffer += "." ;
                        }
                GetDlgItem( IDC_EDIT_SHOW)->SetWindowText( num_buffer ) ;               
        break;//小数点
       
        case IDC_D7:
                num1 = num2 = 0.0 ;
        m_num = 0.0 ;
            // 清空显示数据
            num_buffer.Empty() ;
            GetDlgItem( IDC_EDIT_SHOW)->SetWindowText("0");break;//清除
        case IDC_D8:
                if( !num_buffer.IsEmpty() )
                num_buffer.Delete(num_buffer.GetLength() - 1 , 1) ;
            this->fresh() ;
                break;//退格
        }
}

void CBKWDlg::OnD9()
{
const double EPSINON = 0.000001 ;
        bool error = false ;
        this->num2 = m_num;
        this->m_result=0;
        switch( this->operation_type )
        {
        case ADD :
                this->m_num = num1 + num2 ;
                break;
        case SUB :
                this->m_num = num1 - num2 ;
                break;
        case MUL :
                this->m_num = num1 * num2 ;
                break;
        case DIV :
                if ( (num2 > -EPSINON ) && (num2 <= EPSINON) )
                {
                        num_buffer="error";
                        error = true ;
                }
                else
                {
                        this->m_num = num1 / num2 ;
                }
                break;
        default:
                this->m_result= this->num2 ;
                break;       
        }
        if ( !error )
        {
                num_buffer.Format( _T("%0.0f") , m_num) ;
        }
        GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
        this->operation_type =0;
        this->m_num=0;
        num_buffer="";
}
       


void CBKWDlg::check()
{

        if ( !this->unary_operation )
        {
                // 若没有在进行一元运算时,下次输入前清空缓存
                this->num_buffer.Empty() ;
                // 打开一元运算
                this->unary_operation = true ;
        }

        if ( !this->binary_operation )
        {
                // 若没有在进行二元运算时,下次输入前清空缓存
                this->num_buffer.Empty() ;
                // 打开二元运算
                this->binary_operation = true ;
        }
}
void CBKWDlg::fresh()
{
        GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(num_buffer) ;
}

void CBKWDlg::fresh(CString show)
{
        GetDlgItem(IDC_EDIT_SHOW)->SetWindowText(show) ;
}


D1-D9分别是+- * / 逆运算 小数点 清空 退格 等于





上一篇:求c或c++单线程坦克大战坦克移动和子弹移动的处理方式
下一篇:新人在编程中发现问题,望大神解答谢谢!
51_avatar_middle
online_admins 发表于 2016-6-23 11:32:21 | 显示全部楼层
看了楼主的工程源码,点击 . 按钮的时候 num_buffer 的内容为空,所以设置到编辑框的内容就被清空了,真正跟编辑框绑定的字符串类型变量是:m_result,所以想办法对 m_result 进行操作
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-24 14:04

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表