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

質問編集履歴

7

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

2020/08/17 02:53

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,1 +1,136 @@
1
+ ### 前提・実現したいこと
2
+ main関数で最初のswitch文に入り、
3
+ case1の時に入れ替えを行うことは理解できたのですが、
4
+ 最初のcase1の中で
5
+ 後ろのほうから比較していかないといけないのはなぜでしょうか?
6
+ 例えば
7
+ 70 50 100 20 とあった時、入れ替えを以下のコードだけで行うと
8
+ 「50 70 20 100」となるのは理解できます。
9
+ ```java
10
+ (省略)
11
+ int num1 = data.compare(i - 1, i);
12
+ switch (num1) {
13
+ case 1:
14
+ //入れ替える
15
+ data.exchange(i - 1, i);
16
+ default:
17
+ break;
18
+ }
19
+ (省略)
20
+ ```
21
+ そのため後ろのほうから
22
+ 100 と 20 を 比較→ 20 100
23
+ 20 と 70 を 比較→ 20 70
24
+ 20 と 50 を 比較→ 20 50
25
+ となって「20 50 70 100」としなければならない理由もわかります。
26
+ ですが、case1のなかでしなければならない理由はなんでしょうか?
27
+ 以下のコードでもよさそうと思ってしまうのですが…
28
+ ```java
29
+ for (int i = 1; i < 100; i++) {
30
+ int num1 = data.compare(i - 1, i);
31
+ switch (num1) {
32
+ case 1:
33
+ //入れ替える
34
+ data.exchange(i - 1, i);
35
+ default:
36
+ break;
37
+ }
38
+ for (int n = i; n > 0; n--) {
39
+ int num2 = data.compare(n - 1, n);
40
+ switch (num2) {
41
+ case 1:
42
+ data.exchange(n - 1, n);
43
+ default:
44
+ break;
45
+ }
46
+ }
47
+ }
48
+ ```
49
+ 49,50あたりから何か必要そうになるのは分かるのですが
50
+ これが1000とかになるとどうしても考えられなくなります。
51
+ みなさんはどのように考えておりますか?
52
+ ### 該当のソースコード
53
+ ```java
54
+ public class Change {
55
+ public static void main(String[] args) {
56
+ ListManager data = new ListManager();
57
+ for (int i = 1; i < 100; i++) {
58
+ /*
59
+ signumに渡した数値によって以下の値が返ります。
60
+   引数がゼロより大きい場合 ⇒1
61
+   引数がゼロの場合 ⇒0
62
+   引数がゼロより小さい場合 ⇒-1
63
+ */
64
+ int num1 = data.compare(i - 1, i);
65
+ switch (num1) {
66
+ case 1:
67
+ //入れ替える
68
+ data.exchange(i - 1, i);
69
+ //後ろから入れ替えていく
70
+ for (int n = i; n > 0; n--) {
71
+ int num2 = data.compare(n - 1, n);
72
+ switch (num2) {
73
+ case 1:
74
+ data.exchange(n - 1, n);
75
+ default:
76
+ break;
77
+ }
78
+ }
79
+ default:
80
+ break;
81
+ }
82
+ }
83
+ data.checkResult();
84
+ }
85
+ }
86
+ ```
87
+ ```java
88
+ public class ListManager {
89
+ private int[] dataList;
90
+ private int compareCount;
91
+ private int exchangeCount;
92
+ public ListManager() {
93
+ // データをランダムに作成する
94
+ Random random = new Random();
95
+ dataList = new int[100];
96
+ for (int i = 0; i < dataList.length; i++) {
97
+ dataList[i] = random.nextInt(10000);
98
+ }
99
+ }
100
+ /**
101
+ * 2つのデータを比較
102
+ *
103
+ * @param index1
104
+ * @param index2
105
+ * @return -1:index1のデータが小さい, 1:index2のデータが小さい, 0:同じデータ
106
+ */
107
+ public int compare(int index1, int index2) {
108
+ compareCount++;
109
+ return (int) Math.signum(dataList[index1] - dataList[index2]);
110
+ }
111
+ /**
112
+ * 2つのデータを入れ替え
113
+ *
114
+ * @param index1
115
+ * @param index2
116
+ */
117
+ public void exchange(int index1, int index2) {
118
+ exchangeCount++;
119
+ int tmp = dataList[index1];
120
+ dataList[index1] = dataList[index2];
121
+ dataList[index2] = tmp;
122
+ }
123
+ /**
124
+ * ソートチェック
125
+ */
126
+ public void checkResult() {
127
+ int data = dataList[0];
128
+ for (int i = 1; i < dataList.length; i++) {
129
+ if (data > dataList[i]) {
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
130
+ throw new RuntimeException("ソートされていない: [" + (i - 1) + "]=" + data + ", [" + i + "]=" + dataList[i]);
131
+ }
132
+ data = dataList[i];
133
+ }
134
+ System.out.println("ソートOK: 比較=" + compareCount + ", 入れ替え=" + exchangeCount);
135
+ }
136
+ ```

