Calculator in C#

  • In C#
  • Sunday, August 07, 2016
  • 1017 Views

In this tutoral, Basic Calculator in C#, we will look at creating a basic calculator. The calculator will have the following functionality

In this tutoral, Basic Calculator in C#, we will look at creating a basic calculator. The calculator will have the following functionality:

  • Addition
  • Subtraction
  • Division
  • Multiplication
  • Square Root
  • Exponents (Power Of)
  • Clear Entry
  • Clear All

There will be a 2nd tutorial that will cover some more advanced features such as

  • Adding a number to memory
  • Removing a number from memory
  • Calculating with a number in memory
  • Entering numbers by typing

The first thing you need to do is create a new project in Visual Studio (or Visual Basic Express Edition if thats what you use). Once you have created your new project you need to create your user interface, your user interface should look like this:



Your user interface will consist of

  • Buttons 0 through 9
  • Buttons for
    • Addition

    • Subtraction

    • Division

    • Multiplication

    • Exponents (x^)

    • Inverse (1/x)

    • Square Root (sqrt)
  • Decimal
  • Equals
  • Backspace
  • CE (Clear Entry)
  • C (Clear All)
  • ReadOnly TextBox for input (Make sure TabStop is also set to False)

How you setup your user interface is up to you, but remember people are used to a calculator looking a certain way so you may wish to follow my example. In this tutorial I will show you how to code two of the number buttons (since all 10 are the same except the zero button), how to code the calculations buttons, the clear buttons and the backspace buttons. For two of the buttons we will need to use built-in math functions in the .Net Framework:

For the record there are many more members of the System.Math Class located at the online MSDN.

Now, in our calculator we need some Global variables to hold different items and states in our calculator, such as which calculation are we performing, does the input area already have a decimal, whether we can enter values into the input area and to hold values while we perform calculations. Add the following code to the top of your code, this is the global variables we need in our calculator:

01 //variables to hold operands
02 private double valHolder1;
03 private double valHolder2;
04 //Varible to hold temporary values
05 private double tmpValue;
06 //True if "." is use else false
07 private bool hasDecimal = false;
08 private bool inputStatus = true;
09 //variable to hold Operater
10 private string calcFunc;



These variables will be used through out our program thats why they're globals. Now, before any calculations can be done, the user needs to be able to enter numbers into the input box, so lets take a look at how to do that. Since all the number keys in the calculator are the same (except the 0 (zero) key, we'll conver that in a minute) I will code one of the buttons, then you can do the rest. Lets take a look at the number one key:

01 private void cmd1_Click(object sender, System.EventArgs e)
02 {
03     //Check the inputStatus
04     if (inputStatus)
05     {
06         //Its True
07         //Append values to the value
08         //in the input box
09         txtInput.Text += cmd1.Text;
10     }
11     else
12     {
13         //Value is False
14         //Set the value to the value of the button
15         txtInput.Text = cmd1.Text;
16         //Toggle inputStatus to True
17         inputStatus = true;
18     }
19 }



When a user clicks a number button (in this case the number one button) we check the status of the inputStatus flag. If its true then we know we can just append the next value to the end of whats currently in the input box, otherwise we just enter the number into the input box. All the remaining numbers, as stated before, follow this procedure. The zero button slightly different as we don't want the user to be able to enter zero as the first number (this is covered more in the decimal button functionality). So lets take a look at how we code the zero button:

01 private void cmd0_Click(object sender, System.EventArgs e)
02 {
03     //Check the input status
04     if (inputStatus)
05     {
06         //If true
07         //Now check to make sure our
08         //input box has a value
09         if (txtInput.Text.Length >= 1)
10         {
11             //Add our zero
12             txtInput.Text += cmd0.Text;
13         }
14     }
15 }



First we check the status of the inputStatus flag, if its true we know we can enter a number in the box. Here we do a second check, we make sure the length of the text in the input box is at least 1 (it has a value), if so we enter the zero into the input box.

