vb简单实现运算符优先级的计算器

来源:互联网 发布:手机还原软件 编辑:程序博客网 时间:2024/05/19 15:23

尝试写了一个计算器,VB大作业。从来没有接触过vb语言,只能硬着头皮上了。所幸窗体设计与C#相似。

设计了一个非常简易的计算器(其中利用栈实现了运算符优先级)

【界面如下】


组成包括Label控件2个,其中一个用来显示数学表达式,一个显示当前操作数字;

按钮17个,分别为10个数字0~9,小数点,四则运算按钮,等号按钮,清零按钮;

 

【设计思路】

一开始实现的是只能操作一个运算符:比如输入5+9+6,再按等号输出的是15;

后来想要实现连续运算的功能,就利用栈数据结构,把算术符号的优先级考虑进去。


【原理】


【实现逻辑】

1.       构建两个栈,符号栈和数据栈,利用数组实现,满足先进后出;

2.       界面按钮控件点击事件:

1)     数字:0 <限制不能在首位输入多个0>

2)     数字:1-9 <在label上显示>

3)     小数点 <不能连续输入多个小数点,输入小数点后将该空间可编辑状态设置false,点击其他按钮后恢复true>

4)     运算符号:

a)     获取XS当前数据,将数据压入数据栈

b)     将符号压入符号栈

注:符号栈push子过程中设置循环判断优先级过程,即将置入的符号优先级大于栈顶元素,则跳出循环,压入栈;优先级不大于时,则pop数据栈两个元素与符号栈栈顶元素运算,结果压入数据栈,再判断符号优先级。

5)     清零:初始化(label显示归零——栈清空——将#压入符号栈)

6)     等号:

a)     获取XS当前数据,将数据压入数据栈

b)     判断符号栈栈顶元素是否为零,运算剩余数据

c)      得到最终结果显示在XS上,由于得数为-1到1之间不显示小数点前面的0所以额外加分支

d)     计算3.2*0.8/0.4得到6.400001,这个问题主要是由于浮点数的计算是以2进制计算,加减乘除丢失精度,因此我采取的操作是保留四位小数这样简单粗暴的方法;在网上搜到一篇文章,和这个问题相关:《JavaScript数字精度丢失问题总结》http://www.cnblogs.com/snandy/p/4943138.html

e)     初始化

【代码如下】

Private Sub Form_Initialize()Erase fuhaofuhao(0) = 0fuhaopointer = 1Erase shujushujupointer = 0End SubDim n As Integer 'n=1已经写入数据,n=2结束运算,n=0继续输入数字;Dim m As Integer 'm=运算符种类0#1+2-3*4/Dim a As Single 'a,b读入的前后数据Dim b As SingleDim ab As Single 'ab保存运算后数据Dim dy As String '-1到1之间的数不显示前面的零Dim fuhao(20) As Integer '符号栈Dim fuhaopointer As Long '符号栈长度Dim shuju(30) As Single '数据栈Dim shujupointer As Long '数据栈长度Function gettop() As Integer '获取栈顶符号gettop = fuhao(fuhaopointer - 1)End FunctionFunction fuhaopop() As Integer '运算符出栈fuhaopop = fuhao(fuhaopointer - 1)fuhaopointer = fuhaopointer - 1End FunctionFunction shujupop() As Single '数据出栈shujupop = shuju(shujupointer - 1)shujupointer = shujupointer - 1End FunctionPublic Function result(a As Single, b As Single, m As Integer) As Single '计算If m = 1 Thenresult = a + bElseIf m = 2 Thenresult = a - bElseIf m = 3 Thenresult = a * bElseIf m = 4 Thenresult = a / bEnd IfEnd FunctionPublic Function first(m1 As Integer, m2 As Integer) As Boolean '判断优先级,m1栈顶元素,m2即将入栈元素If m1 = 0 Thenfirst = TrueElseIf m2 = 1 Or m2 = 2 Thenfirst = FalseElseIf m1 = 1 Or m1 = 2 Thenfirst = TrueElsefirst = FalseEnd IfEnd FunctionSub shujupush(number As Single)  '堆栈溢出结束过程If stackpointer > 30 ThenExit SubEnd Ifshuju(shujupointer) = numbershujupointer = shujupointer + 1End SubSub fuhaopush(number As Integer)  '堆栈溢出结束过程If fuhaopointer > 20 ThenExit SubEnd IfWhile first(gettop, number) = Falseb = shujupopa = shujupopm = fuhaopopshujupush (result(a, b, m))Wendfuhao(fuhaopointer) = numberfuhaopointer = fuhaopointer + 1End SubPrivate Sub Command1_Click() '清零XS.Caption = "0"screen.Caption = ""n = 0Command14.Enabled = TrueErase fuhaofuhao(0) = 0fuhaopointer = 1Erase shujushujupointer = 0End SubPrivate Sub Command10_Click() '除号a = Val(XS.Caption)shujupush (a)n = 1m = 4fuhaopush (m)Command14.Enabled = Truescreen.Caption = screen.Caption + "/"End SubPrivate Sub Command14_Click() '.小数点 screen.Caption = screen.Caption + "."If n >= 1 Then XS.Caption = "0"n = 0XS.Caption = XS.Caption + "."Command14.Enabled = FalseEnd SubPrivate Sub Command2_Click() '7screen.Caption = screen.Caption + "7"If n >= 1 Then XS.Caption = ""n = 0If XS.Caption = "0" ThenXS.Caption = "7"ElseXS.Caption = XS.Caption + "7"End IfEnd SubPrivate Sub Command18_Click() '=screen.Caption = screen.Caption + "="Command14.Enabled = Trueb = Val(XS.Caption)shujupush (b)While gettop <> 0b = shujupopa = shujupopm = fuhaopopshujupush (result(a, b, m))Wendab = shujupopIf ab > 0 And ab < 1 Thendy = abXS.Caption = "0" + Format(dy, ".####")ElseIf ab > -1 And ab < 0 Thendy = -abXS.Caption = "-0" + Format(dy, ".####")ElseIf Fix(ab) = ab ThenXS.Caption = abElseXS.Caption = Format(ab, ".####")End Ifn = 2Erase fuhaofuhao(0) = 0fuhaopointer = 1Erase shujushujupointer = 0End Sub


0 1
原创粉丝点击