

Javaで電卓の作成をしており、ほぼ完成しているのですが、あとは3項以上の計算をできるようにしたいです。

例）1+2=3のような、2項の計算は問題なくできるのですが、3項になると 例）1+2+3=5となってしまいます。

これを 例）1+2+3=6となるようにし、どれだけ増えても計算できるようにしたいです。  
その他、除算や乗算が出た場合 例） 1+2*3=9 というように、演算の優先順位は考慮していません。  
どなたか教えていただけませんか。

[code]

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.JTextField;
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    
    class Key extends Panel {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        Button k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, kd, km, ks, ka, kdp, ke;
    
        Button createButton(String k, ActionListener listener) {
            Button b = new Button(k);
    
            add(b);
    
            if (listener != null) {
                b.addActionListener(listener);
            }
            return b;
        }
    
        Key(ActionListener listener) {
            setLayout(new GridLayout(4, 4));
            setFont(new Font("Courier", Font.BOLD, 20));
    
            k7 = createButton("7", listener);
            k8 = createButton("8", listener);
            k9 = createButton("9", listener);
            kd = createButton("/", listener);
            k4 = createButton("4", listener);
            k5 = createButton("5", listener);
            k6 = createButton("6", listener);
            km = createButton("*", listener);
            k1 = createButton("1", listener);
            k2 = createButton("2", listener);
            k3 = createButton("3", listener);
            ks = createButton("-", listener);
            k0 = createButton("0", listener);
            kdp = createButton(".", listener);
            ke = createButton("=", listener);
            ka = createButton("+", listener);
        }
    }
    
    class Test extends Panel implements ActionListener {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private BigDecimal b1, b2, b3;
        static int op = 0;
    
        JTextField t;
        Key key;
    
        public void actionPerformed(ActionEvent e) {
    
            if (e.getActionCommand() == "0") {
                t.setText(new BigDecimal(t.getText().concat("0")).toString());
            } else if (e.getActionCommand() == "1") {
                t.setText(new BigDecimal(t.getText().concat("1")).toString());
            } else if (e.getActionCommand() == "2") {
                t.setText(new BigDecimal(t.getText().concat("2")).toString());
            } else if (e.getActionCommand() == "3") {
                t.setText(new BigDecimal(t.getText().concat("3")).toString());
            } else if (e.getActionCommand() == "4") {
                t.setText(new BigDecimal(t.getText().concat("4")).toString());
            } else if (e.getActionCommand() == "5") {
                t.setText(new BigDecimal(t.getText().concat("5")).toString());
            } else if (e.getActionCommand() == "6") {
                t.setText(new BigDecimal(t.getText().concat("6")).toString());
            } else if (e.getActionCommand() == "7") {
                t.setText(new BigDecimal(t.getText().concat("7")).toString());
            } else if (e.getActionCommand() == "8") {
                t.setText(new BigDecimal(t.getText().concat("8")).toString());
            } else if (e.getActionCommand() == "9") {
                t.setText(new BigDecimal(t.getText().concat("9")).toString());
            } else if (e.getActionCommand() == ".") {
                if (t.getText().contains(".") != true) {
                    t.setText(t.getText().concat("."));
                }
            } else if (e.getActionCommand() == "+") {
                BigDecimal buf = new BigDecimal(t.getText());
                if (b1.equals(null)) {
                    b1 = buf;
                } else {
                    b1 = b1.add(buf); 
                }
                op = 1;
                t.setText("");  
            } else if (e.getActionCommand() == "-") {
                b1 = new BigDecimal(t.getText());
                op = 2;
                t.setText("");
            } else if (e.getActionCommand() == "*") {
                b1 = new BigDecimal(t.getText());
                op = 3;
                t.setText("");
            } else if (e.getActionCommand() == "/") {
                b1 = new BigDecimal(t.getText());
                op = 4;
                t.setText("");
            } else if (e.getActionCommand() == "=") {
                b2 = new BigDecimal(t.getText());
    
                switch (op) {
                case 1:
                    b3 = b1.add(b2);
                    break;
                case 2:
                    b3 = b1.subtract(b2);
                    break;
                case 3:
                    b3 = b1.multiply(b2);
                    break;
                case 4:
                    b3 = b1.divide(b2, 11, RoundingMode.HALF_UP);
                    break;
                default:
                    b3 = new BigDecimal("0");
                }
                t.setText((b3).stripTrailingZeros().toPlainString());
            }
        }
    
        public void init() {
            setLayout(new BorderLayout());
    
            key = new Key(this);
            t = new JTextField();
            t.setHorizontalAlignment(JTextField.RIGHT);
            t.setPreferredSize(new Dimension(50, 30));
            t.setFont(new Font("Courier", Font.BOLD, 15));
            t.setEditable(false);
    
            add(t, "North");
            add(key, "Center");
        }
    
        public void start() {
    
            t.setText(new BigDecimal("0").toString());
    
        }
    
        public static void main(String[] args) {
            Frame fr = new Frame("Calc");
            Test test = new Test();
    
            fr.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            test.init();
    
            fr.add(test, "Center");
            fr.pack();
    
            test.start();
            fr.setVisible(true);
        }
    }
    
[/code]


CC BY-SA 4.0
2022-06-20T04:10:42.463
89486
2022-06-20T07:24:07.950
2022-06-20T07:24:07.950
53150
53150
question
java
Java の calculation を使った3項以上の計算で結果が意図した通りにならない


加減乗除のボタンを押したときに`b1`変数の値をテキストの値で上書きしていることが原因です。  
つまり`1+2+3=`と入力した時には、`1+2`の足し算を実行できていません。

  * `1+`で`b1`は`1`になる
  * `1+2+`で`b1`は`2`になる(意図していない動作)

これを意図通りに動かすためには下記のコードを書き換える必要があります。

[code]

            } else if (e.getActionCommand() == "+") {
                b1 = new BigDecimal(t.getText());   // ここでb1がテキストの値に変更されてしまう
                op = 1;
                t.setText("");
    
[/code]

下記のような改修例が考えられます。  
{}内の日本語は疑似コードですので適切に書き換えてください。  
-*/の演算子についても同様の対応が必要です。
[code]

            } else if (e.getActionCommand() == "+") {
                BigDecimal buf = new BigDecimal(t.getText());
                if ({b1がnullなら}) {
                    b1 = buf;
                } else {
                    // 記号入力前の計算結果をb1に代入する
                    b1 = {b1とbufを計算した値};  // 例えば 1+2+ と入力した場合、b1 = 1, buf = 2, op = 1として計算した結果をb1に代入する
                }
                op = 1;
                t.setText("");
    
[/code]

ifの{}内の処理でb1,b2,b3変数にどのような値が入るのかを意識して開発することで、3項以上の計算に対応するコードの理解を深めることができると思います。  
がんばってください。


CC BY-SA 4.0
2022-06-20T06:00:40.880
89489
2022-06-20T06:00:40.880
9820
89486
answer