1

さて、これをもう一度試してみます。私は非常に基本的な電卓アプリケーションを持っています。現在、plus()メソッドとminus()メソッドを機能させる方法を理解するのに問題があります。コードを実行するたびに、plus()メソッドはcurrentValue+currentValueを追加します。電卓のように機能して、2つの異なる整数を足し合わせたいです。助言がありますか?

digitButton(buttons, 0);
JButton plus = new JButton("+");
plus.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e)
  {
    myAccumulator.plus();
    updateDisplay();
  }
});
buttons.add(plus);
return buttons;

これはそれが呼ばれているところです。

そして、これは私がplus()メソッドで書いた私のクラスです。

public class BasicAccumulator implements Accumulator {

    private int digit;
    private int currentValue;

    public void BasicAccumulator(int digit, int currentValue)
    {
        this.digit = digit;
        this.currentValue = currentValue;
    }

    public void addDigit(int digit)
    {
        currentValue = currentValue * 10 + digit;
    }

    public void plus()
    {
        if (currentValue != 0)
            digit = currentValue;
            currentValue = currentValue + digit;

    }

    public void minus()
    {
        currentValue = currentValue - digit;
    }

    public void clear()
    {
        currentValue = 0;
    }

    public int displayValue()
    {
        return currentValue;
    }

}
4

5 に答える 5

7

考えてみてください。+を押した時点では、おそらく2番目の数字をまだ入力していません。つまり、電卓が他のほとんどの電卓と同じように機能することを目的としている場合は...

おそらく、次の一連のイベントがあります。

  1. 数字を入力してください:数字は現在のアキュムレータに入力されて数値を作成します
  2. +を押す:数字は保存されます
  3. 数字を入力すると、数字は1のように累積されます
  4. =を押します:現在の累積数が前の数に追加されます。

このために、私は概念的に3つのものをアキュムレータに格納します。

  • 'left'値(方程式の左辺)-つまり、+が押された後に保存された数値
  • 現在の操作-最初は何もありませんが、+または-のどちらであるかを示す値に設定されます。
  • 現在の累積値(単に「正しい」と呼びます)

つまり...最初leftはゼロであり、operation何もありません(つまり「クリア」)。

State: left(0), operation(empty), right(0)

いくつかの数字を入力してください...これらは「右」に作成されます。

State: left(0), operation(empty), right(22)

+を押します。ここで、保留中の操作をに適用しますleft。この場合、操作は空なので、値をコピーして「右」をクリアするだけです。次に、操作を「+」に設定します

State: left(22), operation(+), right(0)

さらに数字を入力し、もう一度積み上げrightます。

State: left(22), operation(+), right(20)

もう一度+を押します。これで操作が適用されます。に追加rightleftてクリアしrightます。

State: left(42), operation(+), right(0)

などなど..。

于 2012-09-13T23:45:24.177 に答える
1

digitメンバーとしてとの引数として、2つの場所で使用していますaddDigit。前者は私にはあまり意味がないようです。

のようなほとんどの基本的な操作では、作業するために2つの数値plusが必要です。それらの1つを関数呼び出しに提供するか、両方をクラスに格納する必要があります。後者には既存のメンバーを使用できますが、1桁だけを追加する場合を除いて、その名前を使用しないことをお勧めします。digit

代わりに、操作のシーケンスが何であるかを検討してください。2つの数字を入力してから操作ボタンを押しますか?その場合、たとえばvalueとの2つの数値を格納する必要がありますcurrent。ゼロにリセットする前に、数字が追加されcurrent、のような操作plusが追加されます。表示はおそらく各操作の後、ただし各桁の後に反映されるはずなので、これら2つの状況を区別するためにブールフラグが必要になります。currentvaluecurrentvaluecurrent

1つの数値を入力し、操作ボタンを押してから別の数値(中置演算子)を入力すると、上記の提案のほとんどが引き続き適用されますが、さらに、2番目の数値を読み取るときに操作を保存する方法が必要になります。これは、文字、文字列、数値、または列挙型の定数を使用して行うことができます。私は個人的に、その操作を計算するための命令がすでに含まれている列挙型定数を使用してこれを行いますが、それはかなり高度な構文です。操作ボタンを押すたびに、以前に保存された操作が評価され、「=」を除いて新しい操作が保存されます。

于 2012-09-13T23:33:01.890 に答える
1

これは少なくとも混乱の原因のように見えます:

public void plus()
{
    if (currentValue != 0)
        digit = currentValue;
        currentValue = currentValue + digit;

}

ブレースを追加してインデントを修正すると、そのコードは実際には次のようになります。

public void plus()
{
    if (currentValue != 0)
    {
        digit = currentValue;
    }
    currentValue = currentValue + digit;
}

それは実際にあなたが意図したものですか?ありそうもないようです。インデントが動作に影響を与えることを期待していた場合は、コードを次のように書き直す必要があります。

public void plus()
{
    if (currentValue != 0)
    {
        digit = currentValue;
        currentValue = currentValue + digit;
    }
}

そもそもなぜこの振る舞いが必要なのかも明らかではありません。前の質問で要求されたように、クラスを実行する短いが完全なコンソールアプリケーションを、予想される動作と実際の動作のステートメントとともに作成すると、非常に役立ちます。

于 2012-09-13T23:34:47.333 に答える
0

このようなことをお勧めします。

int plus(int first, int second)
{
   return first + second;
}

これがここでの問題です。

digit = currentValue;
currentValue = currentValue + digit;

数字をcurrentValueと等しくなるように設定すると、次のようになります。

currentValue = currentValue + currentValue;
于 2012-09-13T23:29:25.137 に答える
0

あなたの中でplus()あなたはやっています

digit = currentValue;
currentValue = currentValue + digit;

私にはどのように見えますか

currentValue = currentValue + currentValue

あなたは使用する必要があります

currentValue = currentValue + digit;

それだけ

于 2012-09-13T23:33:14.677 に答える