ブログ!七転び八起き

出版編集者→ITスタートアップ起業→事業開発コンサルをやっている太田祥平のブログです。

【Java】頭を使わないで書いたfor文のネストを用いたダメコード

f:id:otasho:20141127233017j:plain

今日、学校では…

  1. (ループ処理中での)break文
  2. (ループ処理中での)continue文
  3. 配列

…を学びました。上の写真は配列部分のノート。配列を学ぶとコードを勉強している感が更に高まって興奮してきますよね!

ですが、昨晩チラッと書いた「for文のネストと頭は使いよう」について今日は詳述したいと思います。あえて昨日の内容を書くのは、それがわたしにとってあまりに衝撃だったからです。

沢山あった練習問のうち、自分が頭を使わないでコードを書いてしまったことを痛感した問題がこちら。わたしのコードと先生のコードの違いが大きすぎて失神ものです。

Q. 繰り返し文をつかって以下のような三角形を表示してください。

(for文をネストして(二重に)使用する事。)
実行イメージー>
*
**
***
****
*****
******
*******
********
*********
**********


【わたしのコード】

練習問題を見て、頭を使わないで(アルゴリズムをきちんと考えないで)すぐにコードを書き始めてしまったわたしの恥ずかしいコードはこちら。

package and1107.java.j037;

public class ex10 {

public static void main(String args) {
// TODO 自動生成されたメソッド・スタブ
int i;

for (i=1;i<=1;i++) { //1行目は1個。
System.out.print("*");
if (i==1) {
System.out.println();
}
}
for (i=1;i<=2;i++) {
System.out.print("*");
if (i==2) {
System.out.println();
}
}
for (i=1;i<=3;i++) {
System.out.print("*");
if (i==3) {
System.out.println();
}
}
for (i=1;i<=4;i++) {
System.out.print("*");
if (i==4) {
System.out.println();
}
}
for (i=1;i<=5;i++) {
System.out.print("*");
if (i==5) {
System.out.println();
}
}
for (i=1;i<=6;i++) {
System.out.print("*");
if (i==6) {
System.out.println();
}
}
for (i=1;i<=7;i++) {
System.out.print("*");
if (i==7) {
System.out.println();
}
}
for (i=1;i<=8;i++) {
System.out.print("*");
if (i==8) {
System.out.println();
}
}
for (i=1;i<=9;i++) {
System.out.print("*");
if (i==9) {
System.out.println();
}
}
for (i=1;i<=10;i++) {
System.out.print("*");
if (i==10) {
System.out.println();
}
}
}
}

 

【先生のコード】

アルゴリズムをキチンと考えて書くとこうなるという例です。

package and1107.java.j037;


public class Ex10 {

public static void main(String args) {
// TODO 自動生成されたメソッド・スタブ

for(int i =0; i < 10 ;i++){
for (int j = 0; j <=i; j++) {
System.out.print("*");

}
System.out.println();
}


}

}

先生の回答例を見たときに「え、何これ。違う問題の回答をわたしひょっとして見ちゃいました? あれ? そういうわけではなく、同じ問題の回答みたい。なに? この違い」とひっくり返った次第です。

先生のコードをよく見ると、変数を一つではなく二つ用意して、

  1. 一つめの変数iがあるfor文で、改行を制御
  2. 二つめの変数jがあるfor文は、ネストしたfor文の中で各行における処理を制御

というもの。

自分でコードを書きながらなんでこんな面倒なことになっているんだろう…と思っていました(・_・;)

そういう時は、何かを見落としているサインなのですね。

コードを書くというのはまずはアルゴリズムを考えることという第2週目での先生の言葉をひしひしと感じた次第です! もっと精進しないとアカンですね! がんばります。