質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

2518閲覧

Java 電卓 連続計算

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/08/01 08:19

Javaの課題で電卓を作っています。

https://ideone.com/mquzPm

10+20=30、12-2=10、210=20、6/3=2など、1回の計算はできるのですが、連続した計算をすると、2+36=18のようになってしまいます。

連続した計算をするにはどこをどのように変えれば良いでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/08/01 08:20

読まずに投稿してんの? https://teratail.com/help/avoid-asking コードをください・デバッグしてください等の丸投げの質問 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
jimbe

2021/08/01 08:38

まず「式を入力したら結果を返す」、つまり 2+3*6 と入力して ENTER を押すと結果を表示するようなプログラムに挑戦しては如何でしょうか。
dodox86

2021/08/01 08:40

超速の退会。まぁ、 > 連続した計算をするにはどこをどのように変えれば良いでしょうか。 のような聞き方をされているので、そもそも元のコードの動きを理解されていなかったのでしょうね。
guest

回答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
jimbe

総合スコア12729

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

私は正しい。
Zuishin

2021/08/01 09:06

意味不明。結果の履歴保存のことなど誰も聞いていない。
退会済みユーザー

退会済みユーザー

2021/08/01 09:08

2+3*6=18?
退会済みユーザー

退会済みユーザー

2021/08/01 09:13

2+3*6=30
episteme

2021/08/01 10:48

「連続した計算をすると正しい結果が得られない」という質問に対し 「~を連続した計算の結果を保存する配列とする」では回答になっていない。低評価。
m.ts10806

2021/08/01 21:52 編集

ちゃんと理由書いても「正しい」を押し通すなら無言で低評価されても文句言えないですよね。むしろ通報されても文句言えない。 >2+3*6=30 って小学校レベルの算数もできてないみたいですし。さすがに質問者以下の理解度の人は回答しちゃダメ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問