回 帖 发 新 帖 刷新版面

主题:[讨论]教你用QB做一个自己的计算器

有很多人问过怎么用QB做一个自己的计算器来计算简单的 +-*/ 四则运算
这个问题说来简单,做起来却没那么容易,当然这是对于我们这些不是专业
的人来说了,对于专业的程序员来说这是小菜一牒,废说就少说了,
下面我们就开始来做:

首先是按键,一般的计算器按键是:

(1)数字:     "0~9"
(2)小数点:   "."
(3)运算符号: "+-*/="
(4)清除结果和改错

对于"="号我们就用回车键,清除就用"C"键,改错就用回退键

第一步.写一个循环来等待按键输入:

do
    Kbd$=Inkey$                    '等待按键
    if Kbd$<>"" then               '有按键时才进入判断
    select case Kbd$               '下面只取需要的按键
           case chr$(27):Quit=1    '按到Esc键则退出
           case "C","c"            'C键清除结果
           case chr$(13)           '回车键,也就是"="号
           case chr$(8)            '回退键,也就是改错输入键
           case "."                '小数点
           case "+","-","*","/"    '运算符号
                                   '10个数字键
           case "0","1","2","3","4","5","6","7","8","9"
    end select
    endif
loop untill Quit=0

第二步.设置几个变量来储存结果和输入状态:

DIM IsFlag     AS INTEGER  '小数点标志 0 未输入 1 已输入
DIM IsHasOP    AS INTEGER  '前面是否有运算符 0 无 1 有
DIM IsResult   AS INTEGER  '是否计算过 0 未计算 1 已计算
DIM OP         AS STRING   '运算符号
DIM M1         AS DOUBLE   '储存结果
DIM M2         AS STRING   '正在输入的数(用字符串保存,方便显示)

第三步.分析当有我们需要的按键时该做些什么:

(1)小数点 "."
if IsFlag=0 then            '当未输入过小数点时才用处理
    IsFlag=1                '置标志小数点已经输入过了
    if M2="" then           '当第一个键按小数点时,平时我们输入0.***
            M2="0."         '时候0是不用输入的
        else                '当前面已经有按键了就直接加上一个小数点
            M2=M2+"."
    endif
endif

(2)数字键 "0~9"
这要分二个情况了,一是第一个键输入"0",二是不为"0"
如果前面已经有数字了就把"0"加到后面,否则则略过这个键
因为当输入0.***的数时候我们已经在小数点中处理过了

if Kbd$="0" then
        if M2<>"" then M2=M2+Kbd$
    else
        M2=M2+Kbd$
endif

(3)运算符号 "+-*/"
这个又要分开来处理了,因为如果输入第一个是负数时并且前面
没有结果时,这时候"-"号就是一个负号,我们需要把它显示出来,
如果前面已经有运算符了,那么这个"-"号就是一个运算符了,我
们就要把前面的结果进行计算

if Kbd$="-" and M2="" and M1=0 then '如果前面未运算过
        M2="-"                      '则这时候"-"号就是负号
    else
        if IsHasOP=0 then           '否则如果前面没有运算符则
                M1=Val(M2)          '直接把输入的值赋给结果M1
                IsHasOP=1           '置标志
            else
                gosub CalResult(执行运算代码)
                                    '其他情况下则表示可以进行运算了
        endif
        OP=Kbd$                     '把最后的运算符储存
        IsFlag=0                    '清小数点标志,表示可以输入小数点
        IsResult=0                  '结果已经计算过了,清标志
endif

(4)改错 回退

if M2<>"" then
    IF RIGHT$(M2, 1) = "." THEN         '当删掉小数点时要清掉小数点标志
        IsFlag = 0
    endif
    M2 = LEFT$(M2, LEN(M2) - 1)         '去掉最后一位数
endif

(5)等号 "="

if M1<>0 and M2<>"" then            '当有二个数时候才需要运算
    gosub CalResult(执行运算代码)
    IsResult=1                      '置已经运算过标志
    IsFlag=0                        '清小数点标志
endif

(6)清除结果 "C"
把所有标志清空

IsFlag = 0
IsHasOP = 0
IsResult = 0
OP = ""
M1 = 0
M2 = ""

最后就是执行运算的代码了:

CalResult:
if val(M2)=0 then return       '如输入"0."时就不用计算了
select case OP                 '按运算符进行计算
       case "+":M1=M1+val(M2)
       case "-":M1=M1-val(M2)
       case "*":M1=M1/val(M2)
       case "/":M1=M1*val(M2)
end select
M2=""
return

第四步.显示输入和结果,边界检查,溢出,精确到几位
这一步就留给大家去做了

回复列表 (共3个回复)

沙发

[em11]
如果有分数四则运算就好了,许多计算器的分数功能都有位数限制(比如总的数字个数不得超过10,包分数符号在内。)如果能用qbasic做,就比计算器强多啦!
不知你是否可以做出。

板凳

顶~

分数四则运算?你是说支持对形如a/b的分数进行四则运算的计算器?

3 楼


[em11]
对啊。可惜我“功力”未够,做不了。不知你能做出么?

我来回复

您尚未登录,请登录后再回复。点此登录或注册