6

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

2020/08/17 02:53

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,135 +1,1 @@
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
-
3
- ```java
4
-
5
-
6
- import java.math.BigDecimal;
7
- import java.util.Stack;
8
-
9
- public class DivideValue implements IValue {
10
-
11
- @Override
12
- public void execute(Stack<BigDecimal> values) {
13
- BigDecimal right = values.pop();
14
- BigDecimal left = values.pop();
15
- values.push(left.divide(right, 2, BigDecimal.ROUND_DOWN));
16
- }
17
- }
18
-
19
- ```
20
-
21
- ```java
22
-
23
-
24
- import java.math.BigDecimal;
25
- import java.util.Stack;
26
-
27
- public class MinusValue implements IValue {
28
-
29
- @Override
30
- public void execute(Stack<BigDecimal> values) {
31
- BigDecimal right = values.pop();
32
- BigDecimal left = values.pop();
33
- values.push(left.subtract(right));
34
- }
35
- }
36
-
37
- ```
38
-
39
-
40
- ```java
41
-
42
-
43
- import java.math.BigDecimal;
44
- import java.util.Stack;
45
-
46
- public class MultiplyValue implements IValue {
47
-
48
- @Override
49
- public void execute(Stack<BigDecimal> values) {
50
- BigDecimal right = values.pop();
51
- BigDecimal left = values.pop();
52
- values.push(left.multiply(right));
53
- }
54
- }
55
-
56
- ```
57
-
58
-
59
- ```java
60
- import java.math.BigDecimal;
61
- import java.util.Stack;
62
-
63
- /**
64
- * 数値を保持するクラス
65
- */
66
- public class DecimalValue implements IValue {
67
- /**
68
- * 保持する値
69
- */
70
- private BigDecimal value;
71
-
72
- public DecimalValue(String text) {
73
-
74
- value = new BigDecimal(text);
75
- }
76
-
77
-
78
- @Override
79
- public void execute(Stack<BigDecimal> values) {
80
- // スタックに値を積む
81
- values.push(value);
82
- }
83
- }
84
-
85
- ```
86
-
87
-
88
- ```java
89
- public class {
90
-
91
- public static void main(String[] args) {
92
- Stack<BigDecimal> stack = new Stack<>();
93
- Scanner s = new Scanner(System.in);
94
- List<IValue> list = parseLine(s.nextLine());
95
- for (IValue values : list) {
96
- values.execute(stack);
97
- }
98
- System.out.println(stack.pop());
99
- }
100
-
101
- /**
102
- * 逆ポーランドで記載された1行のテキストを分解する
103
- *
104
- * @param lineText 1行テキスト
105
- * @return 分解された値リスト
106
- */
107
- private static List<IValue> parseLine(String lineText) {
108
- List<IValue> resultList = new ArrayList<>();
109
- // 空白文字で区切ってループする
110
- for (String text: lineText.split("[\s]+")) {
111
- for (String text : lineText.split("[\s]+")) {
112
- // TODO 一部処理だけ実装
113
- switch (text) {
114
- case "+": // 足し算
115
- resultList.add(new PlusValue());
116
- break;
117
- case "-":
118
- resultList.add(new MinusValue());
119
- break;
120
- case "*":
121
- resultList.add(new MultiplyValue());
122
- break;
123
- case "/":
124
- resultList.add(new DivideValue());
125
- break;
126
- default: // その他は数値として扱う
127
- resultList.add(new DecimalValue(text));
128
- break;
129
- }
130
- }
131
- return resultList;
132
- }
133
- }
134
-
135
- ```

5

ソースの修正

