Visual Studio Calculator Code



  1. Visual Studio 2008 Calculator Code
-->

In this tutorial for C#, you'll use Visual Studio to create and run a console app and explore some features of the Visual Studio integrated development environment (IDE) while you do so.

If you haven't already installed Visual Studio, go to the Visual Studio downloads page to install it for free.

Code

If you haven't already installed Visual Studio, go to the Visual Studio downloads page to install it for free.

Calculation commands and tools for VS Code. To install Calculator, do the following steps. Open Visual Studio Code; Open the Quick Open Palette (By default: Ctrl-P).

Create a project

To start, we'll create a C# application project. The project type comes with all the template files you'll need, before you've even added anything!

Visual Basic Calculator: We are going to create a “first program” that will be written in Visual Basic (VB). Our project will be a basic calculator that will teach the logic and provide the code for our calculator. Our instructions will be set up so that the us. Open Visual Studio Code; Open the Quick Open Palette (By default: Ctrl-P) Type ext install calculator; Select the Calculator extension; Select Install; Usage. Select a math expression: The math widget in the status bar will show you the result: You can also use Calculator commands to modify the text directly: Commands. Jan 07, 2018 Best way to learn a programming language is building small programs and gradually increasing the complexity of them (At least that’s my opinion). Creating a Simple Calculator is a good point to start learning. This project is done using Visual Studio Community 2017. In this calculator, we have added five more buttons, they are Sin, Cos, Tan, Log and Ln. The common trigonometric functions in Visual Basic 6 are Sin, Cos, Tan and Atn. A) Sin is the function that computes the value of sine of an angle in radian.

  1. Open Visual Studio 2017.

  2. From the top menu bar, choose File > New > Project.(Alternatively, press Ctrl+Shift+N).

  3. In the left pane of the New Project dialog box, expand C#, and then choose .NET Core. In the middle pane, choose Console App (.NET Core). Then name the file Calculator.

Add a workload (optional)

If you don't see the Console App (.NET Core) project template, you can get it by adding the .NET Core cross-platform development workload. Here's how.

Option 1: Use the New Project dialog box

  1. Choose the Open Visual Studio Installer link in the left pane of the New Project dialog box.

  2. The Visual Studio Installer launches. Choose the .NET Core cross-platform development workload, and then choose Modify.

Option 2: Use the Tools menu bar

  1. Cancel out of the New Project dialog box and from the top menu bar, choose Tools > Get Tools and Features.

  2. The Visual Studio Installer launches. Choose the .NET Core cross-platform development workload, and then choose Modify.

  1. Open Visual Studio 2019.

  2. On the start window, choose Create a new project.

  3. In the Create a new project window, choose C# from the Language list. Next, choose Windows from the Platform list and Console from the project types list.

    After you apply the language, platform, and project type filters, choose the Console Application template, and then choose Next.

    Note

    If you do not see the Console Application template, you can install it from the Create a new project window. In the Not finding what you're looking for? message, choose the Install more tools and features link.

    Then, in the Visual Studio Installer, choose the .NET Core cross-platform development workload.

    After that, choose the Modify button in the Visual Studio Installer. You might be prompted to save your work; if so, do so. Next, choose Continue to install the workload. Then, return to step 2 in this 'Create a project' procedure.

  4. In the Configure your new project window, type or enter Calculator in the Project name box. Then, choose Next.

  5. In the Additional information window, .NET Core 3.1 should already be selected for your target framework. If not, select .NET Core 3.1. Then, choose Create.

    Visual Studio opens your new project, which includes default 'Hello World' code.

Create the app

First, we'll explore some basic integer math in C#. Then, we'll add code to create a basic calculator. After that, we'll debug the app to find and fix errors. And finally, we'll refine the code to make it more efficient.

Explore integer math

Let's start with some basic integer math in C#.

  1. In the code editor, delete the default 'Hello World' code.

    Specifically, delete the line that says, Console.WriteLine('Hello World!');.

  2. In its place, type the following code:

    Notice that when you do so, the IntelliSense feature in Visual Studio offers you the option to autocomplete the entry.

    Note

    The following animation isn't intended to duplicate the preceding code. It's intended only to show how the autocomplete feature works.

  3. Choose the green Start button next to Calculator to build and run your program, or press F5.

    A console window opens that reveals the sum of 42 + 119, which is 161.

  4. (Optional) You can change the operator to change the result. For example, you can change the + operator in the int c = a + b; line of code to - for subtraction, * for multiplication, or / for division. Then, when you run the program, the result changes, too.

  5. Close the console window.

