当前位置:编程学习 > VB >>

vb 制作简易计算器

功能要求: 1、 能进行加减乘除4种运算 2、 可以清除运行结果 3、 输错的数字可以退格改正
追问:写一下  做这题的感受 遇到什么问题 什么的  谢谢  老师留得作业
答案:初学者的VB计算器

窗体代码如下

Option Explicit

Dim blnStratrOperationFlag As Boolean   '是否开始运算
Dim lngOperationFlag As Long            '运算标志
Dim dblFirstOperationValue As Double    '先前的操作数

Private Sub cmdValuedDecimal_Click(Index As Integer) '数字及小数点

    Select Case Index

        Case 0

        AddTextOperationValue "0"

        Case 1

        AddTextOperationValue "1"

        Case 2

        AddTextOperationValue "2"

        Case 3

        AddTextOperationValue "3"

        Case 4

        AddTextOperationValue "4"

        Case 5

        AddTextOperationValue "5"

        Case 6

        AddTextOperationValue "6"

        Case 7

        AddTextOperationValue "7"

        Case 8

        AddTextOperationValue "8"

        Case 9

        AddTextOperationValue "9"

        Case 10

        AddTextOperationValue "."

    End Select

End Sub

Private Sub AddTextOperationValue(strOperationValue As String)

    If Len(txtOperationValue) > 8 And blnStratrOperationFlag = False Then Exit Sub '判断是否输入数字超过9个

    If txtOperationValue = "0" And strOperationValue = "0" Then Exit Sub           '是否什么也没输入或为0时候输入0则退出

    If lngOperationFlag <> 0 And blnStratrOperationFlag = True Then                '如果有操作符且开始运算为真则

        txtOperationValue = ""
        blnStratrOperationFlag = False

    End If

    If txtOperationValue = "0" And strOperationValue <> "." Then txtOperationValue = "" '头次输入数字

    If Right$(txtOperationValue, 1) = "." And strOperationValue = "." Then Exit Sub     '避免多次输入小数点

    txtOperationValue = txtOperationValue & strOperationValue        '累加字符

End Sub

Private Sub cmdOperation_Click(Index As Integer)  '+ - * / =

    Select Case Index

        Case 0

        lngOperationFlag = 1

        Evaluate

        Case 1

        lngOperationFlag = 2

        Evaluate

        Case 2

        lngOperationFlag = 3

        Evaluate

        Case 3

        lngOperationFlag = 4

        Evaluate

        Case 4

        DisposeResult

    End Select

End Sub

Private Sub Evaluate()      '四则运算赋值

    dblFirstOperationValue = Val(txtOperationValue)

    blnStratrOperationFlag = True
    txtOperationValue = ""

End Sub

Private Sub DisposeResult()  '处理计算结果

    On Error GoTo ToExit     '打开错误陷阱

    Select Case lngOperationFlag  '操作标志

        Case 1

        txtOperationValue = dblFirstOperationValue + Val(txtOperationValue)

        Case 2

        txtOperationValue = dblFirstOperationValue - Val(txtOperationValue)

        Case 3

        txtOperationValue = dblFirstOperationValue * Val(txtOperationValue)

        Case 4

        txtOperationValue = dblFirstOperationValue / Val(txtOperationValue)

    End Select

    lngOperationFlag = 0     '操作标志清0

    Exit Sub

ToExit:

    MsgBox "除数不能为0!", vbOKOnly, "错误"

    Resume Next

End Sub

Private Sub cmdClearAll_Click()        'C按钮清除所有的运算结果

    lngOperationFlag = 0
    txtOperationValue = "0"

End Sub

Private Sub cmdClearLastInput_Click()  'CE按钮清除最后一次输入的数字

    txtOperationValue = "0"

End Sub

Private Sub Form_Unload(Cancel As Integer)

    Set frmCalculator = Nothing

End Sub
其他:这里有篇源码参考
http://wenku.zhaoxi.net/view/b46311c52cc58bd63186bd0f.html 关键你是得先熟悉计算器的计算过程
这要完全做好可不是个简单的事,你参考一下我以前做的一个例子。如果要源代码的话给我邮箱,我把这个例子发给你!

设计时使用了控件数组 cmdnum 0-9 数字
cmdCaculate 0-3 表示+-*/

还用数组记录运算数据,考虑了括号 
布局是在form_load()
 中进行的,如果在窗体中做好了,可以考虑不要部分代码
下面是代码


Private number() As Double, i As Integer
Private strcalculate() As String

