Javaの課題で電卓を作っています。
10+20=30、12-2=10、210=20、6/3=2など、1回の計算はできるのですが、連続した計算をすると、2+36=18のようになってしまいます。
連続した計算をするにはどこをどのように変えれば良いでしょうか。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/01 08:38
2021/08/01 08:40
回答2件
0
全体を弄ってしまいました。
乗除優先して 2+3*6=20 となります。
エラー対策は(オリジナル通り?)全くしてないので、注意が必要です。
java
1import java.awt.Font; 2import java.awt.GridLayout; 3import java.awt.event.ActionListener; 4import java.util.ArrayDeque; 5import java.util.Deque; 6 7import javax.swing.JButton; 8import javax.swing.JFrame; 9import javax.swing.JPanel; 10import javax.swing.JTextField; 11 12public class Dentaku extends JFrame{ 13 public static void main(String[] args) { 14 new Dentaku().setVisible(true); 15 } 16 17 enum Operation { 18 Pls("+",0) { int calc(int a,int b){return a+b;} }, 19 Min("-",0) { int calc(int a,int b){return a-b;} }, 20 Mul("×",1) { int calc(int a,int b){return a*b;} }, 21 Div("÷",1) { int calc(int a,int b){return a/b;} }; 22 23 private String text; 24 private int priority; 25 Operation(String text, int priority) { 26 this.text = text; 27 this.priority = priority; 28 } 29 String getText() { return text; } 30 int compare(Operation other) { return priority - other.priority; } 31 abstract int calc(int a, int b); 32 } 33 34 private int dispNum = 0; 35 private Deque<Integer> vstack = new ArrayDeque<Integer>(); 36 private Deque<Operation> opstack = new ArrayDeque<Operation>(); 37 38 Dentaku(){ 39 super(); 40 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 41 setSize(280, 320); 42 setResizable(false); 43 44 JTextField result = new JTextField(""); 45 result.setFont(new Font("Arial", Font.PLAIN, 40)); 46 result.setHorizontalAlignment(JTextField.RIGHT); 47 48 ActionListener numActionListener = (e -> { 49 int num = Integer.valueOf(((JButton)e.getSource()).getText()); 50 dispNum = dispNum * 10 + num; 51 result.setText(String.valueOf(dispNum)); 52 }); 53 54 ActionListener opeActionListener = (e -> { 55 Operation op = (Operation)((JButton)e.getSource()).getClientProperty("op"); 56 vstack.addFirst(dispNum); 57 while(true) { 58 Operation before = opstack.peekFirst(); 59 if(before == null || op.compare(before) > 0) { 60 opstack.addFirst(op); 61 break; 62 } 63 calc(); 64 } 65 result.setText(String.valueOf(dispNum)); 66 dispNum = 0; 67 }); 68 69 ActionListener clrActionListener = (e -> { 70 vstack.clear(); 71 opstack.clear(); 72 result.setText(""); 73 dispNum = 0; 74 }); 75 76 ActionListener equActionListener = (e -> { 77 vstack.addFirst(dispNum); 78 while(!opstack.isEmpty()) calc(); 79 result.setText(String.valueOf(vstack.removeFirst())); 80 vstack.clear(); 81 opstack.clear(); 82 dispNum = 0; 83 }); 84 85 setLayout(new GridLayout(2,1)); 86 add(result); 87 88 JPanel buttonarea = new JPanel(new GridLayout(4,4)); 89 buttonarea.add(createButton("7", numActionListener)); 90 buttonarea.add(createButton("8", numActionListener)); 91 buttonarea.add(createButton("9", numActionListener)); 92 buttonarea.add(createButton(Operation.Div, opeActionListener)); 93 buttonarea.add(createButton("4", numActionListener)); 94 buttonarea.add(createButton("5", numActionListener)); 95 buttonarea.add(createButton("6", numActionListener)); 96 buttonarea.add(createButton(Operation.Mul, opeActionListener)); 97 buttonarea.add(createButton("1", numActionListener)); 98 buttonarea.add(createButton("2", numActionListener)); 99 buttonarea.add(createButton("3", numActionListener)); 100 buttonarea.add(createButton(Operation.Min, opeActionListener)); 101 buttonarea.add(createButton("C", clrActionListener)); 102 buttonarea.add(createButton("0", numActionListener)); 103 buttonarea.add(createButton(Operation.Pls, opeActionListener)); 104 buttonarea.add(createButton("=", equActionListener)); 105 add(buttonarea); 106 } 107 108 private JButton createButton(Operation op, ActionListener l) { 109 JButton button = createButton(op.getText(), l); 110 button.putClientProperty("op", op); 111 return button; 112 } 113 private JButton createButton(String text, ActionListener l) { 114 JButton button = new JButton(text); 115 button.addActionListener(l); 116 return button; 117 } 118 119 private void calc() { 120 int b = vstack.removeFirst(); 121 int a = vstack.removeFirst(); 122 Operation op = opstack.removeFirst(); 123 vstack.addFirst(op.calc(a, b)); 124 } 125}
投稿2021/08/01 13:58
編集2021/08/02 05:46総合スコア13209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
int a[] = new int[n]を連続した計算の結果を保存する配列とする。
for(i=0;i<n;i++)でa[i]に演算を行う。
投稿2021/08/01 08:37
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/01 08:59
2021/08/01 09:06
退会済みユーザー
2021/08/01 09:08
退会済みユーザー
2021/08/01 09:13
2021/08/01 10:48
2021/08/01 21:52 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。