質問編集履歴

7

削除された内容の復元を行いました

2020/08/17 02:53

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1 +1,271 @@
1
+ ### 前提・実現したいこと
2
+
3
+ main関数で最初のswitch文に入り、
4
+
5
+ case1の時に入れ替えを行うことは理解できたのですが、
6
+
7
+ 最初のcase1の中で
8
+
9
+ 後ろのほうから比較していかないといけないのはなぜでしょうか?
10
+
11
+ 例えば
12
+
13
+ 70 50 100 20 とあった時、入れ替えを以下のコードだけで行うと
14
+
15
+ 「50 70 20 100」となるのは理解できます。
16
+
17
+ ```java
18
+
19
+ (省略)
20
+
21
+ int num1 = data.compare(i - 1, i);
22
+
23
+ switch (num1) {
24
+
25
+ case 1:
26
+
27
+ //入れ替える
28
+
29
+ data.exchange(i - 1, i);
30
+
31
+ default:
32
+
33
+ break;
34
+
35
+ }
36
+
37
+ (省略)
38
+
39
+ ```
40
+
41
+ そのため後ろのほうから
42
+
43
+ 100 と 20 を 比較→ 20 100
44
+
45
+ 20 と 70 を 比較→ 20 70
46
+
47
+ 20 と 50 を 比較→ 20 50
48
+
49
+ となって「20 50 70 100」としなければならない理由もわかります。
50
+
51
+ ですが、case1のなかでしなければならない理由はなんでしょうか?
52
+
53
+ 以下のコードでもよさそうと思ってしまうのですが…
54
+
55
+ ```java
56
+
57
+ for (int i = 1; i < 100; i++) {
58
+
59
+ int num1 = data.compare(i - 1, i);
60
+
61
+ switch (num1) {
62
+
63
+ case 1:
64
+
65
+ //入れ替える
66
+
67
+ data.exchange(i - 1, i);
68
+
69
+ default:
70
+
71
+ break;
72
+
73
+ }
74
+
75
+ for (int n = i; n > 0; n--) {
76
+
77
+ int num2 = data.compare(n - 1, n);
78
+
79
+ switch (num2) {
80
+
81
+ case 1:
82
+
83
+ data.exchange(n - 1, n);
84
+
85
+ default:
86
+
87
+ break;
88
+
89
+ }
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ 49,50あたりから何か必要そうになるのは分かるのですが
98
+
99
+ これが1000とかになるとどうしても考えられなくなります。
100
+
101
+ みなさんはどのように考えておりますか?
102
+
103
+ ### 該当のソースコード
104
+
105
+ ```java
106
+
107
+ public class Change {
108
+
109
+ public static void main(String[] args) {
110
+
111
+ ListManager data = new ListManager();
112
+
113
+ for (int i = 1; i < 100; i++) {
114
+
115
+ /*
116
+
117
+ signumに渡した数値によって以下の値が返ります。
118
+
119
+   引数がゼロより大きい場合 ⇒1
120
+
121
+   引数がゼロの場合 ⇒0
122
+
123
+   引数がゼロより小さい場合 ⇒-1
124
+
125
+ */
126
+
127
+ int num1 = data.compare(i - 1, i);
128
+
129
+ switch (num1) {
130
+
131
+ case 1:
132
+
133
+ //入れ替える
134
+
135
+ data.exchange(i - 1, i);
136
+
137
+ //後ろから入れ替えていく
138
+
139
+ for (int n = i; n > 0; n--) {
140
+
141
+ int num2 = data.compare(n - 1, n);
142
+
143
+ switch (num2) {
144
+
145
+ case 1:
146
+
147
+ data.exchange(n - 1, n);
148
+
149
+ default:
150
+
151
+ break;
152
+
153
+ }
154
+
155
+ }
156
+
157
+ default:
158
+
159
+ break;
160
+
161
+ }
162
+
163
+ }
164
+
165
+ data.checkResult();
166
+
167
+ }
168
+
169
+ }
170
+
171
+ ```
172
+
173
+ ```java
174
+
175
+ public class ListManager {
176
+
177
+ private int[] dataList;
178
+
179
+ private int compareCount;
180
+
181
+ private int exchangeCount;
182
+
183
+ public ListManager() {
184
+
185
+ // データをランダムに作成する
186
+
187
+ Random random = new Random();
188
+
189
+ dataList = new int[100];
190
+
191
+ for (int i = 0; i < dataList.length; i++) {
192
+
193
+ dataList[i] = random.nextInt(10000);
194
+
195
+ }
196
+
197
+ }
198
+
199
+ /**
200
+
201
+ * 2つのデータを比較
202
+
203
+ *
204
+
205
+ * @param index1
206
+
207
+ * @param index2
208
+
209
+ * @return -1:index1のデータが小さい, 1:index2のデータが小さい, 0:同じデータ
210
+
211
+ */
212
+
213
+ public int compare(int index1, int index2) {
214
+
215
+ compareCount++;
216
+
217
+ return (int) Math.signum(dataList[index1] - dataList[index2]);
218
+
219
+ }
220
+
221
+ /**
222
+
223
+ * 2つのデータを入れ替え
224
+
225
+ *
226
+
227
+ * @param index1
228
+
229
+ * @param index2
230
+
231
+ */
232
+
233
+ public void exchange(int index1, int index2) {
234
+
235
+ exchangeCount++;
236
+
237
+ int tmp = dataList[index1];
238
+
239
+ dataList[index1] = dataList[index2];
240
+
241
+ dataList[index2] = tmp;
242
+
243
+ }
244
+
245
+ /**
246
+
247
+ * ソートチェック
248
+
249
+ */
250
+
251
+ public void checkResult() {
252
+
253
+ int data = dataList[0];
254
+
255
+ for (int i = 1; i < dataList.length; i++) {
256
+
257
+ if (data > dataList[i]) {
258
+
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
259
+ throw new RuntimeException("ソートされていない: [" + (i - 1) + "]=" + data + ", [" + i + "]=" + dataList[i]);
260
+
261
+ }
262
+
263
+ data = dataList[i];
264
+
265
+ }
266
+
267
+ System.out.println("ソートOK: 比較=" + compareCount + ", 入れ替え=" + exchangeCount);
268
+
269
+ }
270
+
271
+ ```

6

二重になっていたpublic static void main(String[] args) { を削除しました。

2020/08/17 02:53

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,269 +1 @@
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
-
3
-
4
-
5
- ```java
6
-
7
-
8
-
9
-
10
-
11
- import java.math.BigDecimal;
12
-
13
- import java.util.Stack;
14
-
15
-
16
-
17
- public class DivideValue implements IValue {
18
-
19
-
20
-
21
- @Override
22
-
23
- public void execute(Stack<BigDecimal> values) {
24
-
25
- BigDecimal right = values.pop();
26
-
27
- BigDecimal left = values.pop();
28
-
29
- values.push(left.divide(right, 2, BigDecimal.ROUND_DOWN));
30
-
31
- }
32
-
33
- }
34
-
35
-
36
-
37
- ```
38
-
39
-
40
-
41
- ```java
42
-
43
-
44
-
45
-
46
-
47
- import java.math.BigDecimal;
48
-
49
- import java.util.Stack;
50
-
51
-
52
-
53
- public class MinusValue implements IValue {
54
-
55
-
56
-
57
- @Override
58
-
59
- public void execute(Stack<BigDecimal> values) {
60
-
61
- BigDecimal right = values.pop();
62
-
63
- BigDecimal left = values.pop();
64
-
65
- values.push(left.subtract(right));
66
-
67
- }
68
-
69
- }
70
-
71
-
72
-
73
- ```
74
-
75
-
76
-
77
-
78
-
79
- ```java
80
-
81
-
82
-
83
-
84
-
85
- import java.math.BigDecimal;
86
-
87
- import java.util.Stack;
88
-
89
-
90
-
91
- public class MultiplyValue implements IValue {
92
-
93
-
94
-
95
- @Override
96
-
97
- public void execute(Stack<BigDecimal> values) {
98
-
99
- BigDecimal right = values.pop();
100
-
101
- BigDecimal left = values.pop();
102
-
103
- values.push(left.multiply(right));
104
-
105
- }
106
-
107
- }
108
-
109
-
110
-
111
- ```
112
-
113
-
114
-
115
-
116
-
117
- ```java
118
-
119
- import java.math.BigDecimal;
120
-
121
- import java.util.Stack;
122
-
123
-
124
-
125
- /**
126
-
127
- * 数値を保持するクラス
128
-
129
- */
130
-
131
- public class DecimalValue implements IValue {
132
-
133
- /**
134
-
135
- * 保持する値
136
-
137
- */
138
-
139
- private BigDecimal value;
140
-
141
-
142
-
143
- public DecimalValue(String text) {
144
-
145
-
146
-
147
- value = new BigDecimal(text);
148
-
149
- }
150
-
151
-
152
-
153
-
154
-
155
- @Override
156
-
157
- public void execute(Stack<BigDecimal> values) {
158
-
159
- // スタックに値を積む
160
-
161
- values.push(value);
162
-
163
- }
164
-
165
- }
166
-
167
-
168
-
169
- ```
170
-
171
-
172
-
173
-
174
-
175
- ```java
176
-
177
- public class {
178
-
179
-
180
-
181
- public static void main(String[] args) {
182
-
183
- Stack<BigDecimal> stack = new Stack<>();
184
-
185
- Scanner s = new Scanner(System.in);
186
-
187
- List<IValue> list = parseLine(s.nextLine());
188
-
189
- for (IValue values : list) {
190
-
191
- values.execute(stack);
192
-
193
- }
194
-
195
- System.out.println(stack.pop());
196
-
197
- }
198
-
199
-
200
-
201
- /**
202
-
203
- * 逆ポーランドで記載された1行のテキストを分解する
204
-
205
- *
206
-
207
- * @param lineText 1行テキスト
208
-
209
- * @return 分解された値リスト
210
-
211
- */
212
-
213
- private static List<IValue> parseLine(String lineText) {
214
-
215
- List<IValue> resultList = new ArrayList<>();
216
-
217
- // 空白文字で区切ってループする
218
-
219
- for (String text: lineText.split("[\s]+")) {
220
-
221
- for (String text : lineText.split("[\s]+")) {
222
-
223
- // TODO 一部処理だけ実装
224
-
225
- switch (text) {
226
-
227
- case "+": // 足し算
228
-
229
- resultList.add(new PlusValue());
230
-
231
- break;
232
-
233
- case "-":
234
-
235
- resultList.add(new MinusValue());
236
-
237
- break;
238
-
239
- case "*":
240
-
241
- resultList.add(new MultiplyValue());
242
-
243
- break;
244
-
245
- case "/":
246
-
247
- resultList.add(new DivideValue());
248
-
249
- break;
250
-
251
- default: // その他は数値として扱う
252
-
253
- resultList.add(new DecimalValue(text));
254
-
255
- break;
256
-
257
- }
258
-
259
- }
260
-
261
- return resultList;
262
-
263
- }
264
-
265
- }
266
-
267
-
268
-
269
- ```

5

ソースの修正

2020/08/12 13:54

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1 +1,269 @@
1
1
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+
3
+
4
+
5
+ ```java
6
+
7
+
8
+
9
+
10
+
11
+ import java.math.BigDecimal;
12
+
13
+ import java.util.Stack;
14
+
15
+
16
+
17
+ public class DivideValue implements IValue {
18
+
19
+
20
+
21
+ @Override
22
+
23
+ public void execute(Stack<BigDecimal> values) {
24
+
25
+ BigDecimal right = values.pop();
26
+
27
+ BigDecimal left = values.pop();
28
+
29
+ values.push(left.divide(right, 2, BigDecimal.ROUND_DOWN));
30
+
31
+ }
32
+
33
+ }
34
+
35
+
36
+
37
+ ```
38
+
39
+
40
+
41
+ ```java
42
+
43
+
44
+
45
+
46
+
47
+ import java.math.BigDecimal;
48
+
49
+ import java.util.Stack;
50
+
51
+
52
+
53
+ public class MinusValue implements IValue {
54
+
55
+
56
+
57
+ @Override
58
+
59
+ public void execute(Stack<BigDecimal> values) {
60
+
61
+ BigDecimal right = values.pop();
62
+
63
+ BigDecimal left = values.pop();
64
+
65
+ values.push(left.subtract(right));
66
+
67
+ }
68
+
69
+ }
70
+
71
+
72
+
73
+ ```
74
+
75
+
76
+
77
+
78
+
79
+ ```java
80
+
81
+
82
+
83
+
84
+
85
+ import java.math.BigDecimal;
86
+
87
+ import java.util.Stack;
88
+
89
+
90
+
91
+ public class MultiplyValue implements IValue {
92
+
93
+
94
+
95
+ @Override
96
+
97
+ public void execute(Stack<BigDecimal> values) {
98
+
99
+ BigDecimal right = values.pop();
100
+
101
+ BigDecimal left = values.pop();
102
+
103
+ values.push(left.multiply(right));
104
+
105
+ }
106
+
107
+ }
108
+
109
+
110
+
111
+ ```
112
+
113
+
114
+
115
+
116
+
117
+ ```java
118
+
119
+ import java.math.BigDecimal;
120
+
121
+ import java.util.Stack;
122
+
123
+
124
+
125
+ /**
126
+
127
+ * 数値を保持するクラス
128
+
129
+ */
130
+
131
+ public class DecimalValue implements IValue {
132
+
133
+ /**
134
+
135
+ * 保持する値
136
+
137
+ */
138
+
139
+ private BigDecimal value;
140
+
141
+
142
+
143
+ public DecimalValue(String text) {
144
+
145
+
146
+
147
+ value = new BigDecimal(text);
148
+
149
+ }
150
+
151
+
152
+
153
+
154
+
155
+ @Override
156
+
157
+ public void execute(Stack<BigDecimal> values) {
158
+
159
+ // スタックに値を積む
160
+
161
+ values.push(value);
162
+
163
+ }
164
+
165
+ }
166
+
167
+
168
+
169
+ ```
170
+
171
+
172
+
173
+
174
+
175
+ ```java
176
+
177
+ public class {
178
+
179
+
180
+
181
+ public static void main(String[] args) {
182
+
183
+ Stack<BigDecimal> stack = new Stack<>();
184
+
185
+ Scanner s = new Scanner(System.in);
186
+
187
+ List<IValue> list = parseLine(s.nextLine());
188
+
189
+ for (IValue values : list) {
190
+
191
+ values.execute(stack);
192
+
193
+ }
194
+
195
+ System.out.println(stack.pop());
196
+
197
+ }
198
+
199
+
200
+
201
+ /**
202
+
203
+ * 逆ポーランドで記載された1行のテキストを分解する
204
+
205
+ *
206
+
207
+ * @param lineText 1行テキスト
208
+
209
+ * @return 分解された値リスト
210
+
211
+ */
212
+
213
+ private static List<IValue> parseLine(String lineText) {
214
+
215
+ List<IValue> resultList = new ArrayList<>();
216
+
217
+ // 空白文字で区切ってループする
218
+
219
+ for (String text: lineText.split("[\s]+")) {
220
+
221
+ for (String text : lineText.split("[\s]+")) {
222
+
223
+ // TODO 一部処理だけ実装
224
+
225
+ switch (text) {
226
+
227
+ case "+": // 足し算
228
+
229
+ resultList.add(new PlusValue());
230
+
231
+ break;
232
+
233
+ case "-":
234
+
235
+ resultList.add(new MinusValue());
236
+
237
+ break;
238
+
239
+ case "*":
240
+
241
+ resultList.add(new MultiplyValue());
242
+
243
+ break;
244
+
245
+ case "/":
246
+
247
+ resultList.add(new DivideValue());
248
+
249
+ break;
250
+
251
+ default: // その他は数値として扱う
252
+
253
+ resultList.add(new DecimalValue(text));
254
+
255
+ break;
256
+
257
+ }
258
+
259
+ }
260
+
261
+ return resultList;
262
+
263
+ }
264
+
265
+ }
266
+
267
+
268
+
269
+ ```

4

タイトルをかえました

2020/07/31 02:00

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1,497 +1 @@
1
- ```java
2
-
3
- package model;
4
-
5
-
6
-
7
- public class NumberInputAction implements CalculatorAction {
8
-
9
- String inputStr;
10
-
11
-
12
-
13
- public NumberInputAction(String label) {
14
-
15
- this.inputStr = label;
16
-
17
- }
18
-
19
-
20
-
21
- @Override
22
-
23
- public void doAction() {
24
-
25
- // labelの末尾に「^2」の表記があるか判定
26
-
27
- boolean judgment = (DataModel.getFormula()).endsWith("^2");
28
-
29
- if (judgment) {// "^2"がある場合
30
-
31
- DataModel.setFormula(""); /// 計算式の表記変更
32
-
33
- DataModel.setInputNum(inputStr);
34
-
35
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
36
-
37
- DataModel.setOperator("");
38
-
39
- DataModel.setResult("");
40
-
41
- } else {// 表示式の末尾に"^2"がない場合
42
-
43
- // ■前回の計算結果が表示されて、計算開始をする場合
44
-
45
- int jud = (DataModel.getFormula()).indexOf("=");
46
-
47
- // 計算結果が表示されているtextFieldに"="が含まれているか判断
48
-
49
- if (jud != -1) {// "="が含まれている場合
50
-
51
- DataModel.setFormula(""); /// 計算式の表記変更
52
-
53
- DataModel.setInputNum(inputStr);
54
-
55
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
56
-
57
- DataModel.setOperator("");
58
-
59
- DataModel.setResult("");
60
-
61
- } else {// "="が含まれていない場合(jud == -1)
62
-
63
- // ■通常の操作の場合
64
-
65
- /// 入力部:既に格納されている値が0かどうか判定
66
-
67
- String stred;
68
-
69
- if (DataModel.getInputNum().equals("0")) {
70
-
71
- stred = ""; // 前の0を消すことで次に入力される値が0でも対応可能になる。
72
-
73
- } else {
74
-
75
- stred = DataModel.getInputNum();
76
-
77
- }
78
-
79
- /// 表示部:既に格納されている値に今回入力した値を連結して格納
80
-
81
- DataModel.setInputNum(stred + inputStr);
82
-
83
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
84
-
85
- }
86
-
87
- }
88
-
89
- }
90
-
91
- }
92
-
93
-
94
-
95
- ```
96
-
97
-
98
-
99
-
100
-
101
- ```java
102
-
103
- package model;
104
-
105
-
106
-
107
-
108
-
109
- import java.math.BigDecimal;
110
-
111
-
112
-
113
- public class OpenInputAction implements CalculatorAction {
114
-
115
-
116
-
117
- /* 一時的に演算子を保持 */
118
-
119
- private String tmpOperator;
120
-
121
-
122
-
123
- /**
124
-
125
- * 入力値の最後に.がついている場合、.を削除して入力値に格納(「5.」→「5」)
126
-
127
- *  演算子ボタンが押されたとき、DataModelのもつ変数の中身によって変化
128
-
129
- * 1.末尾が^2の場合
130
-
131
- * 2.operatorに値が格納されていない場合(演算子初回入力)
132
-
133
- * 3.inputNumの値が格納されていない場合
134
-
135
- * 4.inputNumの値が0(0.0 0.000…も含む)で、operatorに「÷」が格納されている場合、エラーを表示
136
-
137
- * 5.+-×-のどれかが既にoperatorに格納されている場合
138
-
139
- */
140
-
141
-
142
-
143
- public OpenInputAction(String label) {
144
-
145
- this.tmpOperator = label;
146
-
147
- }
148
-
149
-
150
-
151
- public String getTmpOperator() {
152
-
153
- return tmpOperator;
154
-
155
- }
156
-
157
-
158
-
159
- @Override
160
-
161
- public void doAction() {
162
-
163
- //入力値の最後が「.」だった時,「.」を消す 
164
-
165
- if (DataModel.getInputNum().endsWith(".")) {
166
-
167
- DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
168
-
169
- }
170
-
171
- if (DataModel.getFormula().endsWith("^2")) {
172
-
173
- DataModel.setFormula(DataModel.getFormula() + getTmpOperator());
174
-
175
- DataModel.setInputNum("");
176
-
177
- DataModel.setOperator(getTmpOperator());
178
-
179
- } else if (DataModel.getOperator().equals("")) {
180
-
181
- //演算子と結果に値を格納
182
-
183
- DataModel.setResult(DataModel.getInputNum());
184
-
185
- DataModel.setOperator(getTmpOperator());
186
-
187
- //結果と計算式を表示、その後入力値の初期化
188
-
189
- DataModel.setText(DataModel.getResult());
190
-
191
- DataModel.setFormula(DataModel.getResult() + DataModel.getOperator());
192
-
193
- DataModel.setInputNum("");
194
-
195
- } else if (DataModel.getInputNum().equals("")) {
196
-
197
- //演算子を格納
198
-
199
- DataModel.setOperator(getTmpOperator());
200
-
201
- DataModel.setText(DataModel.getResult());
202
-
203
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + DataModel.getOperator());
204
-
205
- } else if (new BigDecimal(DataModel.getInputNum()).stripTrailingZeros().equals(new BigDecimal(0)) && DataModel.getOperator().equals("÷")) {
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
206
-
207
- DataModel.setText("0で割れません");
208
-
209
- //計算式、入力値、結果、演算子のクリア
210
-
211
- DataModel.setFormula("");
212
-
213
- DataModel.setInputNum("0");
214
-
215
- DataModel.setResult("");
216
-
217
- DataModel.setOperator("");
218
-
219
- } else {
220
-
221
- DataModel.calc();
222
-
223
- //演算子を格納
224
-
225
- DataModel.setOperator(getTmpOperator());
226
-
227
- //計算結果と計算式の表示、その後入力値の初期化
228
-
229
- DataModel.setText(DataModel.getResult());
230
-
231
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + DataModel.getOperator());
232
-
233
- DataModel.setInputNum("");
234
-
235
- }
236
-
237
- }
238
-
239
- }
240
-
241
-
242
-
243
- ```
244
-
245
- ```javapackage model;
246
-
247
-
248
-
249
- import java.math.BigDecimal;
250
-
251
-
252
-
253
- public class PowAction implements CalculatorAction {
254
-
255
- @Override
256
-
257
- public void doAction() {
258
-
259
- //二乗した値を格納
260
-
261
- BigDecimal Squared;
262
-
263
- /**
264
-
265
- * ➊初回入力時の場合
266
-
267
- * ❷演算子に「=」が格納されている場合
268
-
269
- * ➌計算式の末尾に「^2」がある場合
270
-
271
- * ➍すでに演算子がDataModelに格納されている場合
272
-
273
- */
274
-
275
- //入力値の最後が「.」だった時,「.」を消す 
276
-
277
- if (DataModel.getInputNum().endsWith(".")) {
278
-
279
- DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
280
-
281
- }
282
-
283
-
284
-
285
- if (DataModel.getInputNum().equals("")) {
286
-
287
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
288
-
289
- DataModel.setResult(Squared.toString());
290
-
291
-
292
-
293
- //表示
294
-
295
- if (DataModel.getFormula().endsWith("^2")) {
296
-
297
- DataModel.setFormula(DataModel.getFormula() + "^2");
298
-
299
- } else {
300
-
301
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
302
-
303
- }
304
-
305
- DataModel.setText(DataModel.getResult());
306
-
307
-
308
-
309
- } else if (DataModel.getOperator().equals("=")) {
310
-
311
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
312
-
313
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
314
-
315
- DataModel.setResult(Squared.toString());
316
-
317
-
318
-
319
- //計算式・計算結果の表示
320
-
321
- DataModel.setText(DataModel.getResult());
322
-
323
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum());
324
-
325
- DataModel.setInputNum("");
326
-
327
- DataModel.setOperator("");
328
-
329
-
330
-
331
- } else if (DataModel.getFormula().endsWith("^2")) {
332
-
333
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
334
-
335
- DataModel.setResult(Squared.toString());
336
-
337
-
338
-
339
- //計算式・計算結果の表示
340
-
341
- DataModel.setText(DataModel.getResult());
342
-
343
- DataModel.setFormula(DataModel.getFormula() + "^2");
344
-
345
- DataModel.setInputNum("");
346
-
347
-
348
-
349
- } else if (!DataModel.getOperator().isEmpty()) {
350
-
351
- DataModel.calc();
352
-
353
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
354
-
355
- DataModel.setResult(Squared.toString());
356
-
357
-
358
-
359
- //計算式・計算結果の表示
360
-
361
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + "^2");
362
-
363
- DataModel.setText(DataModel.getResult());
364
-
365
-
366
-
367
- } else {
368
-
369
- Squared = new BigDecimal(DataModel.getInputNum()).pow(2);
370
-
371
- DataModel.setResult(Squared.toString());
372
-
373
-
374
-
375
- //計算式・計算結果の表示
376
-
377
- DataModel.setFormula(DataModel.getInputNum() + "^2");
378
-
379
- DataModel.setText(DataModel.getResult());
380
-
381
- }
382
-
383
- }
384
-
385
- }
386
-
387
-
388
-
389
-
390
-
391
- ```
392
-
393
- ```java
394
-
395
- import view.Frame;
396
-
397
-
398
-
399
- public class CalculatorMain {
400
-
401
- public static void main(String[] args) {
402
-
403
- /* フレームの構築 */
404
-
405
- Frame frame = new Frame();
406
-
407
- frame.setVisible(true);
408
-
409
- }
410
-
411
- }
412
-
413
-
414
-
415
- ```
416
-
417
- ```java
418
-
419
- package model;
420
-
421
-
422
-
423
- public class InvAction implements CalculatorAction {
424
-
425
- @Override
426
-
427
- public void doAction(){
428
-
429
-
430
-
431
- //値に「-」が含まれているか判定
432
-
433
- int result = DataModel.getInputNum().indexOf("-");
434
-
435
- if(DataModel.getFormula().endsWith("=")){
436
-
437
-
438
-
439
- if(!DataModel.getResult().contains("-")){
440
-
441
-
442
-
443
- DataModel.setResult("-" + DataModel.getResult());
444
-
445
-
446
-
447
- }else{
448
-
449
-
450
-
451
- DataModel.setResult(DataModel.getResult().replace("-",""));
452
-
453
-
454
-
455
- }
456
-
457
- DataModel.setFormula(DataModel.getResult() + "=");
458
-
459
- DataModel.setText(DataModel.getResult());
460
-
461
-
462
-
463
- } else if(!(DataModel.getText().equals("17桁以上は表示できません") || DataModel.getText().equals("0で割れません"))) {
464
-
465
- //「-」が含まれていない時「-」を追加
466
-
467
- if (result == -1 && !DataModel.getInputNum().equals("0")) {
468
-
469
-
470
-
471
- DataModel.setInputNum("-" + DataModel.getInputNum());
472
-
473
-
474
-
475
- //「-」が含まれていた時「-」を削除
476
-
477
- } else {
478
-
479
-
480
-
481
- DataModel.setInputNum(DataModel.getInputNum().replace("-", ""));
482
-
483
-
484
-
485
- }
486
-
487
- DataModel.setText(DataModel.getInputNum());
488
-
489
- }
490
-
491
- }
492
-
493
- }
494
-
495
-
496
-
497
- ```

3

タイトルをわかりやすくしました

2020/07/29 11:16

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -416,8 +416,82 @@
416
416
 
417
417
  ```java
