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
- vb简单实现运算符优先级的计算器
- C#练习:实现基本计算器功能,考虑运算符优先级
- 使用C语言与栈实现简单多则运算计算器(包括括号优先级运算)
- 简单计算器实现整数运算
- 简单的计算器实现
- 简单计算器的实现
- 简单计算器的实现
- 简单计算器的实现
- 计算器的简单实现
- 简单计算器的实现
- 简单计算器的实现
- 简单计算器的实现
- 简单四则运算计算器的C++实现(含括号和+-*/的优先级判断)
- 运算符的优先级
- 运算符的优先级
- 运算符的优先级
- 运算符的优先级
- 运算符的优先级
- Linux c 算法与数据结构--栈
- Linux C 算法与数据结构 --二叉树
- Redis持久化
- 专题四 第二道题
- Sort tuple or multiple field with operator
- vb简单实现运算符优先级的计算器
- Linux C 数据结构---线性表
- 原生Ajax与jQuery中的ajax操作
- Linux C 数据结构---单向链表
- Linux C 算法分析初步
- 31岁生日当天启程智能硬件机器人领域
- Linux C 数据结构—-循环链表
- [FAQ11862]user版本如何打开root权限
- 关于BETA、RC、ALPHA、Release、GA等版本号的意义