うっかり寝落ちしてしまってからの、朝更新。
皆様おはよーございます!
どういうわけか、最近はわからねーと怨嗟の声が聞こえてきます。
今までで一番いい先生のはずなのですが…
昨日もちょっと愚痴りました Javaの授業から席替えが行われてます。
テストをの点数を基準にグループわけしたときに点数が同じくらいになるように、
また、高い人と低い人が隣り合うように変わりました。
結果どうなったかというと、JavaのForループの説明であれば
Jsと比べてvar宣言がint宣言になっただけと言われればわかる人と
もう1回ループの書き方を一から説明されても、まだわからない人が隣同士です。
席替えぷりーず
さて、本日(昨日)はループの応用問題です。
二重ループ、foreach、なんかから出題。
その中で配列を逆順にして格納しなさいって問題がありました。
public class Main{ public static void main(String[] args) { int[] a = {10,20,30,40,50}; int[] b = new int[5]; for (int i=0;i<a.length;i++){ b[b.length-1-i] = a[i]; } for(int num:b){ System.out.println(num); } } }
先生の解答はこちら。
この問題のキーは当然、逆にするアルゴリズムです。
んで、授業では一度も言われてないことなのですが、
1回で出来ないなら、出来る範囲を少しずつ応用していく作り方です。
たしかに、このくらいは1回で書けたほうがよいのですが、
できないことは仕方ないので出来るところまで戻ってから直す手法です。
具体的にどういうことかといいます。逆順以前に配列aのループが回せないと話にならんのです。
public class Main1{ public static void main(String[] args) { int[] a = {10,20,30,40,50}; int[] b = new int[5]; for (int i=0;i<a.length;i++){ System.out.println(a[i]); } } }
これがきちんと動くことを確認してから逆順にする手順を考えましょう。
public class Main11{ public static void main(String[] args) { int[] a = {10,20,30,40,50}; int[] b = new int[5]; for (int i=0;i<a.length;i++){ b[i] = a[i]; } for(int num :b){ System.out.println(num); } } }
正順では格納できてることを確かめます。
ここまで出来てれば、ループはわかってるけど、アルゴリズムがわかんない
のだと確認が取れます。ここまで来ないのであれば基本からやり直しです。
全部聞くのと、出来るところまでやって質問するのでは
大きく違います。
それをするには、こういう手法のほうが適してるので是非覚えてほしーです。
プラス。この手の問題なのですが、別にカウント変数を用意するのを
覚えておくと便利です。
public class Main11{ public static void main(String[] args) { int[] a = {10,20,30,40,50}; int[] b = new int[5]; int cnt = b.length-1; for (int i=0;i<a.length;i++){ b[cnt] = a[i]; cnt--; } for(int num :b){ System.out.println(num); } } }
スマートなやり方ではないことが多いですが、大抵臨んだ出力は出ます!
話は変わりまして、配列は参照だから、a=bなんてやってから
b書き換えると、aから見ても変わってるよーの話がありました。
javaのいつものはまりぱたーんです。
つづいてメソッド。どうもこのあたり用語がわかりにくいです。
メソッドのメリットとして挙げられたのが下記です。
- 機能別にわけるのでプログラム全体の見通しがよくなる。
- 修正箇所が少なくてすむ
- 何度も書かないので効率があがる
これってモジュール化のメリットでは???
違う意味なのか、javaだから言い方が違うのか… むずかしいです。
12日間予定のjava基礎の授業、最後にはゲームっぽいものを作る予定だとか。
それを楽しみにすすめてみます!