2020/08/12 13:54

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,1 +1,135 @@
1
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+
3
+ ```java
4
+
5
+
6
+ import java.math.BigDecimal;
7
+ import java.util.Stack;
8
+
9
+ public class DivideValue implements IValue {
10
+
11
+ @Override
12
+ public void execute(Stack<BigDecimal> values) {
13
+ BigDecimal right = values.pop();
14
+ BigDecimal left = values.pop();
15
+ values.push(left.divide(right, 2, BigDecimal.ROUND_DOWN));
16
+ }
17
+ }
18
+
19
+ ```
20
+
21
+ ```java
22
+
23
+
24
+ import java.math.BigDecimal;
25
+ import java.util.Stack;
26
+
27
+ public class MinusValue implements IValue {
28
+
29
+ @Override
30
+ public void execute(Stack<BigDecimal> values) {
31
+ BigDecimal right = values.pop();
32
+ BigDecimal left = values.pop();
33
+ values.push(left.subtract(right));
34
+ }
35
+ }
36
+
37
+ ```
38
+
39
+
40
+ ```java
41
+
42
+
43
+ import java.math.BigDecimal;
44
+ import java.util.Stack;
45
+
46
+ public class MultiplyValue implements IValue {
47
+
48
+ @Override
49
+ public void execute(Stack<BigDecimal> values) {
50
+ BigDecimal right = values.pop();
51
+ BigDecimal left = values.pop();
52
+ values.push(left.multiply(right));
53
+ }
54
+ }
55
+
56
+ ```
57
+
58
+
59
+ ```java
60
+ import java.math.BigDecimal;
61
+ import java.util.Stack;
62
+
63
+ /**
64
+ * 数値を保持するクラス
65
+ */
66
+ public class DecimalValue implements IValue {
67
+ /**
68
+ * 保持する値
69
+ */
70
+ private BigDecimal value;
71
+
72
+ public DecimalValue(String text) {
73
+
74
+ value = new BigDecimal(text);
75
+ }
76
+
77
+
78
+ @Override
79
+ public void execute(Stack<BigDecimal> values) {
80
+ // スタックに値を積む
81
+ values.push(value);
82
+ }
83
+ }
84
+
85
+ ```
86
+
87
+
88
+ ```java
89
+ public class {
90
+
91
+ public static void main(String[] args) {
92
+ Stack<BigDecimal> stack = new Stack<>();
93
+ Scanner s = new Scanner(System.in);
94
+ List<IValue> list = parseLine(s.nextLine());
95
+ for (IValue values : list) {
96
+ values.execute(stack);
97
+ }
98
+ System.out.println(stack.pop());
99
+ }
100
+
101
+ /**
102
+ * 逆ポーランドで記載された1行のテキストを分解する
103
+ *
104
+ * @param lineText 1行テキスト
105
+ * @return 分解された値リスト
106
+ */
107
+ private static List<IValue> parseLine(String lineText) {
108
+ List<IValue> resultList = new ArrayList<>();
109
+ // 空白文字で区切ってループする
110
+ for (String text: lineText.split("[\s]+")) {
111
+ for (String text : lineText.split("[\s]+")) {
112
+ // TODO 一部処理だけ実装
113
+ switch (text) {
114
+ case "+": // 足し算
115
+ resultList.add(new PlusValue());
116
+ break;
117
+ case "-":
118
+ resultList.add(new MinusValue());
119
+ break;
120
+ case "*":
121
+ resultList.add(new MultiplyValue());
122
+ break;
123
+ case "/":
124
+ resultList.add(new DivideValue());
125
+ break;
126
+ default: // その他は数値として扱う
127
+ resultList.add(new DecimalValue(text));
128
+ break;
129
+ }
130
+ }
131
+ return resultList;
132
+ }
133
+ }
134
+
135
+ ```

4

タイトルをかえました

