teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード修正

2020/08/11 02:07

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -10,9 +10,10 @@
10
10
  import java.awt.event.KeyEvent;
11
11
 
12
12
  public class denpart0203 extends JFrame implements ActionListener {
13
- int x = 0, y = 0;
13
+ int x = 0; // 入力値
14
- int op = 0;
14
+ int y = 0; // 計算結果
15
+ int op = 0; // 演算子(operator)
15
- boolean dispY = false;
16
+ boolean dispY = false; // 計算結果表示フラグ
16
17
  JLabel label01 = new JLabel("0");
17
18
 
18
19
  public static void main(String[] args){
@@ -70,9 +71,9 @@
70
71
  button0[i] = new JButton(str[i]);
71
72
  button0[i].setPreferredSize(d);
72
73
  button0[i].setMnemonic(ke[i]);
73
- panel01.add(button0[i]);
74
74
  button0[i].addActionListener(this);
75
75
  button0[i].setActionCommand(str2[i]);
76
+ panel01.add(button0[i]);
76
77
  }
77
78
  button0[13].setPreferredSize(d2);
78
79
  button0[16].setPreferredSize(d2);
@@ -85,50 +86,53 @@
85
86
  char c = cmd.charAt(4);
86
87
  if (Character.isDigit(c)) {
87
88
  if (dispY) x = 0;
88
- x = x * 10 + (c - '0');
89
- label01.setText("" + x);
89
+ x = x * 10 + (c - '0'); label01.setText("" + x); dispY = false;
90
- dispY = false;
91
90
  }
92
- else if (cmd.equals("btn0zero")) {
91
+ else if (c == 'z') {
93
92
  if (dispY) x = 0;
94
- x *= 100;
95
- label01.setText("" + x);
93
+ x *= 100; label01.setText("" + x); dispY = false;
96
- dispY = false;
97
94
  }
98
- else if (c == 'p') { calc(); op = '+'; }
99
- else if (c == 'm') { calc(); op = '-'; }
100
- else if (c == 'k') { calc(); op = '*'; }
101
- else if (c == 'w') { calc(); op = '/'; }
102
- else if (c == 'i') calc();
95
+ else if ("pmkwi".indexOf(c) >= 0) calc(c);
103
96
  else if (c == 'c') {
104
- x = y = 0; op = 0;
105
- label01.setText("0");
97
+ x = y = 0; op = 0; label01.setText("0"); dispY = false;
106
- dispY = false;
107
98
  }
108
99
  else if (c == 'b') {
109
- x /= 10;
110
- label01.setText("" + x);
100
+ x /= 10; label01.setText("" + x); dispY = false;
111
- dispY = false;
112
101
  }
113
102
  }
114
103
 
115
- void calc() {
104
+ void calc(char c) {
116
105
  boolean div0 = false;
106
+ if (!dispY) {
117
- switch (op) {
107
+ switch (op) {
118
- case '+': y += x; break;
108
+ case 'p': y += x; break;
119
- case '-': y -= x; break;
109
+ case 'm': y -= x; break;
120
- case '*': y *= x; break;
110
+ case 'k': y *= x; break;
121
- case '/':
122
- if (x == 0) div0 = true; else y /= x;
111
+ case 'w': if (x == 0) div0 = true; else y /= x; break;
123
- break;
124
- default: y = x; break;
112
+ default: y = x; break;
113
+ }
114
+ x = y;
125
115
  }
116
+ op = c;
126
117
  label01.setText(div0 ? "Error" : "" + y);
127
118
  dispY = true;
128
119
  }
129
120
 
130
121
  void put(String str) { System.out.println(str); }
131
122
  }
123
+
132
124
  ```
133
125
  ボタンは配列にすると同様の処理を for文にまとめることができます。
134
- 小数点の入力もなくて int の四則演算なのですね。
126
+ 小数点の入力もなくて int の四則演算なのですね。
127
+
128
+ **追記**
129
+ 「+-×÷=」の連続入力による処理が不十分なのでコードを修正しました。
130
+
131
+ さて、「メゾットからmain文に変数を使用できない。」というタイトルですが、
132
+ まず「メゾット」でなく「メソッド」です。
133
+ 次に main は「文」ではなく「メソッド」です。
134
+
135
+ x は、denpart0203クラスのフィールドなので、
136
+ denpart0203クラスのどのメソッドからも自由に使用できます。
137
+ denpart0203クラスは main の中で new されているので、
138
+ x は static にしなくても、使用できます。