Add code to create a calculator

Let's continue by adding a more complex set of calculator code to your project.

  1. Delete all the code you see in the code editor.

  2. Enter or paste the following new code into the code editor:

  3. Choose Calculator to run your program, or press F5.

    A console window opens.

  4. View your app in the console window, and then follow the prompts to add the numbers 42 and 119.

    Your app should look similar to the following screenshot:

Add functionality to the calculator

Let's tweak the code to add further functionality.

Add decimals

The calculator app currently accepts and returns whole numbers. But, it will be more precise if we add code that allows for decimals.

As in the following screenshot, if you run the app and divide number 42 by the number 119, your result is 0 (zero), which isn't exact.

Let's fix the code so that it handles decimals.

  1. Press Ctrl + H to open the Find and Replace control.

  2. Change each instance of the int variable to float.

    Make sure that you toggle Match case (Alt+C) and Match whole word (Alt+W) in the Find and Replace control.

  3. Run your calculator app again and divide the number 42 by the number 119.

    Notice that the app now returns a decimal numeral instead of zero.

However, the app produces only a decimal result. Let's make a few more tweaks to the code so that the app can calculate decimals too.

  1. Use the Find and Replace control (Ctrl + H) to change each instance of the float variable to double, and to change each instance of the Convert.ToInt32 method to Convert.ToDouble.

  2. Run your calculator app and divide the number 42.5 by the number 119.75.

    Notice that the app now accepts decimal values and returns a longer decimal numeral as its result.

    (We'll fix the number of decimal places in the Revise the code section.)

Debug the app

We've improved on our basic calculator app, but it doesn't yet have fail safes in place to handle exceptions, such as user input errors.

For example, if you try to divide a number by zero, or enter an alpha character when the app expects a numeric character (or vice versa), the app might stop working, return an error, or return an unexpected nonnumeric result.

Let's walk through a few common user input errors, locate them in the debugger if they appear there, and fix them in the code.

Tip

For more information about the debugger and how it works, see the First look at the Visual Studio debugger page.

Visual Studio Calculator Code

Fix the 'divide by zero' error

When you try to divide a number by zero, the console app might freeze and then show you what's wrong in the code editor.

Note

Sometimes, the app doesn't freeze and the debugger won't show a divide-by-zero error. Instead, the app might return an unexpected nonnumeric result, such as an infinity symbol. The following code fix still applies.

Let's change the code to handle this error.

  1. Delete the code that appears directly between case 'd': and the comment that says // Wait for the user to respond before closing.

  2. Replace it with the following code:

    After you add the code, the section with the switch statement should look similar to the following screenshot:

Now, when you divide any number by zero, the app will ask for another number. Even better: It won't stop asking until you provide a number other than zero.

Fix the 'format' error

If you enter an alpha character when the app expects a numeric character (or vice versa), the console app freezes. Visual Studio then shows you what's wrong in the code editor.

To fix this error, we must refactor the code that we've previously entered.

Revise the code

Rather than rely on the program class to handle all the code, we'll divide our app into two classes: Calculator and Program.

The Calculator class will handle the bulk of the calculation work, and the Program class will handle the user interface and error-capturing work.

Let's get started.

  1. Delete everything in the Calculator namespace between its opening and closing braces:

  2. Next, add a new Calculator class, as follows:

  3. Then, add a new Program class, as follows:

  4. Choose Calculator to run your program, or press F5.

  5. Follow the prompts and divide the number 42 by the number 119. Your app should look similar to the following screenshot:

    Notice that you have the option to enter more equations until you choose to close the console app. And, we've also reduced the number of decimal places in the result.

Close the app

  1. If you haven't already done so, close the calculator app.

  2. Close the Output pane in Visual Studio.

  3. In Visual Studio, press Ctrl+S to save your app.

  4. Close Visual Studio.

Code complete

During this tutorial, we've made a lot of changes to the calculator app. The app now handles computing resources more efficiently, and it handles most user input errors.

Here's the complete code, all in one place:

Next steps

Continue with more tutorials:

Continue with the second part of this tutorial:

See also

Before VB.Net arrived in 2002, the highly popular Visual Basic 6 provided programmers with the ability to create what were known as control arrays. In real terms, a control array was actually a collection of controls that could be programmed as an array thanks to some fairly complex behind-the-scenes code provided by Microsoft.

Like other array variables, each member of a control array had an array subscript by which it could be referenced. If one button in an array of button controls was clicked, the control's array subscript was passed to the event handler, which would determine which button had been clicked and take the required action for that button.

From the programmer's point of view, the ability to create control arrays at design time by simply copying an existing control and pasting it onto the form as many times as required was an attractive feature of Visual Basic 6.

Microsoft abandoned control arrays with VB.Net, somewhat to the chagrin of a large number of VB6 developers. One of the main complaints was that existing VB6 applications that employed control arrays were difficult to upgrade to VB.Net. Microsoft provided a workaround that involving writing some rather inelegant-looking and complex code in order to create an array of controls at run time. However, since one of the attractions of Visual Basic in the past has been that it is an easy programming language for new programmers to learn, this was not an ideal solution.

Microsoft also provided a number of 'control array compatibility classes' that could be added to the VB.Net toolbox, but at the same time advised developers not to use them as they could not guarantee continued support in future versions of VB.Net. Indeed, Microsoft subsequently declared these classes to be obsolete.

A lively debate ensued between developers over whether or not control arrays should have been omitted from the .Net platform. Many methods were suggested for creating control arrays programmatically, and the subject continued to generate controversy. Ultimately, one had to accept that VB.Net was very different to Visual Basic 6, and adopt a new way of working.

Despite the demise of the control array, it is still possible to manage a related group of objects as if they were members of an array. Although things are no longer quite so straightforward in this respect, Visual Basic now has features that provide more flexibility to the programmer. For example, a control array in Visual Basic 6 could only include controls of one type. By contrast, we can now assign the same event handler to the Click event of any number of controls on a form, even if they are not all of the same type.

The program presented in this section makes use of this feature to enable a single event handler to handle the Click event for all of the button controls for a simple calculator application. The application is very similar to the Standard version of the desktop calculator provided by Microsoft Windows.

To implement the calculator program, proceed as follows:

  1. Open a new project called 'Calculator' and create an interface like the one illustrated below.
  1. Set the control names and other properties as shown in the table below.

Calculator Form Controls
ControlNameAdditional Properties
FormfrmCalculatorSize: 240, 300
Text: 'Calculator'
LabellblDisplayLocation: 12, 9
AutoSize: False
Size: 199, 45
BackColor: White
BorderStyle: Fixed3D
Font: Courier New, 12pt, style=Bold
TextAlign: BottomRight
LabellblSuperScriptLocation: 17, 10
AutoSize: False
Size: 189, 20
BackColor: White
BorderStyle: None
Font: Courier New, 8.25pt
TextAlign: MiddleRight
LabellblMemStatusLocation: 17, 35
AutoSize: False
Size: 16, 20
BackColor: White
BorderStyle: None
Text: 'M'
Font: Courier New, 12pt
TextAlign: MiddleRight
Visible: False
ButtoncmdMemClearLocation: 12, 69
Size: 35, 25
Text: 'MC'
TextAlign: MiddleCenter
TabIndex: 24
ButtoncmdMemRecallLocation: 53, 69
Size: 35, 25
Text: 'MR'
TextAlign: MiddleCenter
TabIndex: 25
ButtoncmdMemSaveLocation: 94, 69
Size: 35, 25
Text: 'MS'
TextAlign: MiddleCenter
TabIndex: 23
ButtoncmdMemPlusLocation: 135, 69
Size: 35, 25
Text: 'M+'
TextAlign: MiddleCenter
TabIndex: 26
ButtoncmdMemMinusLocation: 176, 69
Size: 35, 25
Text: 'M-'
TextAlign: MiddleCenter
TabIndex: 27
ButtoncmdBSLocation: 12, 100
Size: 35, 25
Text: '←'
TextAlign: MiddleCenter
TabIndex: 11
ButtoncmdClearEntryLocation: 53, 100
Size: 35, 25
Text: 'CE'
TextAlign: MiddleCenter
TabIndex: 22
ButtoncmdClearAllLocation: 94, 100
Size: 35, 25
Text: 'C'
TextAlign: MiddleCenter
TabIndex: 21
ButtoncmdChangeSignLocation: 135, 100
Size: 35, 25
Text: '±'
TextAlign: MiddleCenter
TabIndex: 16
ButtoncmdSqrRootLocation: 176, 100
Size: 35, 25
Text: '√'
TextAlign: MiddleCenter
TabIndex: 17
Buttoncmd07Location: 12, 131
Size: 35, 25
Text: '7'
TextAlign: MiddleCenter
TabIndex: 7
Buttoncmd08Location: 53, 131
Size: 35, 25
Text: '8'
TextAlign: MiddleCenter
TabIndex: 8
Buttoncmd09Location: 94, 131
Size: 35, 25
Text: '9'
TextAlign: MiddleCenter
TabIndex: 9
ButtoncmdDivLocation: 135, 131
Size: 35, 25
Text: '/'
TextAlign: MiddleCenter
TabIndex: 15
ButtoncmdPercentLocation: 176, 131
Size: 35, 25
Text: '%'
TextAlign: MiddleCenter
TabIndex: 19
Buttoncmd04Location: 12, 162
Size: 35, 25
Text: '4'
TextAlign: MiddleCenter
TabIndex: 4
Buttoncmd05Location: 53, 162
Size: 35, 25
Text: '5'
TextAlign: MiddleCenter
TabIndex: 5
Buttoncmd06Location: 94, 162
Size: 35, 25
Text: '6'
TextAlign: MiddleCenter
TabIndex: 6
ButtoncmdMulLocation: 135, 162
Size: 35, 25
Text: '*'
TextAlign: MiddleCenter
TabIndex: 14
ButtoncmdInvLocation: 176, 162
Size: 35, 25
Text: '1/x'
TextAlign: MiddleCenter
TabIndex: 18
Buttoncmd01Location: 12, 193
Size: 35, 25
Text: '1'
TextAlign: MiddleCenter
TabIndex: 1
Buttoncmd02Location: 53, 193
Size: 35, 25
Text: '2'
TextAlign: MiddleCenter
TabIndex: 2
Buttoncmd03Location: 94, 193
Size: 35, 25
Text: '3'
TextAlign: MiddleCenter
TabIndex: 3
ButtoncmdMinLocation: 135, 193
Size: 35, 25
Text: '-'
TextAlign: MiddleCenter
TabIndex: 13
ButtoncmdEqualsLocation: 176, 193
Size: 35, 57
Text: '='
TextAlign: MiddleCenter
TabIndex: 20
Buttoncmd00Location: 12, 225
Size: 76, 25
Text: '0'
TextAlign: MiddleCenter
TabIndex: 0
ButtoncmdDecimalLocation: 94, 225
Size: 35, 25
Text: '.'
TextAlign: MiddleCenter
TabIndex: 10
ButtoncmdAddLocation: 135, 225
Size: 35, 25
Text: '+'
TextAlign: MiddleCenter
TabIndex: 12

  1. In the code editor, add the following program statements to the frmCalculator class declaration:

Dim inputLength As Integer
Dim charLimit As Integer = 16
Dim opFlag As Boolean = False
Dim eqFlag As Boolean = False
Dim funcFlag As Boolean = False
Dim firstTerm, secondTerm, memory As Double
Dim activeOp As Integer = 0
Dim lastOp As Integer = 0
Dim startFlag As Boolean = False
Dim opCharArray() As Char = {', '+', '-', '*', '/'}

For practical reasons, the number of digits that the calculator can display is limited to a maximum of eighteen characters, including any decimal point and a leading zero. The integer variables charLimit and inputLength are used to keep track of the number of characters allowed for the current input string, and the number of characters entered by the user, at any given time. The Boolean variables opFlag, eqFlag and funcFlag are used to determine whether the user has clicked on any of the operator buttons ('+', '-', '*', or '/'), the equals button ('='), or a function button ('±', '', '1/x' or '%').

Double-precision floating point variables are used to store numeric input and results. In an ongoing calculation, the number currently being entered by the user is stored in the variable secondTerm, and any value held in memory is stored in the variable memory. The integer variables activeOp and lastOp store numeric references to the operator most recently clicked and the operator previously clicked, if applicable.

The addition, subtraction, multiplication and division operators are referenced by the integer values 1, 2, 3 and 4 respectively. The Boolean variable startFlag is set to True if a number has been entered and an operator button has been pressed, to indicate that a calculation is in progress and that a value has been assigned to firstTerm. The character array variable opCharArray() simply holds the operator symbols that will be displayed by the program when an operator button is clicked.

The program has only one event handler - cmdButton_Click() - that is invoked when the user clicks on any of the calculator buttons. There are a number of subroutines that must be created first, however. The code for these procedures is given below, and should be entered as shown somewhere within the form's class definition. The first procedure is numClick().


The numClick() procedure:

Sub numClick(index As Integer)
If opFlag = True Then
If index = 11 Then
Beep()
Exit Sub
Else
lblDisplay.Text = '
opFlag = False
End If
End If
If eqFlag = True Then
eqFlag = False
lblDisplay.Text = '
End If
If funcFlag = True Then
funcFlag = False
lblDisplay.Text = '
End If
inputLength = Len(lblDisplay.Text)
If index = 11 Then
Dim strLen = Len(lblDisplay.Text)
If strLen > 1 Then
lblDisplay.Text = Mid(lblDisplay.Text, 1, strLen - 1)
Else
lblDisplay.Text = '0'
End If
Exit Sub
End If
If index = 10 Then
If InStr(1, lblDisplay.Text, '.') = 0 Then
lblDisplay.Text &= '.'
If Microsoft.VisualBasic.Left (lblDisplay.Text, 1) = '0' Then
charLimit = 18
Else
charLimit = 17
End If
End If
Exit Sub
End If
If inputLength >= charLimit Then
Exit Sub
ElseIf inputLength = 1 Then
If lblDisplay.Text = '0' Then
If index = 0 Then
Exit Sub
Else
lblDisplay.Text = index
End If
Else
lblDisplay.Text &= index
End If
Else
lblDisplay.Text &= index
End If
End Sub

The numClick() subroutine is called whenever a numerical button, the decimal point or the backspace key is clicked on the calculator. The opening If . . . End If code block checks to see whether the previous click was an operator button (in which case the opFlag variable will be True). If so, a backspace at this point would be inappropriate.

Visual Studio Calculator Code

The nested If . . . Else . . . End If block checks to see whether the current click is a backspace. If so, the program will issue an audible beep and exit the subroutine. Otherwise, it will clear the lblDisplay control's text and set opFlag to False.

The next If . . . End If block checks to see whether the previous click was the equals key (in which case the eqFlag variable will be True). If so, the program would have completed a calculation and be ready for the next operation. The lblDisplay control's text will be cleared and eqFlag set to False. A similar situation arises if a function key has just been clicked, so the third If . . . End If block checks to see whether the previous click was a function key (in which case the funcFlag variable will be True). If so, the main text window will be cleared and funcFlag set to False.

If the preceding conditional statements do not apply, then either the last button clicked (if any) was a numeric key, a decimal point or a backspace (or the input was cleared). The next line of code sets the inputLength variable to the length of the text currently displayed in the main section of the output window. The next If . . . End If block after this statement checks for a Backspace key click (index = 11).

If this is the case, a nested If . . . Else . . . End If block checks to see whether inputLength is greater than 1. If so, the last character added to the lblDisplay control's text is removed (the Mid() string function is used to achieve this). Otherwise (since the input would effectively now be cleared), the lblDisplay control's text is set to '0'.

The next If . . . End If block checks for a decimal point key click (index = 10). A nested If . . . End If block checks to see if a decimal point already exists in the lblDisplay control's text. If so, no action will be taken and the code exits the subroutine. Otherwise, a decimal point is added to the control's text and a nested If . . . Else . . . End If block checks to see whether the leftmost character in the string is a zero. If so, the charLimit variable is set to 18, otherwise it is set to 17 (the string is allowed to contain up to sixteen significant digits, not including a decimal point or a leading zero).

The final If . . . Else . . . End If block checks to see if inputLength has reached or exceeded the current value of charLimit, and if so exits the subroutine. Otherwise the code checks to see if inputLength is 1. If not, the digit for the key that was clicked is appended to the lblDisplay control's text. If inputLength is equal to 1 but the existing digit is not zero, the same thing happens. If the existing digit is zero, the same thing still happens unless the input key itself was also zero. If this occurs, the code exits the subroutine.

The next procedure we shall write is opClick().


The opClick() procedure:

Sub opClick(index As Integer)
If opFlag = True Then
lastOp = index
lblSuperScript.Text = lblDisplay.Text & ' ' & opCharArray(index)
Exit Sub
Else
opFlag = True
activeOp = lastOp
lastOp = index
If startFlag = False Then
firstTerm = CDbl(lblDisplay.Text)
startFlag = True
Else
secondTerm = CDbl(lblDisplay.Text)
Select Case activeOp
Case 1
firstTerm += secondTerm
Case 2
firstTerm -= secondTerm
Case 3
firstTerm *= secondTerm
Case 4
firstTerm /= secondTerm
End Select
lblDisplay.Text = firstTerm
End If
lblSuperScript.Text = lblDisplay.Text & ' ' & opCharArray(index)
End If
End Sub

The opClick() subroutine is called each time the user clicks on an operator button and accepts the index value assigned by the cmdButton_Click() event handler (1, 2, 3 or 4) as its argument. If no operator is currently active, the opFlag variable is set to True, and lastOp is set to the index value.

If startFlag is set to False (which will be the case if this is the first operator that has been invoked in the current calculation), then the firstTerm variable is set to the value obtained by converting the lblDisplay control's text to a double-precision floating point value, and startFlag is set to True. Otherwise, the value of the conversion is assigned to the secondTerm variable, and the activeOp variable is assessed using a Select Case block.

Depending on the value of activeOp, the value of firstTerm is modified by adding or subtracting the value of secondTerm from it, multiplying it by secondTerm, or dividing it by secondTerm. The lblDisplay control's text is then set to the text representation of the current value of firstTerm. Finally, the lblSuperscript control's text is set to the same value as the lblDisplay control's text, followed by a space, followed by the character that represents the operator key clicked by the user.

The next procedure is funcClick(), which is (thankfully!) somewhat shorter.


The funcClick() procedure:

Sub funcClick(index As Integer)
Select Case index
Case 1
lblDisplay.Text = -CDbl(lblDisplay.Text)
funcFlag = True
Case 2
lblDisplay.Text = Math.Sqrt(CDbl(lblDisplay.Text))
funcFlag = True
Case 3
lblDisplay.Text = 1 / CDbl(lblDisplay.Text)
funcFlag = True
Case 4
Dim percentage As Double
percentage = CDbl(lblDisplay.Text)
lblDisplay.Text = firstTerm * percentage / 100
funcFlag = True
End Select
End Sub

The funcClick() subroutine is called whan a user clicks on one of the function keys ('±', '', '1/x' or '%'), and accepts the index value assigned by the cmdButton_Click() event handler (1, 2, 3 or 4) as its argument. A Select Case block is used to determine which of the function keys has been clicked and take the appropriate action.

If the change sign function has been invoked (index value = 1) , the lblDisplay control's text value is converted to a double-precision floating point value, negated, and then re-displayed as the control's text. If the square root function has been invoked, the lblDisplay control's text value is converted to a double-precision floating point value, the Math.Sqrt() function is used to find the square root of the value, and the new value is re-displayed as the lblDisplay control's text.

A similar process occurs for the inverse function, which re-displays the original value as its inverse value (for example, '5' becomes '0.2'). If the percentage key ('%') has been clicked, a local double-precision floating point variable called percentage is declared, and the lblDisplay control's text value is converted to a floating point value and assigned to percentage. The variable firstTerm is then multiplied by percentage and divided by 100. The result is assigned to the lblDisplay control's text property.

The subroutine that provides the final result our our calculation is evaluate ().


The evaluate() procedure:

Sub evaluate()
Dim result As Double
If startFlag = False Then
Exit Sub
Else
activeOp = lastOp
secondTerm = CDbl(lblDisplay.Text)
Select Case activeOp
Case 1
result = firstTerm + secondTerm
Case 2
result = firstTerm - secondTerm
Case 3
result = firstTerm * secondTerm
Case 4
result = firstTerm / secondTerm
End Select
clearAll()
lblDisplay.Text = result
eqFlag = True
End If
End Sub

The evaluate() subroutine first checks whether any operator has been invoked. If not, the code exits the procedure without taking any further action. Otherwise, activeOp is assigned the value of lastOp, and secondTerm is assigned the value represented by the lblDisplay control's text property after it has been converted to a double-precision floating point value.

A Select Case block evaluates activeOp to determine which operator has been invoked, and then applies the operator to firstTerm and secondTerm to calculate the value of result. The clearAll() procedure is then called to clear the display and reset the value of various global variables. Finally, the lblDisplay control's text property is set to display the result of the calculation, and the value of eqFlag is set to True (this is necessary to ensure that any further input is treated as a new calculation).

The final subroutine is clearAll(), which is used to clear the display and do a little housekeeping (essentially, it resets most of the global variables to their initial values, with the notable exception of memory).


The clearAll() procedure:

Sub clearAll()
inputLength = 0
charLimit = 16
opFlag = False
firstTerm = 0
secondTerm = 0
activeOp = 0
lastOp = 0
startFlag = False
lblDisplay.Text = '0'
lblSuperScript.Text = '
End Sub

Visual Studio Calculator Code

The main part of the code is the cmdButton_Click() event handler, which deals with all button clicks made by the user.


The cmdButton_Click() event handler:

Private Sub cmdButton_Click(sender As Object, e As EventArgs) _
Handles cmd00.Click, cmd01.Click, cmd02.Click, cmd03.Click, cmd04.Click, _
cmd05.Click, cmd06.Click, cmd07.Click, cmd08.Click, cmd09.Click, _
cmdDecimal.Click, cmdBS.Click, cmdAdd.Click, cmdMin.Click, cmdMul.Click, _
cmdDiv.Click, cmdChangeSign.Click, cmdSqrRoot.Click, cmdInv.Click, _
cmdPercent.Click, cmdEquals.Click, cmdClearAll.Click, cmdClearEntry.Click, _
cmdMemSave.Click, cmdMemClear.Click, cmdMemRecall.Click, cmdMemPlus.Click, _
cmdMemMinus.Click
Select Case sender.TabIndex
Case 0 To 11
numClick(sender.TabIndex)
Case 12 To 15
opClick(sender.TabIndex - 11)
Case 16 To 19
funcClick(sender.TabIndex - 15)
Case 20
evaluate()
Case 21
clearAll()
Case 22
lblDisplay.Text = '0'
Case 23
memory = CDbl(lblDisplay.Text)
If memory <> 0 Then
lblMemStatus.Visible = True
Else
lblMemStatus.Visible = False
End If
Case 24
memory = 0
lblMemStatus.Visible = False
Case 25
lblDisplay.Text = memory
Case 26
memory += CDbl (lblDisplay.Text)
If memory = 0 Then
lblMemStatus.Visible = False
Else
lblMemStatus.Visible = True
End If
Case 27
memory -= CDbl (lblDisplay.Text)
If memory = 0 Then
lblMemStatus.Visible = False
Else
lblMemStatus.Visible = True
End If
End Select
End Sub

The cmdButton_Click() subroutine begins with a rather long list of events for which it is the handler. The bulk of the code is taken up by a Select Case block that determines which key has been clicked by the user, and takes the appropriate action. Although our collection of calculator buttons does not constitute a control array in Visual Basic 6 terms, it can be handled almost like an array by using the TabIndex property of each button as an array subscript. This requires a certain amount of care on the part of the programmer to ensure that each button has a unique TabIndex property, and that the correct TabIndex number is referenced elsewhere in the code for each button.

The event handler code itself is for the most part relatively simple. For values of sender.TabIndex up to 19, the handler simply calls the appropriate function with the relevant numeric argument. For a sender.TabIndex value of 20, the evaluate() subroutine is called. For a value of 21, the clearAll() subroutine is called, and a value of 22 (the Clear Entry button) resets the value of the lblDisplay control's text to '0'.

The remaining cases (sender.TabIndex values of 23 - 27) all relate to calculator memory operations. For a sender.TabIndex value of 23, the lblDisplay control's text is converted to a double-precision floating point value and stored in the variable memory. If memory is not equal to zero, the lblMemStatus control (which displays the character 'M') becomes visible to indicate that memory contains a non-zero value.

For a value of 23 (the Memory Clear button), memory is set to zero and the lblMemStatus control is hidden once more. For a value of 25 (the Memory Recall button), the lblDisplay control's text is set to the text representation of the value stored in memory. A value of 26 represents the Memory+ button, so the lblDisplay control's text is converted to a double-precision floating point value and added to the value of memory.

Given the possibility that under certain circumstances this could leave the value of memory as zero, an If . . . Else . . . End If block tests to see if memory is zero, and sets the visibility of the lblMemStatus control accordingly. A value of 27 represents the Memory- button, which requires similar handling to the Memory+ button. The only difference is that the lblDisplay control's text is converted to a double-precision floating point value and is subtracted from the value of memory.

Visual Studio 2008 Calculator Code