2020/07/31 02:00

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,249 +1,1 @@
1
- ```java
2
- package model;
3
-
4
- public class NumberInputAction implements CalculatorAction {
5
- String inputStr;
6
-
7
- public NumberInputAction(String label) {
8
- this.inputStr = label;
9
- }
10
-
11
- @Override
12
- public void doAction() {
13
- // labelの末尾に「^2」の表記があるか判定
14
- boolean judgment = (DataModel.getFormula()).endsWith("^2");
15
- if (judgment) {// "^2"がある場合
16
- DataModel.setFormula(""); /// 計算式の表記変更
17
- DataModel.setInputNum(inputStr);
18
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
19
- DataModel.setOperator("");
20
- DataModel.setResult("");
21
- } else {// 表示式の末尾に"^2"がない場合
22
- // ■前回の計算結果が表示されて、計算開始をする場合
23
- int jud = (DataModel.getFormula()).indexOf("=");
24
- // 計算結果が表示されているtextFieldに"="が含まれているか判断
25
- if (jud != -1) {// "="が含まれている場合
26
- DataModel.setFormula(""); /// 計算式の表記変更
27
- DataModel.setInputNum(inputStr);
28
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
29
- DataModel.setOperator("");
30
- DataModel.setResult("");
31
- } else {// "="が含まれていない場合(jud == -1)
32
- // ■通常の操作の場合
33
- /// 入力部:既に格納されている値が0かどうか判定
34
- String stred;
35
- if (DataModel.getInputNum().equals("0")) {
36
- stred = ""; // 前の0を消すことで次に入力される値が0でも対応可能になる。
37
- } else {
38
- stred = DataModel.getInputNum();
39
- }
40
- /// 表示部:既に格納されている値に今回入力した値を連結して格納
41
- DataModel.setInputNum(stred + inputStr);
42
- DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
43
- }
44
- }
45
- }
46
- }
47
-
48
- ```
49
-
50
-
51
- ```java
52
- package model;
53
-
54
-
55
- import java.math.BigDecimal;
56
-
57
- public class OpenInputAction implements CalculatorAction {
58
-
59
- /* 一時的に演算子を保持 */
60
- private String tmpOperator;
61
-
62
- /**
63
- * 入力値の最後に.がついている場合、.を削除して入力値に格納(「5.」→「5」)
64
- *  演算子ボタンが押されたとき、DataModelのもつ変数の中身によって変化
65
- * 1.末尾が^2の場合
66
- * 2.operatorに値が格納されていない場合(演算子初回入力)
67
- * 3.inputNumの値が格納されていない場合
68
- * 4.inputNumの値が0(0.0 0.000…も含む)で、operatorに「÷」が格納されている場合、エラーを表示
69
- * 5.+-×-のどれかが既にoperatorに格納されている場合
70
- */
71
-
72
- public OpenInputAction(String label) {
73
- this.tmpOperator = label;
74
- }
75
-
76
- public String getTmpOperator() {
77
- return tmpOperator;
78
- }
79
-
80
- @Override
81
- public void doAction() {
82
- //入力値の最後が「.」だった時,「.」を消す 
83
- if (DataModel.getInputNum().endsWith(".")) {
84
- DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
85
- }
86
- if (DataModel.getFormula().endsWith("^2")) {
87
- DataModel.setFormula(DataModel.getFormula() + getTmpOperator());
88
- DataModel.setInputNum("");
89
- DataModel.setOperator(getTmpOperator());
90
- } else if (DataModel.getOperator().equals("")) {
91
- //演算子と結果に値を格納
92
- DataModel.setResult(DataModel.getInputNum());
93
- DataModel.setOperator(getTmpOperator());
94
- //結果と計算式を表示、その後入力値の初期化
95
- DataModel.setText(DataModel.getResult());
96
- DataModel.setFormula(DataModel.getResult() + DataModel.getOperator());
97
- DataModel.setInputNum("");
98
- } else if (DataModel.getInputNum().equals("")) {
99
- //演算子を格納
100
- DataModel.setOperator(getTmpOperator());
101
- DataModel.setText(DataModel.getResult());
102
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + DataModel.getOperator());
103
- } else if (new BigDecimal(DataModel.getInputNum()).stripTrailingZeros().equals(new BigDecimal(0)) && DataModel.getOperator().equals("÷")) {
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
104
- DataModel.setText("0で割れません");
105
- //計算式、入力値、結果、演算子のクリア
106
- DataModel.setFormula("");
107
- DataModel.setInputNum("0");
108
- DataModel.setResult("");
109
- DataModel.setOperator("");
110
- } else {
111
- DataModel.calc();
112
- //演算子を格納
113
- DataModel.setOperator(getTmpOperator());
114
- //計算結果と計算式の表示、その後入力値の初期化
115
- DataModel.setText(DataModel.getResult());
116
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + DataModel.getOperator());
117
- DataModel.setInputNum("");
118
- }
119
- }
120
- }
121
-
122
- ```
123
- ```javapackage model;
124
-
125
- import java.math.BigDecimal;
126
-
127
- public class PowAction implements CalculatorAction {
128
- @Override
129
- public void doAction() {
130
- //二乗した値を格納
131
- BigDecimal Squared;
132
- /**
133
- * ➊初回入力時の場合
134
- * ❷演算子に「=」が格納されている場合
135
- * ➌計算式の末尾に「^2」がある場合
136
- * ➍すでに演算子がDataModelに格納されている場合
137
- */
138
- //入力値の最後が「.」だった時,「.」を消す 
139
- if (DataModel.getInputNum().endsWith(".")) {
140
- DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
141
- }
142
-
143
- if (DataModel.getInputNum().equals("")) {
144
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
145
- DataModel.setResult(Squared.toString());
146
-
147
- //表示
148
- if (DataModel.getFormula().endsWith("^2")) {
149
- DataModel.setFormula(DataModel.getFormula() + "^2");
150
- } else {
151
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
152
- }
153
- DataModel.setText(DataModel.getResult());
154
-
155
- } else if (DataModel.getOperator().equals("=")) {
156
- DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
157
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
158
- DataModel.setResult(Squared.toString());
159
-
160
- //計算式・計算結果の表示
161
- DataModel.setText(DataModel.getResult());
162
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum());
163
- DataModel.setInputNum("");
164
- DataModel.setOperator("");
165
-
166
- } else if (DataModel.getFormula().endsWith("^2")) {
167
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
168
- DataModel.setResult(Squared.toString());
169
-
170
- //計算式・計算結果の表示
171
- DataModel.setText(DataModel.getResult());
172
- DataModel.setFormula(DataModel.getFormula() + "^2");
173
- DataModel.setInputNum("");
174
-
175
- } else if (!DataModel.getOperator().isEmpty()) {
176
- DataModel.calc();
177
- Squared = new BigDecimal(DataModel.getResult()).pow(2);
178
- DataModel.setResult(Squared.toString());
179
-
180
- //計算式・計算結果の表示
181
- DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + "^2");
182
- DataModel.setText(DataModel.getResult());
183
-
184
- } else {
185
- Squared = new BigDecimal(DataModel.getInputNum()).pow(2);
186
- DataModel.setResult(Squared.toString());
187
-
188
- //計算式・計算結果の表示
189
- DataModel.setFormula(DataModel.getInputNum() + "^2");
190
- DataModel.setText(DataModel.getResult());
191
- }
192
- }
193
- }
194
-
195
-
196
- ```
197
- ```java
198
- import view.Frame;
199
-
200
- public class CalculatorMain {
201
- public static void main(String[] args) {
202
- /* フレームの構築 */
203
- Frame frame = new Frame();
204
- frame.setVisible(true);
205
- }
206
- }
207
-
208
- ```
209
- ```java
210
- package model;
211
-
212
- public class InvAction implements CalculatorAction {
213
- @Override
214
- public void doAction(){
215
-
216
- //値に「-」が含まれているか判定
217
- int result = DataModel.getInputNum().indexOf("-");
218
- if(DataModel.getFormula().endsWith("=")){
219
-
220
- if(!DataModel.getResult().contains("-")){
221
-
222
- DataModel.setResult("-" + DataModel.getResult());
223
-
224
- }else{
225
-
226
- DataModel.setResult(DataModel.getResult().replace("-",""));
227
-
228
- }
229
- DataModel.setFormula(DataModel.getResult() + "=");
230
- DataModel.setText(DataModel.getResult());
231
-
232
- } else if(!(DataModel.getText().equals("17桁以上は表示できません") || DataModel.getText().equals("0で割れません"))) {
233
- //「-」が含まれていない時「-」を追加
234
- if (result == -1 && !DataModel.getInputNum().equals("0")) {
235
-
236
- DataModel.setInputNum("-" + DataModel.getInputNum());
237
-
238
- //「-」が含まれていた時「-」を削除
239
- } else {
240
-
241
- DataModel.setInputNum(DataModel.getInputNum().replace("-", ""));
242
-
243
- }
244
- DataModel.setText(DataModel.getInputNum());
245
- }
246
- }
247
- }
248
-
249
- ```

