主题:[讨论]教你用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
第四步.显示输入和结果,边界检查,溢出,精确到几位
这一步就留给大家去做了
这个问题说来简单,做起来却没那么容易,当然这是对于我们这些不是专业
的人来说了,对于专业的程序员来说这是小菜一牒,废说就少说了,
下面我们就开始来做:
首先是按键,一般的计算器按键是:
(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
第四步.显示输入和结果,边界检查,溢出,精确到几位
这一步就留给大家去做了