V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
img5d
V2EX  ›  C++

初学 怎么都写不好这个循环

  •  
  •   img5d · 2019-12-06 08:49:06 +08:00 · 4914 次点击
    这是一个创建于 1816 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 MFC 在写一个计算器,想设计最大数为 15 个字,但是当含有负号和小数点的时候没关系。
    所以我就分为了几种情况
    小于 16 位的时候 直接加
    等于 16 位的时候 判断出了小数点或者负号在的时候 通过 ,否则报个错
    等于 17 位的时候 小数点和符号都在的时候通过,否则报错
    大于 17 位的时候 报错

    debug 的时候 16 位的数字依然就已经可以四则运算了。。
    怎么改改呢。。



    void CMFCApplication1jisuanqiDlg::OnBnClickedButtonplus()
    {
    // TODO: ここにコントロール通知ハンドラー コードを追加します。
    CString cs;
    GetDlgItemText(IDC_EDITscreen, cs);
    num1 = _tstof(cs);//double num1 = atof((LPSTR)(LPCTSTR)cs.GetBuffer(cs.GetLength()));
    if (cs.GetLength() < 16)
    {
    opt = "+";
    SetDlgItemText(IDC_EDITscreen, _T(""));
    }
    if (cs.GetLength() == 16)
    {
    if (cs.Find(_T(".")) || cs.Find(_T("-")))
    {
    opt = "+";
    SetDlgItemText(IDC_EDITscreen, _T(""));
    }
    else
    {
    SetDlgItemText(IDC_EDITscreen, _T("エラー、入力桁数は1 5位です"));
    }
    }
    if (cs.GetLength() == 17)
    {
    if (cs.Find(_T(".")) && cs.Find(_T("-")))
    {
    opt = "+";
    SetDlgItemText(IDC_EDITscreen, _T(""));
    }
    else
    {
    SetDlgItemText(IDC_EDITscreen, _T("エラー、入力桁数は1 5位です"));
    }
    }
    if (cs.GetLength() > 17)
    {
    SetDlgItemText(IDC_EDITscreen, _T("エラー、入力桁数は1 5位です"));
    }

    }
    15 条回复    2019-12-06 10:45:32 +08:00
    araragi2222
        1
    araragi2222  
       2019-12-06 08:56:20 +08:00   ❤️ 7
    ???为啥备注是日文 故乡樱花开了??
    img5d
        2
    img5d  
    OP
       2019-12-06 08:58:40 +08:00 via iPhone
    @araragi2222 这不是重点吧
    freewind
        3
    freewind  
       2019-12-06 09:07:12 +08:00
    js
    n.toString().replace(/\.\-/g, "").length < 16
    BingoXuan
        4
    BingoXuan  
       2019-12-06 09:20:10 +08:00
    我看了半天还是云里雾里的。我觉得思路是应该先转化数字再考虑文本表现形式吧。我的理解是,最大数应该是 10 的 16 次方-1,小数精度为 1 位。那么直接判断数字大小就好了,再格式化吧。
    shintendo
        5
    shintendo  
       2019-12-06 09:24:20 +08:00
    这个判断逻辑好复杂,为什么不这样:取长度存入变量,如果有符号减 1,如果有小数点减 1,最后结果与 15 比较。(假定你做了多个符号多个小数点的检查)
    img5d
        6
    img5d  
    OP
       2019-12-06 09:25:16 +08:00 via iPhone
    @shintendo 啊啊啊啊 这个厉害!
    shintendo
        7
    shintendo  
       2019-12-06 09:28:37 +08:00
    @BingoXuan 没说小数精度 1 位吧,而且有可能用户给个超大的数,转换直接爆了
    Tumblr
        8
    Tumblr  
       2019-12-06 09:29:06 +08:00
    代码为啥不用 script block。。。
    anuding
        9
    anuding  
       2019-12-06 09:29:21 +08:00 via Android
    @araragi2222 复制的网上的日文教程 /博客吧
    podel
        10
    podel  
       2019-12-06 09:39:24 +08:00
    楼主为啥不做字符串扫描的。也就那么一点点字符把。另外楼主甚至可以弄一个 button 让别人只能点 button 限制用户输入。
    或者 hook 文本框的输入。每次输入的时候都 check 一下。check 过才让进去。
    si
        11
    si  
       2019-12-06 10:02:06 +08:00
    CString::Find,函数名称,返回此 CString 对象中与需要的子字符串或字符匹配的第一个字符的从零开始的索引;如果没有找到子字符串或字符则返回-1.
    没找到返回-1,-1 也是 true,找到也会返回 0,0 是 false。
    要全部改成 cs.Find() != -1 吧
    XiaoWangZhanzz
        12
    XiaoWangZhanzz  
       2019-12-06 10:23:42 +08:00
    难道是跨国友人,也知道 V2E 了
    IGJacklove
        13
    IGJacklove  
       2019-12-06 10:30:28 +08:00
    老哥不会在日本吧?
    a2ex
        14
    a2ex  
       2019-12-06 10:42:37 +08:00
    日语注释楼主还不说的原因是对日外包吧
    BingoXuan
        15
    BingoXuan  
       2019-12-06 10:45:32 +08:00
    @shintendo
    抱歉我说的有歧义,我的意思是 15 位数的时候且有符号允许的小数位。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5573 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:00 · PVG 15:00 · LAX 23:00 · JFK 02:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.