Private Sub CALCULATE(strFuhao As String)
If strFuhao = "=" And strcalculate(0, i) = "" Then Exit Sub
Select Case strFuhao '判断当前是什么运算符
Case "+" '刚输入+   ***************************************************************************************************
   strcalculate(1, i) = strFuhao
   Select Case strcalculate(0, i) '判断前面是什么运算
   Case "+"
     number(0, i) = number(0, i) + Val(txtshow.Text)
      txtshow.Text = number(0, i)

   Case "-"
     number(0, i) = number(0, i) - Val(txtshow.Text)
      txtshow.Text = number(0, i)

   Case "*"
     number(0, i) = number(0, i) * Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
     txtshow.Text = number(0, i)

  Case "/"
     number(0, i) = number(0, i) / Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
     txtshow.Text = number(0, i)

  Case Else
     number(0, i) = txtshow.Text

  End Select
Case "-" '刚输入-              *******************************************************************************************
   strcalculate(1, i) = strFuhao
   Select Case strcalculate(0, i) '判断前面是什么运算
   Case "+"
     number(0, i) = number(0, i) + Val(txtshow.Text)
           txtshow.Text = number(0, i)

   Case "-"
     number(0, i) = number(0, i) - Val(txtshow.Text)
           txtshow.Text = number(0, i)

   Case "*"
     number(0, i) = number(0, i) * Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
           txtshow.Text = number(0, i)

  Case "/"
     number(0, i) = number(0, i) / Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
           txtshow.Text = number(0, i)

  Case Else
     number(0, i) = txtshow.Text

  End Select
Case "*" '刚输入*      *******************************************************************************************
  strcalculate(1, i) = strFuhao
  Select Case strcalculate(0, i)
  Case "*"
    number(0, i) = number(0, i) * Val(txtshow.Text)
          txtshow.Text = number(0, i)

  Case "/"
    number(0, i) = number(0, i) / Val(txtshow.Text)
          txtshow.Text = number(0, i)

  Case "+", "-"
    number(1, i) = number(0, i)
    number(0, i) = Val(txtshow.Text)
    strcalculate(2, i) = strcalculate(0, i)
  Case Else
     number(0, i) = Val(txtshow.Text)
    
  End Select
  

Case "/" '刚输入/     *******************************************************************************************
  strcalculate(1, i) = strFuhao
  Select Case strcalculate(0, i)
  Case "*"
    number(0, i) = number(0, i) * Val(txtshow.Text)
    txtshow.Text = number(0, i)

  Case "/"
    number(0, i) = number(0, i) / Val(txtshow.Text)
          txtshow.Text = number(0, i)

  Case "+", "-"
    number(1, i) = number(0, i)
    number(0, i) = Val(txtshow.Text)
    strcalculate(2, i) = strcalculate(0, i)
  Case Else
     number(0, i) = txtshow.Text
    
  End Select


Case "(" '刚输入前括号    *******************************************************************************************
   i = i + 1
   ReDim Preserve number(2, i) As Double
   ReDim Preserve strcalculate(2, i) As String
   txtshow.Text = 0
Case ")"   ' 刚输入后括号 *******************************************************************************************
   Select Case strcalculate(0, i)
   Case "+"
     number(0, i) = number(0, i) + Val(txtshow.Text)
      txtshow.Text = number(0, i)
       i = i - 1 '让数组最后一纬减1
       ReDim Preserve number(2, i) As Double
       ReDim Preserve strcalculate(2, i) As String

   Case "-"
     number(0, i) = number(0, i) - Val(txtshow.Text)
       txtshow.Text = number(0, i)
       i = i - 1 '让数组最后一纬减1
       ReDim Preserve number(2, i) As Double
       ReDim Preserve strcalculate(2, i) As String

   Case "*"
     number(0, i) = number(0, i) * Val(txtshow.Text)
     Select Case strcalculate(2, i)
     Case "+"
       number(0, i) = number(1, i) + number(0, i)
       txtshow.Text = number(0, i)
       i = i - 1 '让数组最后一纬减1
       ReDim Preserve number(2, i) As Double
       ReDim Preserve strcalculate(2, i) As String
     Case "-"
       number(0, i) = number(1, i) - number(0, i)
       txtshow.Text = number(0, i)
       i = i - 1 '让数组最后一纬减1
       ReDim Preserve number(2, i) As Double
       ReDim Preserve strcalculate(2, i) As String
     End Select
  Case Else
     MsgBox "括号里没有表达式!", vbSystemModal + vbInformation, "输入有误码"
     Exit Sub
  End Select

Case "="
   Select Case strcalculate(0, i) '判断前面是什么运算
   Case "+"
     number(0, i) = number(0, i) + Val(txtshow.Text)
           txtshow.Text = number(0, i)

   Case "-"
     number(0, i) = number(0, i) - Val(txtshow.Text)
           txtshow.Text = number(0, i)

   Case "*"
     number(0, i) = number(0, i) * Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
           txtshow.Text = number(0, i)

   Case "/"
     number(0, i) = number(0, i) / Val(txtshow.Text)
     Select Case strcalculate(2, i) '判断乘除法前面有没有加减法要计算,有计算
     Case "+"
        number(0, i) = number(1, i) + number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     Case "-"
        number(0, i) = number(1, i) - number(0, i)
        number(1, i) = 0
        strcalculate(2, i) = ""
     End Select
           txtshow.Text = number(0, i)

   End Select