For adding a decimal to our input box we need to first make sure our input box doesn't already contain one, for this we use the hasDecimal global (boolean) variable, then we need to make sure our input box has a value (don't want the user to be able to enter a decimal as the first value). Then we make sure the value in the input area isn't 0 (zero), this we will handle later. 

If all those are true then we enter the decimal then toggle the hasDecimal to True, so the user cant enter a 2nd one. Now, if the input area doesn't have a value, we enter 0., as we assume the user is wanting to work with a decimal value such as 0.5. Lets take a look at the procedure for doing this:

01 private void cmdDecimal_Click(object sender, System.EventArgs e)
02 {
03     //Check for input status (we want true)
04     if (inputStatus)
05     {
06         //Check if it already has a decimal (if it does then do nothing)
07         if (!hasDecimal)
08         {
09             //Check to make sure the length is > than 1
10             //Dont want user to add decimal as first character
11             if (txtInput.Text.Length != 0)
12             {
13                 //Make sure 0 isnt the first number
14                 if (txtInput.Text != "0")
15                 {
16                     //It met all our requirements so add the zero
17                     txtInput.Text += cmdDecimal.Text;
18                     //Toggle the flag to true (only 1 decimal per calculation)
19                     hasDecimal = true;
20                 }
21             }
22             else
23             {
24                 //Since the length isnt > 1
25                 //make the text 0.
26                 txtInput.Text = "0.";
27             }
28         }
29     }
30 }



As you can see, we check all the items mentioned above, if they're True we add the decimal, otherwise we add 0. to the input area.

The first calculation we will look at is addition. The first thing we do here is to make sure the input box has a value (Length > 1). If it does then we check the calcFunc value. The calcFunction variable will be used to tell our CalculateTotals procedure which calculation to perform. Here, if the value is empty (String.Empty) we assign the value of our input box to a variable, valHolder1, which will hold the first part of all calculations, then clear out the input box so the user can enter a 2nd number.

If the calcFunc variable isnt empty then we call our CalculateTotals procedure to display a total to the user. We then assign the value of Add to our variable for the next turn through, then we toggle the hasDecimal flag to False. Now lets take a look at how we accomplished this:

01 private void cmdAdd_Click(object sender, System.EventArgs e)
02 {
03     //Make sure out input box has a value
04     if (txtInput.Text.Length != 0)
05     {
06         //Check the value of our function flag
07         if (calcFunc == string.Empty)
08         {
09             //Flag is empty
10             //Assign the value in our input
11             //box to our holder
12             valHolder1 = System.Double.Parse(txtInput.Text);
13             //Empty the input box
14             txtInput.Text = string.Empty;
15         }
16         else
17         {
18             //Flag isnt empty
19             //Call our calculate totals method
20             CalculateTotals();
21         }
22         //Assign a value to our calc function flag
23         calcFunc = "Add";
24         //Toggle the decimal flag
25         hasDecimal = false;
26     }
27 }



Believe it or not, all the other basic calculation buttons are the same as the Add button, with the exception of what we set calcFunc to. In the other buttons we set this variable to the calculation we want to perform, Subtract,
Divide, Multiply, and so on, so there really isn't a reason to show how that is done since we did the Add button and the others are the same. 

Even though they are the same I'll show the functionality of one more calculation button. This time we will look at the code for the subtraction button. The first thing we do here is to make sure the input box has a value (Length > 1). If it does then we check the calcFunc value. The calcFunction variable will be used to tell our CalculateTotals procedure which calculation to perform. Here, if the value is empty (String.Empty) we assign the value of our input box to a variable, valHolder1, which will hold the first part of all calculations, then clear out the input box so the user can enter a 2nd number.

If our calcFunction isnt empty then we call our CalculateTotals method to perform the calculations. We then assign the value of Subtract to our calcFunc variable so the calculations method will know which calculation to perform. The code for the subtraction button looks like this:

01 private void cmdSubtract_Click(object sender, System.EventArgs e)
02 {
03     //Make sure the input box has a value
04     if (txtInput.Text.Length != 0)
05     {
06         //Check the valueof our calculate function flag
07         if (calcFunc == string.Empty)
08         {
09             //Flag is empty
10             //Assign the value of our input
11             //box to our holder
12             valHolder1 = System.Double.Parse(txtInput.Text);
13             //Empty the input box
14             txtInput.Text = string.Empty;
15         }
16         else
17         {
18             //Flag isnt empty
19             //Call our calculate totals method
20             CalculateTotals();
21         }
22         //assign a value to our
23         //calculate function flag
24         calcFunc = "Subtract";
25         //Toggle the decimal flag
26         hasDecimal = false;
27     }
28 }



Thats how the normal calculation buttons are coded. Now lets say you want to give the user the option to calculate Exponents, 4^2 for example. To code this button you need a couple of checks before doing anything. First we need to check and make sure the input area has a value, if it does then we check to see the value of the calcFunc variable. 

If this is empty, we then convert the value of the input area to a Double and assign it to the valHolder1 variable to hold on to, this will be used for the calculations in the CalculateTotalsprocedure and empth the value from the input area.. If its not empty we directly call the CalculateTotals function as this means the user has already entered 2 numbers.

We then assign the value of PowerOf to our calcFunc variable, this will tell CalculateTotals what calculation to perform, and toggle the hasDecimal flag to False. Lets take a look at how we accomplished all of this:

01 private void cmdPowerOf_Click(object sender, System.EventArgs e)
02 {
03     //Make sure the input box has a value
04     if (txtInput.Text.Length != 0)
05     {
06         //Check if the calcFunc flag is empty
07         if (calcFunc == string.Empty)
08         {
09             //Assign the value of the input box to our variable
10             valHolder1 = System.Double.Parse(txtInput.Text);
11             //Empty the input box
12             //So the user can enter the power of value
13             txtInput.Text = string.Empty;
14         }
15         else
16         {
17             //Call the calculate totals method
18             CalculateTotals();
19         }
20         //Assign our flag the value of "PowerOf"
21         calcFunc = "PowerOf";
22         //Reset the decimal flag
23         hasDecimal = false;
24     }
25 }



Doing a Square Root is somewhat different as it doesn't take 2 values, just the number you want the square root of, so some of the checking required in the other calculations isn't required here. For a Square Root we first check to ensure the input area has a value. If it does have a value we assign the value of the input area, converted to a Double, to our tmpValue variable.

Once we have the value, we call the System.Math.Sqrt Method to perform the calculations on the tmpValue variable. Once this is complete we assign the resulting value to our input area, then toggle the hasDecimal flag to False. Lets take a look at how this is done:

The Equals button is quite simple. Here, we first check to make sure our input area has a value and that our valHolder1 variable isn't a zero (Divide by 0 is a bad thing). If both of these are true we call the CalculateTotals procedure to perform our calculations based on the value of the calcFunc flag. We then clear the value of calcFunc and toggle the hasDecimal flag to False. This is done like this:

01 private void cmdSqrRoot_Click(object sender, System.EventArgs e)
02 {
03     //Make sure the input box has a value
04     if (txtInput.Text.Length != 0)
05     {
06         //Assign our variable the value in the input box
07         tmpValue = System.Double.Parse(txtInput.Text);
08         //Perform the square root
09         tmpValue = System.Math.Sqrt(tmpValue);
10         //Display the results in the input box
11         txtInput.Text =  tmpValue.ToString();
12         //Clear the decimal flag
13         hasDecimal = false;
14     }
15 }



In the last 2 buttons we have looked at how you use the two System.Math Members I mentioned earlier, pretty simple isnt it.

We have 3 more buttons to look at before we look at the CalculateTotals procedure. First we'll look at the backspace button.For the backspace, first we need to make sure the input are has a value. If it does then we retrieve the next to last character and see if its a decimal, if it is we toggle the hasDecimal flag to False. Next we create an Integer variable (loc) to hold the length of the contents in the input area. From there we use Remove, along with loc to remove the last character of the string for each time the user clicks the backspace button.