418
418
 
419
+ package model;
420
+
421
+
422
+
423
+ public class InvAction implements CalculatorAction {
424
+
425
+ @Override
426
+
427
+ public void doAction(){
428
+
429
+
430
+
431
+ //値に「-」が含まれているか判定
432
+
433
+ int result = DataModel.getInputNum().indexOf("-");
434
+
435
+ if(DataModel.getFormula().endsWith("=")){
436
+
437
+
438
+
439
+ if(!DataModel.getResult().contains("-")){
440
+
441
+
442
+
443
+ DataModel.setResult("-" + DataModel.getResult());
444
+
445
+
446
+
447
+ }else{
448
+
449
+
450
+
451
+ DataModel.setResult(DataModel.getResult().replace("-",""));
452
+
453
+
454
+
455
+ }
456
+
457
+ DataModel.setFormula(DataModel.getResult() + "=");
458
+
459
+ DataModel.setText(DataModel.getResult());
460
+
461
+
462
+
463
+ } else if(!(DataModel.getText().equals("17桁以上は表示できません") || DataModel.getText().equals("0で割れません"))) {
464
+
465
+ //「-」が含まれていない時「-」を追加
466
+
467
+ if (result == -1 && !DataModel.getInputNum().equals("0")) {
468
+
469
+
470
+
471
+ DataModel.setInputNum("-" + DataModel.getInputNum());
472
+
473
+
474
+
475
+ //「-」が含まれていた時「-」を削除
476
+
477
+ } else {
478
+
479
+
480
+
481
+ DataModel.setInputNum(DataModel.getInputNum().replace("-", ""));
482
+
483
+
484
+
485
+ }
486
+
487
+ DataModel.setText(DataModel.getInputNum());
488
+
489
+ }
490
+
491
+ }
492
+
493
+ }
494
+
495
+
496
+
419
497
  ```
420
-
421
- ```java
422
-
423
- ```

2

わかりやすくしました

2020/07/29 02:55

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -1,65 +1,423 @@
1
- ### 前提・実現したいこと
2
-
3
-
4
-
5
- main関数で最初のswitch文に入り、
6
-
7
- case1の時に入れ替えを行うことは理解できたのですが、
8
-
9
-
10
-
11
- 最初のcase1の中で
12
-
13
- 後ろのほうから比較していかないといけないのはなぜでしょうか?
14
-
15
-
16
-
17
-
18
-
19
- 例えば
20
-
21
- 70 50 100 20 とあった時、入れ替えを以下のコードだけで行うと
22
-
23
- 「50 70 20 100」となるのは理解できます。
24
-
25
1
  ```java