3

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

2020/07/29 11:16

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -207,6 +207,43 @@
207
207
 
208
208
  ```
209
209
  ```java
210
+ package model;
211
+
212
+ public class InvAction implements CalculatorAction {
213
+ @Override
214
+ public void doAction(){
215
+
216
+ //値に「-」が含まれているか判定
217
+ int result = DataModel.getInputNum().indexOf("-");
218
+ if(DataModel.getFormula().endsWith("=")){
219
+
220
+ if(!DataModel.getResult().contains("-")){
221
+
222
+ DataModel.setResult("-" + DataModel.getResult());
223
+
210
- ```
224
+ }else{
225
+
226
+ DataModel.setResult(DataModel.getResult().replace("-",""));
227
+
228
+ }
229
+ DataModel.setFormula(DataModel.getResult() + "=");
230
+ DataModel.setText(DataModel.getResult());
231
+
232
+ } else if(!(DataModel.getText().equals("17桁以上は表示できません") || DataModel.getText().equals("0で割れません"))) {
233
+ //「-」が含まれていない時「-」を追加
234
+ if (result == -1 && !DataModel.getInputNum().equals("0")) {
235
+
236
+ DataModel.setInputNum("-" + DataModel.getInputNum());
237
+
238
+ //「-」が含まれていた時「-」を削除
211
- ```java
239
+ } else {
240
+
241
+ DataModel.setInputNum(DataModel.getInputNum().replace("-", ""));
242
+
243
+ }
244
+ DataModel.setText(DataModel.getInputNum());
245
+ }
246
+ }
247
+ }
248
+
212
249
  ```

2

わかりやすくしました

2020/07/29 02:55

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -1,33 +1,212 @@
1
+ ```java
1
- ### 前提・実現したいこと
2
+ package model;
2
3
 
