回答編集履歴

3

追記1

2021/07/15 07:56

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -389,3 +389,13 @@
389
389
 
390
390
 
391
391
  …とやっていく。
392
+
393
+
394
+
395
+ ----
396
+
397
+
398
+
399
+ 後、『**値渡し**』と『**参照渡し**』を意識しましょう。
400
+
401
+ (もしかしたらこれが原因の可能性も?)

2

誤字脱字修正

2021/07/15 07:56

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -336,9 +336,9 @@
336
336
 
337
337
 
338
338
 
339
- ``Java
339
+ ```Java
340
-
340
+
341
- if( isSorted( array1[i], array1[i-1], false ){
341
+ if( isSorted( array1[i], array1[i-1], false ) ){
342
342
 
343
343
  // 交換アルゴリズム!!
344
344
 

1

デバッグ方法について

2021/07/15 07:54

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -15,3 +15,377 @@
15
15
 
16
16
 
17
17
  デバッガを使うなり、いわゆる『printfデバッグ』をするなりしましょう。
18
+
19
+
20
+
21
+ ----------------
22
+
23
+
24
+
25
+ デバッグをしたとかなら、その旨を書きましょう。
26
+
27
+ 『どのように試した』とか『その結果』とか。
28
+
29
+
30
+
31
+ Javaとかの言語はmainメソッドから始まります。
32
+
33
+
34
+
35
+ まずはmainメソッドを探しましょう。
36
+
37
+
38
+
39
+ そうすると、Main5_7.mainメソッドになりますね。
40
+
41
+
42
+
43
+ この中を読む。
44
+
45
+
46
+
47
+ ```Java
48
+
49
+ // 配列を宣言し、設定
50
+
51
+      int[] arrays1= {96,45,31,29,84,77};
52
+
53
+ // 表示! (as 降順)
54
+
55
+ display(arrays1, false);
56
+
57
+ // ソート (as 昇順)
58
+
59
+ arraySort(arrays1, true);
60
+
61
+ // 表示! (as 昇順)
62
+
63
+ display(arrays1, true);
64
+
65
+ // ソート (as 降順)
66
+
67
+ arraySort(arrays1, false);
68
+
69
+ // 表示! (as 昇順)
70
+
71
+ display(arrays1, true);
72
+
73
+ ```
74
+
75
+
76
+
77
+ ですね。
78
+
79
+
80
+
81
+ displayメソッドとかが呼ばれているので、displayメソッドの中も潜っちゃいましょう!
82
+
83
+
84
+
85
+ ```Java
86
+
87
+ public static void display(int[] array, boolean isSorted) {
88
+
89
+ // 引数 isSorted が trueなら
90
+
91
+ if(isSorted) {
92
+
93
+ // 整えられている扱い
94
+
95
+ System.out.println("配列は整えられています。");
96
+
97
+ // それ以外(false) なら
98
+
99
+ } else {
100
+
101
+ // 整えられていない扱い
102
+
103
+ System.out.println("配列は整えられていません。");
104
+
105
+ }
106
+
107
+     // 一つずつ表示
108
+
109
+ for(int value : array) {
110
+
111
+ System.out.println(value);
112
+
113
+ }//3
114
+
115
+ }
116
+
117
+ ```
118
+
119
+ これをint[] arrays1= {96,45,31,29,84,77}; の場合でやってみる。
120
+
121
+
122
+
123
+ そうすると、想定通りになるはずです。
124
+
125
+
126
+
127
+ 次に arraySortメソッドが呼ばれています。
128
+
129
+
130
+
131
+ なのでこれも潜っちゃいましょう!
132
+
133
+
134
+
135
+ ```Java
136
+
137
+ public static void arraySort(int[] array, boolean orderType) {
138
+
139
+ // boolean型の変数aを宣言(???)
140
+
141
+ boolean a = true;
142
+
143
+ // 引数 orderTypeがtrueなら
144
+
145
+ if(orderType) {//4
146
+
147
+ // フラグ a が trueの間
148
+
149
+ while(a) {
150
+
151
+          // 要素数分ループ
152
+
153
+ for(int i=0 ; i<array.length-1 ; i++) {
154
+
155
+ // 一旦フラグを折る
156
+
157
+ a=false;
158
+
159
+ // ソート済みじゃないなら
160
+
161
+ if(array[i]>array[i+1]) {
162
+
163
+ // フラグを立てて
164
+
165
+ a=true;
166
+
167
+ // 交換!!!
168
+
169
+ change(array, i, i+1);
170
+
171
+ // int temp= array[i];
172
+
173
+ // array[i]=array[i+1];
174
+
175
+ // array[i+1]=temp;
176
+
177
+ }
178
+
179
+ }
180
+
181
+ }
182
+
183
+ // それ以外( false )なら
184
+
185
+ } else {
186
+
187
+ // フラグ a が trueの間
188
+
189
+ while(a) {
190
+
191
+ // 要素数分
192
+
193
+ for(int i=0 ; i<array.length-1 ; i++) {
194
+
195
+ // フラグを折る
196
+
197
+            a=false;
198
+
199
+ // ソート済みじゃないなら
200
+
201
+ if(array[i]<array[i+1]) {
202
+
203
+ // フラグを立てて
204
+
205
+ a=true;
206
+
207
+ // 交換!!!
208
+
209
+ change(array, i, i+1);
210
+
211
+ }
212
+
213
+ }
214
+
215
+ }
216
+
217
+ }//4
218
+
219
+ }//3
220
+
221
+ ```
222
+
223
+
224
+
225
+ これを日本語でも英語でも韓国語でも中国語でもスペイン語でもなんでもいいので、自分が読み書きできる言語で書き下してみる。(as 疑似コード)
226
+
227
+
228
+
229
+ ```
230
+
231
+ 1. boolean型のフラグ aを用意
232
+
233
+ 2. 引数 orderTypeがtrueなら
234
+
235
+ 2.1. フラグ a が trueの間
236
+
237
+ 2.1.1. 要素数分ループ
238
+
239
+ 2.1.1.1. 一旦フラグ aを折る
240
+
241
+ 2.1.1.2. ソート済みじゃないなら
242
+
243
+ 2.1.1.2.1. フラグ a を立てて
244
+
245
+ 2.1.1.2.2. 交換!!!
246
+
247
+ 3. それ以外(orderType ~ false) なら
248
+
249
+ 3.1. フラグ a が trueの間
250
+
251
+ 3.1.1. 要素数分ループ
252
+
253
+ 3.1.1.1. 一旦フラグ aを折る
254
+
255
+ 3.1.1.2. ソート済みじゃないなら
256
+
257
+ 3.1.1.2.1. フラグ a を立てて
258
+
259
+ 3.1.1.2.2. 交換!!!
260
+
261
+ ```
262
+
263
+
264
+
265
+ これを現実世界で、シミュレーションしてみましょう。
266
+
267
+ 脳内でもいいですが。
268
+
269
+
270
+
271
+ そうすると、『んー、なんか(2.1)や(3.1)とかでのフラグa を立てたり折ったりとかの処理、本当に必要か?』と感じませんか?
272
+
273
+
274
+
275
+ 別にフラグ操作をしなくても、ソートはできます。
276
+
277
+
278
+
279
+ それにフラグの役割がほとんどないです。
280
+
281
+ 他のプログラムでフラグを立てたりするのは、『条件分岐』のためです。
282
+
283
+
284
+
285
+ 今回は、『ソート済みなら、これ以上意味ないからフラグをfalseにして終了する』とかみたいな感じの役割じゃないと意味ない気がします。
286
+
287
+ 無駄な処理。
288
+
289
+
290
+
291
+ 過去質問(『学習方法』のやつだったかな)でも書いたように、『プログラミングは置いといて、現実世界でならどうするかを考える』的なものをやるべきです。
292
+
293
+
294
+
295
+ 手作業でやるときに、フラグ管理に相当する処理、しますか?
296
+
297
+
298
+
299
+ それに、処理内容も、(2.1)以降と(3.1) 以降、ほとんど同じですよね。
300
+
301
+ 単に 『昇順にする』か『降順にする』かですね。
302
+
303
+
304
+
305
+ 違いはたった一行。
306
+
307
+
308
+
309
+ if( /* ソート済みなら */ )
310
+
311
+
312
+
313
+ だけです。
314
+
315
+ 番号だと、(2.1.1.2) と (3.1.1.2)だけです。
316
+
317
+
318
+
319
+ 同じ処理で、微妙に違うだけの処理のために、コピペのような感じで分岐させるよりも、
320
+
321
+
322
+
323
+ たとえば、
324
+
325
+
326
+
327
+ ```Java
328
+
329
+ boolean isSorted( int a, int b, boolean oderType );
330
+
331
+ ```
332
+
333
+
334
+
335
+ のような感じでメソッドとして切り出して、
336
+
337
+
338
+
339
+ ``Java
340
+
341
+ if( isSorted( array1[i], array1[i-1], false ){
342
+
343
+ // 交換アルゴリズム!!
344
+
345
+ }
346
+
347
+ ```
348
+
349
+
350
+
351
+ とかみたいにやった方がいいですよ。
352
+
353
+
354
+
355
+ 引数の並びはなんでもいいですが、上記の場合は第三引数を『昇順 or 降順』の意味でやるとか。
356
+
357
+
358
+
359
+ ただ、可読性を考えた場合、boolean orderType でやるより、
360
+
361
+ **列挙型** ( Enum ) でやった方がいいかも。
362
+
363
+
364
+
365
+ 仕様として『boolean型の引数を持つこと』的な感じで定められているのなら仕方なくbooleanでやるべきですが。
366
+
367
+
368
+
369
+ そして、changeメソッドが呼ばれていますから、これも内部に潜る。
370
+
371
+
372
+
373
+ ```Java
374
+
375
+ public static void change(int[] array,int i, int j) {
376
+
377
+ int temp;
378
+
379
+ temp = array[i];
380
+
381
+ array[i] = array[j];
382
+
383
+ array[j]= temp;
384
+
385
+ }
386
+
387
+ ```
388
+
389
+
390
+
391
+ …とやっていく。