26
2
 
27
- (省略)
3
+ package model;
28
-
4
+
5
+
6
+
29
- int num1 = data.compare(i - 1, i);
7
+ public class NumberInputAction implements CalculatorAction {
30
-
8
+
31
- switch (num1) {
9
+ String inputStr;
10
+
11
+
12
+
32
-
13
+ public NumberInputAction(String label) {
14
+
15
+ this.inputStr = label;
16
+
17
+ }
18
+
19
+
20
+
33
- case 1:
21
+ @Override
22
+
34
-
23
+ public void doAction() {
24
+
25
+ // labelの末尾に「^2」の表記があるか判定
26
+
27
+ boolean judgment = (DataModel.getFormula()).endsWith("^2");
28
+
29
+ if (judgment) {// "^2"がある場合
30
+
31
+ DataModel.setFormula(""); /// 計算式の表記変更
32
+
33
+ DataModel.setInputNum(inputStr);
34
+
35
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
36
+
37
+ DataModel.setOperator("");
38
+
39
+ DataModel.setResult("");
40
+
41
+ } else {// 表示式の末尾に"^2"がない場合
42
+
43
+ // ■前回の計算結果が表示されて、計算開始をする場合
44
+
45
+ int jud = (DataModel.getFormula()).indexOf("=");
46
+
47
+ // 計算結果が表示されているtextFieldに"="が含まれているか判断
48
+
49
+ if (jud != -1) {// "="が含まれている場合
50
+
51
+ DataModel.setFormula(""); /// 計算式の表記変更
52
+
53
+ DataModel.setInputNum(inputStr);
54
+
55
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
56
+
57
+ DataModel.setOperator("");
58
+
59
+ DataModel.setResult("");
60
+
61
+ } else {// "="が含まれていない場合(jud == -1)
62
+
35
- //入れ替える
63
+ // ■通常の操作の場合
64
+
36
-
65
+ /// 入力部:既に格納されている値が0かどうか判定
66
+
67
+ String stred;
68
+
69
+ if (DataModel.getInputNum().equals("0")) {
70
+
71
+ stred = ""; // 前の0を消すことで次に入力される値が0でも対応可能になる。
72
+
73
+ } else {
74
+
37
- data.exchange(i - 1, i);
75
+ stred = DataModel.getInputNum();
76
+
38
-
77
+ }
78
+
79
+ /// 表示部:既に格納されている値に今回入力した値を連結して格納
80
+
39
- default:
81
+ DataModel.setInputNum(stred + inputStr);
40
-
82
+
41
- break;
83
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
42
84
 
43
85
  }
44
86
 
45
- (省略)
46
-
47
- ```
48
-
49
-
50
-
51
- そのため後ろのほうから
52
-
53
- 100 と 20 を 比較→ 20 100
54
-
55
- 20 と 70 を 比較→ 20 70
56
-
57
- 20 と 50 を 比較→ 20 50
58
-
59
- となって「20 50 70 100」としなければならない理由もわかります。
60
-
61
-
62
-
63
- ですが、case1のなかでしなければならない理由はなんでしょうか?
64
-
65
- 以下のコードでもよさそうと思ってしまうのですが…
87
+ }
88
+
89
+ }
90
+
91
+ }
92
+
93
+
94
+
95
+ ```
96
+
97
+
98
+
99
+
100
+
101
+ ```java
102
+
103
+ package model;
104
+
105
+
106
+
107
+
108
+
109
+ import java.math.BigDecimal;
110
+
111
+
112
+
113
+ public class OpenInputAction implements CalculatorAction {
114
+
115
+
116
+
117
+ /* 一時的に演算子を保持 */
118
+
119
+ private String tmpOperator;
120
+
121
+
122
+
123
+ /**
124
+
125
+ * 入力値の最後に.がついている場合、.を削除して入力値に格納(「5.」→「5」)
126
+
127
+ *  演算子ボタンが押されたとき、DataModelのもつ変数の中身によって変化
128
+
129
+ * 1.末尾が^2の場合
130
+
131
+ * 2.operatorに値が格納されていない場合(演算子初回入力)
132
+
133
+ * 3.inputNumの値が格納されていない場合
134
+
135
+ * 4.inputNumの値が0(0.0 0.000…も含む)で、operatorに「÷」が格納されている場合、エラーを表示
136
+
137
+ * 5.+-×-のどれかが既にoperatorに格納されている場合
138
+
139
+ */
140
+
141
+
142
+
143
+ public OpenInputAction(String label) {
144
+
145
+ this.tmpOperator = label;
146
+
147
+ }
148
+
149
+
150
+
151
+ public String getTmpOperator() {
152
+
153
+ return tmpOperator;
154
+
155
+ }
156
+
157
+
158
+
159
+ @Override
160
+
161
+ public void doAction() {
162
+
163
+ //入力値の最後が「.」だった時,「.」を消す 
164
+
165
+ if (DataModel.getInputNum().endsWith(".")) {
166
+
167
+ DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
168
+
169
+ }
170
+
171
+ if (DataModel.getFormula().endsWith("^2")) {
172
+
173
+ DataModel.setFormula(DataModel.getFormula() + getTmpOperator());
174
+
175
+ DataModel.setInputNum("");
176
+
177
+ DataModel.setOperator(getTmpOperator());
178
+
179
+ } else if (DataModel.getOperator().equals("")) {
180
+
181
+ //演算子と結果に値を格納
182
+
183
+ DataModel.setResult(DataModel.getInputNum());
184
+
185
+ DataModel.setOperator(getTmpOperator());
186
+
187
+ //結果と計算式を表示、その後入力値の初期化
188
+
189
+ DataModel.setText(DataModel.getResult());
190
+
191
+ DataModel.setFormula(DataModel.getResult() + DataModel.getOperator());
192
+
193
+ DataModel.setInputNum("");
194
+
195
+ } else if (DataModel.getInputNum().equals("")) {
196
+
197
+ //演算子を格納
198
+
199
+ DataModel.setOperator(getTmpOperator());
200
+
201
+ DataModel.setText(DataModel.getResult());
202
+
203
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + DataModel.getOperator());
204
+
205
+ } else if (new BigDecimal(DataModel.getInputNum()).stripTrailingZeros().equals(new BigDecimal(0)) && DataModel.getOperator().equals("÷")) {
206
+
207
+ DataModel.setText("0で割れません");
208
+
209
+ //計算式、入力値、結果、演算子のクリア
210
+
211
+ DataModel.setFormula("");
212
+
213
+ DataModel.setInputNum("0");
214
+
215
+ DataModel.setResult("");
216
+
217
+ DataModel.setOperator("");
218
+
219
+ } else {
220
+
221
+ DataModel.calc();
222
+
223
+ //演算子を格納
224
+
225
+ DataModel.setOperator(getTmpOperator());
226
+
227
+ //計算結果と計算式の表示、その後入力値の初期化
228
+
229
+ DataModel.setText(DataModel.getResult());
230
+
231
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + DataModel.getOperator());
232
+
233
+ DataModel.setInputNum("");
234
+
235
+ }
236
+
237
+ }
238
+
239
+ }
240
+
241
+
242
+
243
+ ```
244
+
245
+ ```javapackage model;
246
+
247
+
248
+
249
+ import java.math.BigDecimal;
250
+
251
+
252
+
253
+ public class PowAction implements CalculatorAction {
254
+
255
+ @Override
256
+
257
+ public void doAction() {
258
+
259
+ //二乗した値を格納
260
+
261
+ BigDecimal Squared;
262
+
263
+ /**
264
+
265
+ * ➊初回入力時の場合
266
+
267
+ * ❷演算子に「=」が格納されている場合
268
+
269
+ * ➌計算式の末尾に「^2」がある場合
270
+
271
+ * ➍すでに演算子がDataModelに格納されている場合
272
+
273
+ */
274
+
275
+ //入力値の最後が「.」だった時,「.」を消す 
276
+
277
+ if (DataModel.getInputNum().endsWith(".")) {
278
+
279
+ DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
280
+
281
+ }
282
+
283
+
284
+
285
+ if (DataModel.getInputNum().equals("")) {
286
+
287
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
288
+
289
+ DataModel.setResult(Squared.toString());
290
+
291
+
292
+
293
+ //表示
294
+
295
+ if (DataModel.getFormula().endsWith("^2")) {
296
+
297
+ DataModel.setFormula(DataModel.getFormula() + "^2");
298
+
299
+ } else {
300
+
301
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
302
+
303
+ }
304
+
305
+ DataModel.setText(DataModel.getResult());
306
+
307
+
308
+
309
+ } else if (DataModel.getOperator().equals("=")) {
310
+
311
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
312
+
313
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
314
+
315
+ DataModel.setResult(Squared.toString());
316
+
317
+
318
+
319
+ //計算式・計算結果の表示
320
+
321
+ DataModel.setText(DataModel.getResult());
322
+
323
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum());
324
+
325
+ DataModel.setInputNum("");
326
+
327
+ DataModel.setOperator("");
328
+
329
+
330
+
331
+ } else if (DataModel.getFormula().endsWith("^2")) {
332
+
333
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
334
+
335
+ DataModel.setResult(Squared.toString());
336
+
337
+
338
+
339
+ //計算式・計算結果の表示
340
+
341
+ DataModel.setText(DataModel.getResult());
342
+
343
+ DataModel.setFormula(DataModel.getFormula() + "^2");
344
+
345
+ DataModel.setInputNum("");
346
+
347
+
348
+
349
+ } else if (!DataModel.getOperator().isEmpty()) {
350
+
351
+ DataModel.calc();
352
+
353
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
354
+
355
+ DataModel.setResult(Squared.toString());
356
+
357
+
358
+
359
+ //計算式・計算結果の表示
360
+
361
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + "^2");
362
+
363
+ DataModel.setText(DataModel.getResult());
364
+
365
+
366
+
367
+ } else {
368
+
369
+ Squared = new BigDecimal(DataModel.getInputNum()).pow(2);
370
+
371
+ DataModel.setResult(Squared.toString());
372
+
373
+
374
+
375
+ //計算式・計算結果の表示
376
+
377
+ DataModel.setFormula(DataModel.getInputNum() + "^2");
378
+
379
+ DataModel.setText(DataModel.getResult());
380
+
381
+ }
382
+
383
+ }
384
+
385
+ }
386
+
387
+
388
+
389
+
390
+
391
+ ```
392
+
393
+ ```java
394
+
395
+ import view.Frame;
396
+
397
+
398
+
399
+ public class CalculatorMain {
400
+
401
+ public static void main(String[] args) {
402
+
403
+ /* フレームの構築 */
404
+
405
+ Frame frame = new Frame();
406
+
407
+ frame.setVisible(true);
408
+
409
+ }
410
+
411
+ }
412
+
413
+
414
+
415
+ ```
416
+
417
+ ```java
418
+
419
+ ```
420
+
421
+ ```java
422
+
423
+ ```

1

削除しました

2020/07/29 02:55

投稿

tapipi
tapipi

スコア13

test CHANGED
File without changes
test CHANGED
@@ -63,251 +63,3 @@
63
63
  ですが、case1のなかでしなければならない理由はなんでしょうか?
64
64
 
65
65
  以下のコードでもよさそうと思ってしまうのですが…
66
-
67
-
68
-
69
- ```java
70
-
71
- for (int i = 1; i < 100; i++) {
72
-
73
- int num1 = data.compare(i - 1, i);
74
-
75
- switch (num1) {
76
-
77
- case 1:
78
-
79
- //入れ替える
80
-
81
- data.exchange(i - 1, i);
82
-
83
- default:
84
-
85
- break;
86
-
87
- }
88
-
89
- for (int n = i; n > 0; n--) {
90
-
91
- int num2 = data.compare(n - 1, n);
92
-
93
- switch (num2) {
94
-
95
- case 1:
96
-
97
- data.exchange(n - 1, n);
98
-
99
- default:
100
-
101
- break;
102
-
103
- }
104
-
105
- }
106
-
107
- }
108
-
109
- ```
110
-
111
-
112
-
113
- 49,50あたりから何か必要そうになるのは分かるのですが
114
-
115
- これが1000とかになるとどうしても考えられなくなります。
116
-
117
- みなさんはどのように考えておりますか?
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
- ### 該当のソースコード
128
-
129
-
130
-
131
- ```java
132
-
133
- public class Change {
134
-
135
-
136
-
137
- public static void main(String[] args) {
138
-
139
- ListManager data = new ListManager();
140
-
141
-
142
-
143
- for (int i = 1; i < 100; i++) {
144
-
145
- /*
146
-
147
- signumに渡した数値によって以下の値が返ります。
148
-
149
-   引数がゼロより大きい場合 ⇒1
150
-
151
-   引数がゼロの場合 ⇒0
152
-
153
-   引数がゼロより小さい場合 ⇒-1
154
-
155
- */
156
-
157
- int num1 = data.compare(i - 1, i);
158
-
159
- switch (num1) {
160
-
161
- case 1:
162
-
163
- //入れ替える
164
-
165
- data.exchange(i - 1, i);
166
-
167
- //後ろから入れ替えていく
168
-
169
- for (int n = i; n > 0; n--) {
170
-
171
- int num2 = data.compare(n - 1, n);
172
-
173
- switch (num2) {
174
-
175
- case 1:
176
-
177
- data.exchange(n - 1, n);
178
-
179
- default:
180
-
181
- break;
182
-
183
- }
184
-
185
- }
186
-
187
- default:
188
-
189
- break;
190
-
191
- }
192
-
193
- }
194
-
195
- data.checkResult();
196
-
197
- }
198
-
199
- }
200
-
201
- ```
202
-
203
-
204
-
205
- ```java
206
-
207
- public class ListManager {
208
-
209
- private int[] dataList;
210
-
211
- private int compareCount;
212
-
213
- private int exchangeCount;
214
-
215
-
216
-
217
- public ListManager() {
218
-
219
- // データをランダムに作成する
220
-
221
- Random random = new Random();
222
-
223
- dataList = new int[100];
224
-
225
- for (int i = 0; i < dataList.length; i++) {
226
-
227
- dataList[i] = random.nextInt(10000);
228
-
229
- }
230
-
231
- }
232
-
233
-
234
-
235
- /**
236
-
237
- * 2つのデータを比較
238
-
239
- *
240
-
241
- * @param index1
242
-
243
- * @param index2
244
-
245
- * @return -1:index1のデータが小さい, 1:index2のデータが小さい, 0:同じデータ
246
-
247
- */
248
-
249
- public int compare(int index1, int index2) {
250
-
251
- compareCount++;
252
-
253
- return (int) Math.signum(dataList[index1] - dataList[index2]);
254
-
255
- }
256
-
257
-
258
-
259
- /**
260
-
261
- * 2つのデータを入れ替え
262
-
263
- *
264
-
265
- * @param index1
266
-
267
- * @param index2
268
-
269
- */
270
-
271
- public void exchange(int index1, int index2) {
272
-
273
- exchangeCount++;
274
-
275
- int tmp = dataList[index1];
276
-
277
- dataList[index1] = dataList[index2];
278
-
279
- dataList[index2] = tmp;
280
-
281
- }
282
-
283
-
284
-
285
- /**
286
-
287
- * ソートチェック
288
-
289
- */
290
-
291
- public void checkResult() {
292
-
293
- int data = dataList[0];
294
-
295
- for (int i = 1; i < dataList.length; i++) {
296
-
297
- if (data > dataList[i]) {
298
-
299
- throw new RuntimeException("ソートされていない: [" + (i - 1) + "]=" + data + ", [" + i + "]=" + dataList[i]);
300
-
301
- }
302
-
303
- data = dataList[i];
304
-
305
- }
306
-
307
- System.out.println("ソートOK: 比較=" + compareCount + ", 入れ替え=" + exchangeCount);
308
-
309
- }
310
-
311
-
312
-
313
- ```