4
+ public class NumberInputAction implements CalculatorAction {
3
- main関数で最初のswitch文に入り、
5
+ String inputStr;
4
- case1の時に入れ替えを行うことは理解できたのですが、
5
6
 
6
- 最初のcase1の中で
7
- 後ろのほうから比較していかないといけないのはなぜでしょうか?
7
+ public NumberInputAction(String label) {
8
+ this.inputStr = label;
9
+ }
8
10
 
11
+ @Override
12
+ public void doAction() {
13
+ // labelの末尾に「^2」の表記があるか判定
14
+ boolean judgment = (DataModel.getFormula()).endsWith("^2");
15
+ if (judgment) {// "^2"がある場合
16
+ DataModel.setFormula(""); /// 計算式の表記変更
17
+ DataModel.setInputNum(inputStr);
18
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
19
+ DataModel.setOperator("");
20
+ DataModel.setResult("");
21
+ } else {// 表示式の末尾に"^2"がない場合
22
+ // ■前回の計算結果が表示されて、計算開始をする場合
23
+ int jud = (DataModel.getFormula()).indexOf("=");
24
+ // 計算結果が表示されているtextFieldに"="が含まれているか判断
25
+ if (jud != -1) {// "="が含まれている場合
26
+ DataModel.setFormula(""); /// 計算式の表記変更
27
+ DataModel.setInputNum(inputStr);
28
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
29
+ DataModel.setOperator("");
30
+ DataModel.setResult("");
31
+ } else {// "="が含まれていない場合(jud == -1)
32
+ // ■通常の操作の場合
33
+ /// 入力部:既に格納されている値が0かどうか判定
34
+ String stred;
35
+ if (DataModel.getInputNum().equals("0")) {
36
+ stred = ""; // 前の0を消すことで次に入力される値が0でも対応可能になる。
37
+ } else {
38
+ stred = DataModel.getInputNum();
39
+ }
40
+ /// 表示部:既に格納されている値に今回入力した値を連結して格納
41
+ DataModel.setInputNum(stred + inputStr);
42
+ DataModel.setText(DataModel.getInputNum()); /// 入力値・計算結果の表記変更
43
+ }
44
+ }
45
+ }
46
+ }
9
47
 
10
- 例えば
48
+ ```
11
- 70 50 100 20 とあった時、入れ替えを以下のコードだけで行うと
49
+
12
- 「50 70 20 100」となるのは理解できます。
50
+
13
51
  ```java
