1. Computing & Technology

Discuss in my forum

The New Calculator Program

Source Code

By , About.com Guide

 Public Class NewCalc
   Inherits System.Windows.Forms.Form
   Private Accum As String
   Private NumQueue As New Queue
   Private OpQueue As New Queue
 #Region " Windows Form Designer generated code "
 
   Private Sub op_Click( _
   ByVal sender As System.Object, _
   ByVal e As System.EventArgs) _
   Handles opplus.Click, opminus.Click, _
     opmult.Click, opdivide.Click
     OpQueue.Enqueue(sender.tag)
     NumQueue.Enqueue(Accum)
     Accum = ""
   End Sub
 
   Private Sub opequals_Click( _
     ByVal sender As Object, _
     ByVal e As System.EventArgs) _
     Handles opequals.Click
     Dim CurrentOp As String
     Dim Num1, Num2 As Double
     NumQueue.Enqueue(Accum)
     Try
       Num1 = CDbl(NumQueue.Dequeue)
       Num2 = CDbl(NumQueue.Dequeue)
       Do
         CurrentOp = OpQueue.Dequeue
         Select Case CurrentOp
           Case "Divide"
             If Num2 <> 0 Then
               Num1 /= CDbl(Num2)
             Else
               CalcPadDisplay.Text = _
               "Divide By Zero"
               Exit Sub
             End If
           Case "Multiply"
             Num1 *= CDbl(Num2)
           Case "Add"
             Num1 += CDbl(Num2)
           Case "Subtract"
             Num1 -= CDbl(Num2)
         End Select
         If NumQueue.Count = 0 Then Exit Do
         Num2 = NumQueue.Dequeue
       Loop
       CalcPadDisplay.Text = CStr(Num1)
       Accum = ""
     Catch
       OpQueue.Clear()
       NumQueue.Clear()
       Accum = ""
       CalcPadDisplay.Text = "0"
       Exit Sub
     End Try
   End Sub
 
   Private Sub keyClick( _
     ByVal sender As System.Object, _
     ByVal e As System.EventArgs) _
     Handles key1.Click, key2.Click, key3.Click, _
         key4.Click, key5.Click, key6.Click, _
         key7.Click, key8.Click, key9.Click, _
         key0.Click, keydecimal.Click
     If InStr(Accum, ".") <> 0 Then
       Exit Sub
     End If
     If Len(Accum) = 0 Then
       ' First keypress
       Accum = sender.tag
     Else
       ' Second or later keypress
       Accum &= sender.tag
     End If
     CalcPadDisplay.Text = Accum
   End Sub
 
   Private Sub opclear_Click( _
   ByVal sender As Object, _
   ByVal e As System.EventArgs) _
   Handles opclear.Click, opclearentry.Click
     CalcPadDisplay.Text = "0"
     Accum = ""
     If sender.tag = "Clear" Then
       OpQueue.Clear()
       NumQueue.Clear()
     End If
   End Sub
 End Class
 

Thanks to an About Visual Basic reader for correcting a bug that was causing continued calculations, such as ((12 * 3) - 2), from being calculated correctly.

©2012 About.com. All rights reserved.

A part of The New York Times Company.