01 private void cmdBackspace_Click(object sender, System.EventArgs e)
02 {
03     //Declare locals needed
04     string str;
05     int loc;
06     //Make sure the text length is > 1
07     if (txtInput.Text.Length > 0)
08     {
09         //Get the next to last character
10         str = txtInput.Text.Substring(txtInput.Text.Length - 1);
11         //Check if its a decimal
12         if (str == ".")
13         {
14             //If it is toggle the hasDecimal flag
15             hasDecimal = false;
16         }
17         //Get the length of the string
18         loc = txtInput.Text.Length;
19         //Remove the last character, incrementing by 1
20         txtInput.Text = txtInput.Text.Remove(loc - 1, 1);
21     }
22 }



The last 2 buttons I'm going to demonstrate are the CE (Clear entry) and C (Clear all) buttons. These are very simple. First the clear entry button. What we do here is set the value in the input area to empty (String.Empty), and the hasDecimal flag to false.

1 private void cmdClearEntry_Click(object sender, System.EventArgs e)
2 {
3     //Empty the input box
4     txtInput.Text = string.Empty;
5     //Toggle the decimal flag
6     hasDecimal = false;
7 }



The clear all button required a bit more code as we do more with this button. Here we set our 2 holder variables, valHolder1 and valHolder2 to 0 (zero), we then set the calcFunc flag to String.Empty and the hasDecimal flag to False, like this:

01 private void cmdClearAll_Click(object sender, System.EventArgs e)
02 {
03     //Empty the text in the input box
04     txtInput.Text = string.Empty;
05     //Clear out both temp values
06     valHolder1 = 0;
07     valHolder2 = 0;
08     //Set the calc switch to empty
09     calcFunc = string.Empty;
10     //Toggle the hasDecimal flag
11     hasDecimal = false;
12 }



Those are the buttons you need for a Basic calculator. The final thing we're going to look at is the procedure that actually does the calculations, CalculateTotals. Here the first thing we do is set our variable valHolder2 to the current value of the input area. 

We then do a switch(calcFunc) on the value of calcFunc so we know which calculations to perform. We perform our calculations (add, subtract, divide, multiply, exponent, etc) and set the results to the input area so the user can see their results. Finally we set the inputEntry flag to False. This is what this procedure looks like:

01 private void CalculateTotals()
02 {
03     valHolder2 = System.Double.Parse(txtInput.Text);
04     //determine which calculation we're going to execute
05     //by checking the value of calcFunc
06     switch (calcFunc)
07     {
08             //addition
09         case "Add":
10             valHolder1 = valHolder1 + valHolder2;
11             break;
12             //subtraction
13         case "Subtract":
14             valHolder1 = valHolder1 - valHolder2;
15             break;
16             //division
17         case "Divide":
18             valHolder1 = valHolder1 / valHolder2;
19             break;
20             //multiplication
21         case "Multiply":
22             valHolder1 = valHolder1 * valHolder2;
23             break;
24             //exponents (power of)
25         case "PowerOf":
26             valHolder1 = System.Math.Pow(valHolder1, valHolder2);
27             break;
28     }
29     //set our input area to the value of the calculation
30     txtInput.Text = valHolder1.ToString();
31     inputStatus = false;
32 }



NOTE: For the Exponents (Power Of) we use the System.Math.Pow Method for calculating the value.

There are two more buttons in this calculator that we didn't cover, basically due to the length of the tutorial. Those buttons are included in the sample project I'm attaching to this tutorial.

Thats it, thats how you create a basic calculator in C#. I hope you find this tutorial helpful. I am including the project file with this tutorial, but remember this solution is under the GNU GENERAL PUBLIC LICENSE so you may not remove the header from the files or turn this project in as your homework assignment. 

I know I am forced to go with the honor system in this, but if you do just turn this in as your assignment not only will you be cheating, but you will learn nothing, and subsequently wont know enough to become a programmer once you get out of school.

I will be doing a 2nd part to this tutorial where I look at adding more advanced functionality to this calculator, such 
as adding a number to memory, removing a number from memory, calculations with a number in memory and more. 

Thank you for reading!

Attached File  PC_Calculator_CSharp.zip (120.99K) 

 

Source http://www.dreamincode.net/forums/topic/32968-basic-calculator-in-c%23/