3

みなさん、こんにちは。助けてくれてありがとう。

この電卓を C# で作成しましたが、問題が 1 つあります。5 + 5 + 5 のようなものを追加すると正しい結果が得られますが、2 つ以上の数値を減算し、2 つ以上の数値を除算または乗算する場合、正しい結果が得られません。

私が間違っていることを知っていますか?

どうもありがとうございました!

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;
        }




    }
}
4

5 に答える 5

3

このコードは徹底的にテストされていません。次のようなものを試してみませんか。

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);
        }
    }
}

それでも、何らかの形の演算子パーサーを作成することをお勧めします。こちらをご覧になるか、「操車場」アルゴリズムをご自身でご覧ください。

于 2012-05-04T15:23:18.017 に答える
2

考えてみてください。マイナスクリックされたコードが行っていることは、最後のオペランドを除くすべてのオペランドを一緒に追加することです。次に、equals_clicked コードは、マイナスクリックの結果とテキストボックスの値 (最後のオペランドであると思います) に対して演算を行っています。したがって、minus_clicked で行っている操作は加算であるため、x - y - z に対して得られるものは実際には次のとおりです。

(X + Y) - Z

少しリファクタリングを検討しますが、コードをそのままにしておく場合は、minus_clicked コードを加算ではなく減算に変更するだけです。

また、@rhyswは正しいです。これを完全に機能させたくない場合は、優先ロジックも追加する必要があります。

于 2012-05-04T15:36:34.937 に答える
2

あなたのコードで:

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

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

正しい演算子を適用していません。total1 = total1 + ... 演算子を * に変更します。

于 2012-05-04T15:40:06.233 に答える
2

コードの積、商、および差を計算するためのロジックはtotal1 = total1 + double.Parse(txtDisplay.Text);、加算が機能する理由であり、他には何もありません。そのため、加算ではなく、除算、乗算、または減算のいずれかになるようにロジックを変更します。

于 2012-05-04T15:34:39.153 に答える
2

コードを見たところ、毎回追加する各ボタンのように見えます。したがって、ボタンをクリックするたびに、追加を続けるだけです。opp を適切なボタンに変更するだけです。そのようです:

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;
}
于 2013-06-29T02:11:35.490 に答える