14
- (省略)
52
+ package model;
53
+
54
+
15
- int num1 = data.compare(i - 1, i);
55
+ import java.math.BigDecimal;
56
+
57
+ public class OpenInputAction implements CalculatorAction {
58
+
59
+ /* 一時的に演算子を保持 */
60
+ private String tmpOperator;
61
+
62
+ /**
63
+ * 入力値の最後に.がついている場合、.を削除して入力値に格納(「5.」→「5」)
64
+ *  演算子ボタンが押されたとき、DataModelのもつ変数の中身によって変化
65
+ * 1.末尾が^2の場合
66
+ * 2.operatorに値が格納されていない場合(演算子初回入力)
67
+ * 3.inputNumの値が格納されていない場合
68
+ * 4.inputNumの値が0(0.0 0.000…も含む)で、operatorに「÷」が格納されている場合、エラーを表示
69
+ * 5.+-×-のどれかが既にoperatorに格納されている場合
70
+ */
71
+
72
+ public OpenInputAction(String label) {
73
+ this.tmpOperator = label;
74
+ }
75
+
76
+ public String getTmpOperator() {
77
+ return tmpOperator;
78
+ }
79
+
80
+ @Override
16
- switch (num1) {
81
+ public void doAction() {
82
+ //入力値の最後が「.」だった時,「.」を消す 
83
+ if (DataModel.getInputNum().endsWith(".")) {
84
+ DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
85
+ }
86
+ if (DataModel.getFormula().endsWith("^2")) {
87
+ DataModel.setFormula(DataModel.getFormula() + getTmpOperator());
88
+ DataModel.setInputNum("");
89
+ DataModel.setOperator(getTmpOperator());
90
+ } else if (DataModel.getOperator().equals("")) {
91
+ //演算子と結果に値を格納
92
+ DataModel.setResult(DataModel.getInputNum());
93
+ DataModel.setOperator(getTmpOperator());
94
+ //結果と計算式を表示、その後入力値の初期化
95
+ DataModel.setText(DataModel.getResult());
96
+ DataModel.setFormula(DataModel.getResult() + DataModel.getOperator());
97
+ DataModel.setInputNum("");
98
+ } else if (DataModel.getInputNum().equals("")) {
99
+ //演算子を格納
100
+ DataModel.setOperator(getTmpOperator());
101
+ DataModel.setText(DataModel.getResult());
102
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + DataModel.getOperator());
103
+ } else if (new BigDecimal(DataModel.getInputNum()).stripTrailingZeros().equals(new BigDecimal(0)) && DataModel.getOperator().equals("÷")) {
104
+ DataModel.setText("0で割れません");
105
+ //計算式、入力値、結果、演算子のクリア
106
+ DataModel.setFormula("");
107
+ DataModel.setInputNum("0");
108
+ DataModel.setResult("");
109
+ DataModel.setOperator("");
17
- case 1:
110
+ } else {
111
+ DataModel.calc();
112
+ //演算子を格納
113
+ DataModel.setOperator(getTmpOperator());
114
+ //計算結果と計算式の表示、その後入力値の初期化
115
+ DataModel.setText(DataModel.getResult());
116
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + DataModel.getOperator());
117
+ DataModel.setInputNum("");
118
+ }
119
+ }
120
+ }
121
+
122
+ ```
123
+ ```javapackage model;
124
+
125
+ import java.math.BigDecimal;
126
+
127
+ public class PowAction implements CalculatorAction {
128
+ @Override
129
+ public void doAction() {
130
+ //二乗した値を格納
131
+ BigDecimal Squared;
132
+ /**
133
+ * ➊初回入力時の場合
134
+ * ❷演算子に「=」が格納されている場合
135
+ * ➌計算式の末尾に「^2」がある場合
136
+ * ➍すでに演算子がDataModelに格納されている場合
137
+ */
138
+ //入力値の最後が「.」だった時,「.」を消す 
139
+ if (DataModel.getInputNum().endsWith(".")) {
140
+ DataModel.setInputNum(DataModel.getInputNum().substring(0, DataModel.getInputNum().length() - 1));
141
+ }
142
+
143
+ if (DataModel.getInputNum().equals("")) {
144
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
145
+ DataModel.setResult(Squared.toString());
146
+
18
- //入れ替える
147
+ //表示
148
+ if (DataModel.getFormula().endsWith("^2")) {
19
- data.exchange(i - 1, i);
149
+ DataModel.setFormula(DataModel.getFormula() + "^2");
20
- default:
150
+ } else {
21
- break;
151
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
22
152
  }
153
+ DataModel.setText(DataModel.getResult());
154
+
155
+ } else if (DataModel.getOperator().equals("=")) {
156
+ DataModel.setFormula(DataModel.getFormula().substring(0, DataModel.getFormula().length() - 1) + "^2");
157
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
158
+ DataModel.setResult(Squared.toString());
159
+
160
+ //計算式・計算結果の表示
161
+ DataModel.setText(DataModel.getResult());
162
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum());
163
+ DataModel.setInputNum("");
164
+ DataModel.setOperator("");
165
+
166
+ } else if (DataModel.getFormula().endsWith("^2")) {
167
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
168
+ DataModel.setResult(Squared.toString());
169
+
170
+ //計算式・計算結果の表示
171
+ DataModel.setText(DataModel.getResult());
172
+ DataModel.setFormula(DataModel.getFormula() + "^2");
173
+ DataModel.setInputNum("");
174
+
175
+ } else if (!DataModel.getOperator().isEmpty()) {
176
+ DataModel.calc();
177
+ Squared = new BigDecimal(DataModel.getResult()).pow(2);
178
+ DataModel.setResult(Squared.toString());
179
+
180
+ //計算式・計算結果の表示
181
+ DataModel.setFormula(DataModel.getFormula() + DataModel.getInputNum() + "^2");
182
+ DataModel.setText(DataModel.getResult());
183
+
23
- (省略)
184
+ } else {
185
+ Squared = new BigDecimal(DataModel.getInputNum()).pow(2);
186
+ DataModel.setResult(Squared.toString());
187
+
188
+ //計算式・計算結果の表示
189
+ DataModel.setFormula(DataModel.getInputNum() + "^2");
190
+ DataModel.setText(DataModel.getResult());
191
+ }
192
+ }
193
+ }
194
+
195
+
24
196
  ```
197
+ ```java
198
+ import view.Frame;
25
199
 
