KISSはKeep it simple, stupid!の略で,プログラミングやシステム開発の世界でよく使われる格言である。格言といっても最後にstupid!(このまぬけやろう)と付くので上等なものではない。システム設計やプログラミングでは複雑なものをシンプルにすることが重要であり,それにもまして,気をつけなくてはいけないのは,シンプルなものをシンプルなままにしておくことだ。
こうしろうは,関西の大学の院生さんが,学生にプログラミングを教えるために開いているサイトでJavaの勉強を続けている。
前回(198話)に引き続き練習問題に取り組む。
1
11
111
1111
11111
と表示するプログラムを作れという問題に対し,こうしろうが作ったプログラムが以下である。
---------------------------------------------------------- int i; int j=0; for(i=1;i<100000;i*=10){ System.out.println(j+=i); } ----------------------------------------------------------よく考えてあると言えなくもない。iの値を1から始め,10倍していきjに加算していくのだ。しかし,この問題はどう見てもforループのネスト(入れ子)を作ることがテーマである。
---------------------------------------------------------- for (i=0;i<5;i++) { for (j=0;j<i+1;j++) { System.out.print("1"); } System.out.print("\n"); } ----------------------------------------------------------ネストの中で1を並べたほうが簡単だし,ロジックとして汎用性があるだろう。
次に,こうしろうが頭をひねったのがこの問題。
1 2 3 4 5 6
2 3 4 5 6
3 4 5 6
4 5 6
5 6
6
と表示するプログラムを作れ。
以下が,こうしろうがひねりだしたコードである。
---------------------------------------------------------- for(i=6;i>0;i--){ for(j=7;j<(i+7);j++){ System.out.print(j-i+" "); } System.out.print("\n"); } ----------------------------------------------------------iを6から,jを7から始めて,jがi+7より小さい間,j とiの差を表示させると,たしかに123456,23456,・・・となる。「悪くはない」と感想を述べた。無駄はない。しかし,次のコードの方がはるかにわかりやすいだろう。
---------------------------------------------------------- for(i=1; i<7; i++){ for(j=i; j<7; j++){ System.out.print(j+" "); } System.out.println(""); } ----------------------------------------------------------jの初期値にiの値を与えれば,簡単に実現できるのだ。難しいロジックを考えるのは楽しいのだが,もっと簡単な別の方法がないかと考え直すことが,KISSにつながるだろう。