回答編集履歴

1

コード修正

2020/08/11 02:07

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -22,11 +22,13 @@
22
22
 
23
23
  public class denpart0203 extends JFrame implements ActionListener {
24
24
 
25
- int x = 0, y = 0;
25
+ int x = 0; // 入力値
26
-
26
+
27
- int op = 0;
27
+ int y = 0; // 計算結果
28
+
28
-
29
+ int op = 0; // 演算子(operator)
30
+
29
- boolean dispY = false;
31
+ boolean dispY = false; // 計算結果表示フラグ
30
32
 
31
33
  JLabel label01 = new JLabel("0");
32
34
 
@@ -142,12 +144,12 @@
142
144
 
143
145
  button0[i].setMnemonic(ke[i]);
144
146
 
147
+ button0[i].addActionListener(this);
148
+
149
+ button0[i].setActionCommand(str2[i]);
150
+
145
151
  panel01.add(button0[i]);
146
152
 
147
- button0[i].addActionListener(this);
148
-
149
- button0[i].setActionCommand(str2[i]);
150
-
151
153
  }
152
154
 
153
155
  button0[13].setPreferredSize(d2);
@@ -172,53 +174,29 @@
172
174
 
173
175
  if (dispY) x = 0;
174
176
 
175
- x = x * 10 + (c - '0');
176
-
177
- label01.setText("" + x);
177
+ x = x * 10 + (c - '0'); label01.setText("" + x); dispY = false;
178
-
179
- dispY = false;
180
178
 
181
179
  }
182
180
 
183
- else if (cmd.equals("btn0zero")) {
181
+ else if (c == 'z') {
184
182
 
185
183
  if (dispY) x = 0;
186
184
 
187
- x *= 100;
188
-
189
- label01.setText("" + x);
185
+ x *= 100; label01.setText("" + x); dispY = false;
190
-
191
- dispY = false;
192
186
 
193
187
  }
194
188
 
195
- else if (c == 'p') { calc(); op = '+'; }
196
-
197
- else if (c == 'm') { calc(); op = '-'; }
198
-
199
- else if (c == 'k') { calc(); op = '*'; }
200
-
201
- else if (c == 'w') { calc(); op = '/'; }
202
-
203
- else if (c == 'i') calc();
189
+ else if ("pmkwi".indexOf(c) >= 0) calc(c);
204
190
 
205
191
  else if (c == 'c') {
206
192
 
207
- x = y = 0; op = 0;
208
-
209
- label01.setText("0");
193
+ x = y = 0; op = 0; label01.setText("0"); dispY = false;
210
-
211
- dispY = false;
212
194
 
213
195
  }
214
196
 
215
197
  else if (c == 'b') {
216
198
 
217
- x /= 10;
218
-
219
- label01.setText("" + x);
199
+ x /= 10; label01.setText("" + x); dispY = false;
220
-
221
- dispY = false;
222
200
 
223
201
  }
224
202
 
@@ -226,27 +204,31 @@
226
204
 
227
205
 
228
206
 
229
- void calc() {
207
+ void calc(char c) {
230
208
 
231
209
  boolean div0 = false;
232
210
 
211
+ if (!dispY) {
212
+
233
- switch (op) {
213
+ switch (op) {
234
-
214
+
235
- case '+': y += x; break;
215
+ case 'p': y += x; break;
236
-
216
+
237
- case '-': y -= x; break;
217
+ case 'm': y -= x; break;
238
-
218
+
239
- case '*': y *= x; break;
219
+ case 'k': y *= x; break;
240
-
241
- case '/':
220
+
242
-
243
- if (x == 0) div0 = true; else y /= x;
221
+ case 'w': if (x == 0) div0 = true; else y /= x; break;
244
-
245
- break;
222
+
246
-
247
- default: y = x; break;
223
+ default: y = x; break;
248
-
224
+
249
- }
225
+ }
226
+
227
+ x = y;
228
+
229
+ }
230
+
231
+ op = c;
250
232
 
251
233
  label01.setText(div0 ? "Error" : "" + y);
252
234
 
@@ -260,8 +242,34 @@
260
242
 
261
243
  }
262
244
 
245
+
246
+
263
247
  ```
264
248
 
265
249
  ボタンは配列にすると同様の処理を for文にまとめることができます。
266
250
 
267
251
  小数点の入力もなくて int の四則演算なのですね。
252
+
253
+
254
+
255
+ **追記**
256
+
257
+ 「+-×÷=」の連続入力による処理が不十分なのでコードを修正しました。
258
+
259
+
260
+
261
+ さて、「メゾットからmain文に変数を使用できない。」というタイトルですが、
262
+
263
+ まず「メゾット」でなく「メソッド」です。
264
+
265
+ 次に main は「文」ではなく「メソッド」です。
266
+
267
+
268
+
269
+ x は、denpart0203クラスのフィールドなので、
270
+
271
+ denpart0203クラスのどのメソッドからも自由に使用できます。
272
+
273
+ denpart0203クラスは main の中で new されているので、
274
+
275
+ x は static にしなくても、使用できます。