1
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool plus;
        bool minus;
        bool multiply;
        bool divide;

        private void button0_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "0";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "2";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "3";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "4";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "5";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "6";
        }

        private void button7_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "7";
        }

        private void button8_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "8";
        }

        private void button9_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "9";
        }

        private void buttonPlus_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                plus = true;
                textBox1.Text = textBox1.Text + " + ";
            }
        }

        private void buttonDivide_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                divide = true;
                textBox1.Text = textBox1.Text + " / ";
            }
        }

        private void buttonMinus_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                minus = true;
                textBox1.Text = textBox1.Text + " - ";
            }
        }

        private void buttonMultiply_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                return;
            else
            {
                multiply = true;
                textBox1.Text = textBox1.Text + " * ";
            }
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            textBox1.Text = string.Empty;
        }

        private void buttonEquals_Click(object sender, EventArgs e)
        {
            if (plus)
            {

            }

            if (minus)
            {

            }

            if (multiply)
            {

            }

            if (divide)
            {

            }
        }


    }
}

私が立ち往生している部分は、数学ボタン(+、-、/、*)を押した後です。別の数字を押さない限り、テキスト ボックスに表示される文字は 1 文字だけです。

例: 今、これが起こっている: 87 + + + + + + + +

87 + が必要で、ユーザーが別の番号を追加した場合に別の番号を追加できる場所が必要です。たとえば、87 + 87 + などです。

また、数学ロジックの追加に関しては、少し指示が必要です。

数学記号の前の文字列にあるものを何らかの形で変数に格納し、数学記号の前の数字に対して同じことを行うことを考えていました。それは問題ありませんか、またはこれを達成するためのより簡単で複雑でない方法はありますか?

4

3 に答える 3

3

文字列などをテストするのではなく、状態を使用して電卓の「瞬間」を判断することは、電卓への良いアプローチだと思います。いくつかの状態について考えてみましょう:

  • NotInitialized : 数字のみを受け入れます。最初の数字が与えられると、電卓は受信に進みます
  • 受信中: より多くの桁が連結されます。オペレーターは電卓をNextNumberに持っていきます
  • NextNumber : 数字のみを受け入れます。最初の数字が与えられると、電卓は受信に進みます

そして、それは行きます。電卓の動作を説明する状態を把握してみてください。

于 2012-06-29T16:44:35.093 に答える
0

+-*\ の状況では、lastCharIsSymbol のようなブール値のプロパティをお勧めします。数値をクリックすると常に false に設定され、記号をクリックすると true に設定されます。次に、シンボル クリック イベントに if ステートメントを追加して、シンボル IF lastCharIsSymbol = false のみを追加できます。

public Boolean lastCharIsSymbol {get;set;}

private void button9_Click(object sender, EventArgs e)
{
    textBox1.Text = textBox1.Text + "9";
    lastCharIsSymbol = false;
}

private void buttonPlus_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "" || lastCharIsSymbol)
        return;
    else
    {
        plus = true;
        textBox1.Text = textBox1.Text + " + ";
        lastCharIsSymbol = true;
    }
}

これを行いたくない場合は、if ステートメントを変更して、テキスト ボックスにあるものの部分文字列を取得し、最後の文字が何であるかを調べることもできます。

于 2012-06-29T16:51:45.453 に答える
0

単純に文字列に書き込み、ユーザーが等号を押したときにそこから解析することもできますが、ユーザーが入力した内容のコレクションを作成する方が有益な場合があります。次に、ユーザーが何かを入力するときに、2 つの数字や 2 つの演算子が隣り合っていないことを確認できます。たとえば、単純な電卓だけを使っている場合でも、負の数や複数桁の数を扱う必要があります。数字を入力できるようにし、演算子を押すと、数字と演算子がリストにコミットされるようにします。演算子が等号キーの場合は、リストを反復して計算を実行します。

例として、現在の Windows 電卓があります。テキストボックスが 2 つあることがわかります。1 つは現在の作業数を示し、もう 1 つは全体的な方程式を示します。

これが例です。これにはもっと良い方法がありますが、簡単にするために、適切な方向に向けることができます。

    List<object> calculatorChain = new List<object>();

    /// <summary>
    /// Handles the button press for the minus key
    /// </summary>
    /// <param name="sender">The originating object</param>
    /// <param name="e">Event arguments</param>
    private void buttonMinus_Click(object sender, EventArgs e)
    {
        CommitOperand(textBox1.Text, "-");
        textBox1.Text = string.Empty;
    }

    /// <summary>
    /// Commits the current working number to the calculator chain with a given operator
    /// </summary>
    /// <param name="operand">The current working number to add</param>
    /// <param name="operation">The operation to perform</param>
    private void CommitOperand(string operand, string operation)
    {
        if (string.IsNullOrWhiteSpace(operand) || string.IsNullOrWhiteSpace(operation))
        {
            return;
        }
        else
        {
            decimal number;
            if (decimal.TryParse(operand, out number))
            {
                calculatorChain.Add(number);
                calculatorChain.Add(operation);
            }
        }
    }
于 2012-06-29T17:02:28.150 に答える