End Select


strcalculate(0, i) = strcalculate(1, i)

'Case 5
' i = i + 1
' ReDim Preserve number(2, i) As Double
' ReDim Preserve strcalculate(2, i) As Integer
' strcalculate(1, i) = strcalculate(1, i - 1)
' GoTo calc1234


'Case 6




'End Select

'txtshow.Text = number(0, i)
'strcalculate(0, i) = strcalculate(1, i)


End Sub


Private Sub cmdBackspace_Click()
If Len(txtshow.Text) > 1 Then
 txtshow.Text = Left(txtshow.Text, Len(txtshow.Text) - 1)
ElseIf txtshow.Text <> "0" Then
 txtshow.Text = "0"
End If

End Sub

Private Sub cmdC_Click()
  ReDim number(2, 0) As Double
  ReDim strcalculate(2, 0) As String
  txtshow.Text = "0"
  i = 0


End Sub

Private Sub cmdcalculate_Click(Index As Integer)

CALCULATE (cmdcalculate(Index).Caption)

End Sub

Private Sub cmdCE_Click()
txtshow.Text = "0"

End Sub

Private Sub cmdnegative_Click()
txtshow.Text = -Val(txtshow.Text)
number(0, i) = txtshow.Text
End Sub

Private Sub cmdnum_Click(Index As Integer)
  If CStr(number(0, i)) = txtshow.Text Then
     txtshow.Text = "0"
  End If
  If Index = 0 And txtshow.Text = "0" Then
  ElseIf txtshow.Text = "0" Then
      txtshow.Text = Index
  Else
      txtshow.Text = txtshow.Text & Index
  End If
  
End Sub

Private Sub cmdparentheses_Click(Index As Integer)
CALCULATE (cmdparentheses(Index).Caption)
Dim intkuohao As Integer
Dim strkuohao As String
For intkuohao = 1 To i
  strkuohao = strkuohao & " ("
Next intkuohao
Label1.Caption = strkuohao
Label1.Refresh

End Sub

Private Sub cmdpoint_Click()
 If InStr(txtshow.Text, ".") = 0 Then txtshow.Text = txtshow.Text & "."
End Sub



Private Sub cmdResult_Click()
  If i = 0 Then
    For intkuohao = i To 1 Step -1
       CALCULATE (")")
    Next intkuohao
  
  End If
  CALCULATE (cmdResult.Caption)
  ReDim strcalculate(2, 0) As String
  ReDim number(2, 0) As Double
  i = 0
  
End Sub

Private Sub Form_Load()
Dim intwidth As Integer, intheight As Integer
intwidth = cmdnum(0).Width + 50
intheight = cmdnum(0).Height + 50


For i = 1 To 9
  cmdnum(i).Caption = i
  cmdnum(i).Move cmdnum(0).Left + intwidth * ((i - 1) Mod 3), cmdnum(0).Top - intheight * ((i - 1) \ 3) - intheight
Next i
For i = 0 To 3
  cmdcalculate(i).Move cmdnum(9).Left + intwidth, cmdnum(9).Top + intheight * i
Next i
cmdnegative.Move cmdnum(0).Left + intwidth, cmdnum(0).Top
cmdpoint.Move cmdnum(0).Left + intwidth * 2, cmdnum(0).Top
cmdCE.Move cmdnum(0).Left + intwidth * 2, cmdnum(0).Top - 4 * intheight
cmdC.Move cmdnum(0).Left + intwidth * 3, cmdnum(0).Top - 4 * intheight
cmdResult.Move cmdnum(0).Left + intwidth * 4, cmdnum(0).Top - 4 * intheight
cmdBackspace.Move cmdnum(0).Left + intwidth * 4, cmdnum(0).Top - 2 * intheight
For i = 0 To 1
  cmdparentheses(i).Move cmdnum(0).Left + i * intwidth, cmdnum(0).Top - 4 * intheight
Next i

txtshow.Move cmdnum(0).Left, cmdnum(7).Top - 3 * intheight, 5 * intwidth
Label1.Move cmdnum(0).Left, cmdnum(7).Top - 3 * intheight - Label1.Height, 5 * intwidth

txtshow.Text = "0"

i = 0
ReDim strcalculate(2, i) As String
ReDim number(2, i) As Double

End Sub

上一个:跪求一个VB小游戏的代码,如俄罗斯方块,贪吃蛇等,本人初学者504977685@qq.com,
下一个:昨晚下面关于vb的题目的,我再加50!

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,