C# language, Calculator

2019-07-23 23:45发布

问题:

Hello everyone and thanks for helping me.

I made this calculator in C# and i got one problem. When i add something like 5+5+5 it gives me correct result but when i want to substract more than two number and also divide or multiply more than two number i don't get correct result.

Do you know what i am doing wrong,

Thank you very much!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace calculator
{
    public partial class Calculator : Form
    {
        public Calculator()
        {
            InitializeComponent();
        }

        private void btnOne_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnOne.Text;
            //txtDisplay.Text = btnOne.Text;
        }

        private void btnTwo_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnTwo.Text;
        }

        private void btnThree_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnThree.Text;
        }

        private void btnFour_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnFour.Text;
        }

        private void btnFive_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnFive.Text;
        }

        private void btnSix_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnSix.Text;
        }

        private void btnSeven_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnSeven.Text;
        }

        private void btnEight_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnEight.Text;
        }

        private void btnNine_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnNine.Text;
        }

        private void btnZero_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnZero.Text;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtDisplay.Clear();
        }

        private void btnPoint_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + ",";
        }


        double total1 = 0;
        double total2 = 0;

        bool plusButtonClicked = false;
        bool minusButtonClicked = false;
        bool divideButtonClicked = false;
        bool multiplyButtonClicked = false;

        private void btnPlus_Click(object sender, EventArgs e)
        {
            plusButtonClicked = true;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = false;

            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();
        }

        private void btnMinus_Click(object sender, EventArgs e)
        {
            plusButtonClicked = false;
            minusButtonClicked = true;
            divideButtonClicked = false;
            multiplyButtonClicked = false;

            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();
        }



        private void btnDivide_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = true;
            multiplyButtonClicked = false;
        }

        private void btnMultiply_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = true;
        }



        private void btnEquals_Click(object sender, EventArgs e)
        {

            if (plusButtonClicked == true)
            {
                total2 = total1 + double.Parse(txtDisplay.Text);
            }

            else if (minusButtonClicked == true)
            {
                total2 = total1 - double.Parse(txtDisplay.Text);
            }

            else if (divideButtonClicked == true)
            {
                total2 = total1 / double.Parse(txtDisplay.Text);
            }

            else if (multiplyButtonClicked == true)
            {
                total2 = total1 * double.Parse(txtDisplay.Text);
            }


            txtDisplay.Text = total2.ToString();
            total1 = 0;
        }




    }
}

回答1:

This code is has not been thoroughly tested. Why don't you try something like the following:

using System;
using System.Windows.Forms;

namespace Calculator
{
    public enum Operator
    {
        None,
        Add,
        Minus,
        Divide,
        Multiply
    }

    public partial class Calculator : Form
    {
        private double total = 0;
        private double currentValue = 0;
        private Operator currentOperator;

        public Calculator()
        {
            InitializeComponent();
        }

        private void btnOne_Click(object sender, EventArgs e)
        {
            ShowInput(btnOne.Text);
        }

        private void btnTwo_Click(object sender, EventArgs e)
        {
            ShowInput(btnTwo.Text);
        }

        private void btnThree_Click(object sender, EventArgs e)
        {
            ShowInput(btnThree.Text);
        }

        private void btnFour_Click(object sender, EventArgs e)
        {
            ShowInput(btnFour.Text);
        }

        private void btnFive_Click(object sender, EventArgs e)
        {
            ShowInput(btnFive.Text);
        }

        private void btnSix_Click(object sender, EventArgs e)
        {
            ShowInput(btnSix.Text);
        }

        private void btnSeven_Click(object sender, EventArgs e)
        {
            ShowInput(btnSeven.Text);
        }

        private void btnEight_Click(object sender, EventArgs e)
        {
            ShowInput(btnEight.Text);
        }

        private void btnNine_Click(object sender, EventArgs e)
        {
            ShowInput(btnNine.Text);
        }

        private void btnZero_Click(object sender, EventArgs e)
        {
            ShowInput(btnZero.Text);
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            currentOperator = Operator.None;
            txtDisplay.Clear();
            total = 0;
        }

        private void btnPoint_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + '.';
        }

        private void btnPlus_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Add);
        }

        private void btnMinus_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Minus);
        }

        private void btnDivide_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Divide);
        }

        private void btnMultiply_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Multiply);
        }

        private void btnEquals_Click(object sender, EventArgs e)
        {
            Evaluate();
            txtDisplay.Text = Convert.ToString(total);
        }

        private void Evaluate()
        {
            switch (currentOperator)
            {
                case Operator.Add:
                    total += currentValue;
                    break;
                case Operator.Minus:
                    total -= currentValue;
                    break;
                case Operator.Divide:
                    total /= currentValue;
                    break;
                case Operator.Multiply:
                    total *= currentValue;
                    break;
                case Operator.None:
                    break;
            }
            currentValue = 0;
            currentOperator = Operator.None;
        }

        private void ApplyOperator(Operator op)
        {
            if (currentOperator != Operator.None)
            {
                Evaluate();
            }
            else
            {
                total = double.Parse(txtDisplay.Text);
            }
            txtDisplay.Clear();
            currentOperator = op;
        }

        private void ShowInput(String n)
        {
            txtDisplay.Text = txtDisplay.Text + n;
            currentValue = double.Parse(txtDisplay.Text);
        }
    }
}

I would still recommend that you would end up making some form of operator parser. Take a look here or look in to the 'Shunting Yard' algorithm yourself.



回答2:

Think about it. What the minus_clicked code is doing is adding all of the operands EXCEPT the last one together, and then the equals_clicked code is doing the arithmetic on the result of minus_clicked, and the value of the textbox (which is the last operand, I assume). So, since the operation you're doing in minus_clicked is addition, what you're getting for x - y - z is really:

(X + Y) - Z

I would consider refactoring a little bit, but if you wanted to keep the code the way it is, I'd probably just change the minus_clicked code to subtract rather than add.

Also, @rhysw is right. If you wan't this to be fully functional, you're gonna have to add priority logic to it as well.



回答3:

in your code:

 private void btnMultiply_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = true;
        }

you aren't applying the correct operator, you have total1 = total1 + ... Change the operator to *.



回答4:

The logic for calculating the product, quotient, and difference in your code is total1 = total1 + double.Parse(txtDisplay.Text); which is why the addition works, but nothing else. So change the logic so it either divides, multiplies, or subtracts, instead of adding.



回答5:

I looked at the code, and it looks like in each button you're just adding each time. So any time to click a button you're just going to keep adding. Just change the opps to their appropriate button. like so:

private void btnMinus_Click(object sender, EventArgs e)
{
    plusButtonClicked = false;
    minusButtonClicked = true;
    divideButtonClicked = false;
    multiplyButtonClicked = false;

    total1 = total1 - double.Parse(txtDisplay.Text);
    txtDisplay.Clear();
}

private void btnDivide_Click(object sender, EventArgs e)
{
    total1 = total1 / double.Parse(txtDisplay.Text);
    txtDisplay.Clear();

    plusButtonClicked = false;
    minusButtonClicked = false;
    divideButtonClicked = true;
    multiplyButtonClicked = false;
}


标签: c# calculator