26
- そのため後ろのほうから
27
- 100 と 20 を 比較→ 20 100
200
+ public class CalculatorMain {
28
- 20 と 70 を 比較→ 20 70
29
- 20 と 50 を 比較→ 20 50
30
- となって「20 50 70 100」としなければならない理由もわかります。
201
+ public static void main(String[] args) {
202
+ /* フレームの構築 */
203
+ Frame frame = new Frame();
204
+ frame.setVisible(true);
205
+ }
206
+ }
31
207
 
32
- ですが、case1のなかでしなければならない理由はなんでしょうか?
208
+ ```
33
- 以下のコードでもよさそうと思ってしまうのですが…
209
+ ```java
210
+ ```
211
+ ```java
212
+ ```

1

削除しました

2020/07/29 02:55

投稿

tapipi
tapipi

スコア13

title CHANGED
File without changes
body CHANGED
@@ -30,128 +30,4 @@
30
30
  となって「20 50 70 100」としなければならない理由もわかります。
31
31
 
32
32
  ですが、case1のなかでしなければならない理由はなんでしょうか?
33
- 以下のコードでもよさそうと思ってしまうのですが…
33
+ 以下のコードでもよさそうと思ってしまうのですが…
34
-
35
- ```java
36
- for (int i = 1; i < 100; i++) {
37
- int num1 = data.compare(i - 1, i);
38
- switch (num1) {
39
- case 1:
40
- //入れ替える
41
- data.exchange(i - 1, i);
42
- default:
43
- break;
44
- }
45
- for (int n = i; n > 0; n--) {
46
- int num2 = data.compare(n - 1, n);
47
- switch (num2) {
48
- case 1:
49
- data.exchange(n - 1, n);
50
- default:
51
- break;
52
- }
53
- }
54
- }
55
- ```
56
-
57
- 49,50あたりから何か必要そうになるのは分かるのですが
58
- これが1000とかになるとどうしても考えられなくなります。
59
- みなさんはどのように考えておりますか?
60
-
61
-
62
-
63
-
64
- ### 該当のソースコード
65
-
66
- ```java
67
- public class Change {
68
-
69
- public static void main(String[] args) {
70
- ListManager data = new ListManager();
71
-
72
- for (int i = 1; i < 100; i++) {
73
- /*
74
- signumに渡した数値によって以下の値が返ります。
75
-   引数がゼロより大きい場合 ⇒1
76
-   引数がゼロの場合 ⇒0
77
-   引数がゼロより小さい場合 ⇒-1
78
- */
79
- int num1 = data.compare(i - 1, i);
80
- switch (num1) {
81
- case 1:
82
- //入れ替える
83
- data.exchange(i - 1, i);
84
- //後ろから入れ替えていく
85
- for (int n = i; n > 0; n--) {
86
- int num2 = data.compare(n - 1, n);
87
- switch (num2) {
88
- case 1:
89
- data.exchange(n - 1, n);
90
- default:
91
- break;
92
- }
93
- }
94
- default:
95
- break;
96
- }
97
- }
98
- data.checkResult();
99
- }
100
- }
101
- ```
102
-
103
- ```java
104
- public class ListManager {
105
- private int[] dataList;
106
- private int compareCount;
107
- private int exchangeCount;
108
-
109
- public ListManager() {
110
- // データをランダムに作成する
111
- Random random = new Random();
112
- dataList = new int[100];
113
- for (int i = 0; i < dataList.length; i++) {
114
- dataList[i] = random.nextInt(10000);
115
- }
116
- }
117
-
118
- /**
119
- * 2つのデータを比較
120
- *
121
- * @param index1
122
- * @param index2
123
- * @return -1:index1のデータが小さい, 1:index2のデータが小さい, 0:同じデータ
124
- */
125
- public int compare(int index1, int index2) {
126
- compareCount++;
127
- return (int) Math.signum(dataList[index1] - dataList[index2]);
128
- }
129
-
130
- /**
131
- * 2つのデータを入れ替え
132
- *
133
- * @param index1
134
- * @param index2
135
- */
136
- public void exchange(int index1, int index2) {
137
- exchangeCount++;
138
- int tmp = dataList[index1];
139
- dataList[index1] = dataList[index2];
140
- dataList[index2] = tmp;
141
- }
142
-
143
- /**
144
- * ソートチェック
145
- */
146
- public void checkResult() {
147
- int data = dataList[0];
148
- for (int i = 1; i < dataList.length; i++) {
149
- if (data > dataList[i]) {
150
- throw new RuntimeException("ソートされていない: [" + (i - 1) + "]=" + data + ", [" + i + "]=" + dataList[i]);
151
- }
152
- data = dataList[i];
153
- }
154
- System.out.println("ソートOK: 比較=" + compareCount + ", 入れ替え=" + exchangeCount);
155
- }
156
-
157
- ```