しむしむてるるの日記&雑談 同人誌の進捗やら仕事のあれこれやら書いています。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

プログラムの練習問題2-画面に*を三角形に表示させる2-

プログラムコードの組み方を考える記事の第2回。
今回は、
     *     
***
*****
*******
*********
***********
と画面に表示するプログラムを考えたいと思います。

とりあえず、1行ずつ表示させてみましょうか?
public class Main {
public static void main( String[] args) {
System.out.println(" *");
System.out.println(" ***");
System.out.println(" *****");
System.out.println(" *******");
System.out.println(" *********");
System.out.println("***********");
}
}
単純に表示させたい文字をprintlnで表示させてるだけです。
これで一応表示はできました。
できました...けど、プログラムとしてどうなの?って感じですね(^^;

もう少しスマートにするために、表示内容を解析してみましょう。
まず、表示内容ですが" "と"*"だけの組み合わせになっています。
そして、1行目は" "を5つと"*"を1つ表示させています。
2行目は" "を4つと"*"を3つ。
同様に3行目は" "を3つと"*"を5つ
.....
何か法則が見えてきませんか?
 法則1 " "(スペース)の数は行数が増える度に1つずつ減っている
 法則2 "*"の数は行数が増える度に2つずつ増えている
この2つの法則がありますね。

でも、これだけだとプログラムまで落とせません。
なぜ?
だって、これだけだと1行目の表示が出来ませんから、
1行目に表示させる" "と"*"の数が分からないとプログラムが書けません。

では、それを考えてみましょう。
まず"*"の数ですが、これは単純ですね。1つ表示させれば良いのですから。
そして" "の数は5つです。
さて、ではこの条件でプログラムを作ってみましょう。
と言っても、いきなりだとどう書けば良いのか分からないかもしれません。
なので、実際にコードに落とす前にフローを考えてみます。
 1. 1行目に表示させる" "と"*"の数を設定。
   " "の数はspaceNum,"*"の数はhosiNumと言う変数名とする。
 2. spaceNumの数だけ" "を表示
 3. hosiNumの数だけ"*"を表示
 4. 改行する(2・3は1行に続けて表示するだけなので改行が必要)
 5. 次の行の表示の為にspaceNumとhosiNumの数を変更
   spaceNumは1つ減らす。
   hosiNumは2つ増やす。
 6. 2~4を表示させたい行数分繰り返す。
これで、プログラムが書けそうです。
そして、実際にプログラムにするとこんな感じになります。
public class Main2 {
public static void main( String[] args) {
int spaceNum = 5;
int hosiNum = 1;
for( int i=0; i<6; i++){
for( int j=0; j<spaceNum; j++){
System.out.print(" ");
}
for( int j=0; j<hosiNum; j++){
System.out.print("*");
}
System.out.println("");
spaceNum--;
hosiNum+=2;
}
}
}

ありゃ? なんか、始めのプログラムより長くなってしまいました。(^^;
でも、それで良いんです。
それはなぜでしょう?

その答えは表示内容の変更が簡単に行えるかどうかです。
例えば、例題は6行の表示でしたが、10行の表示にするにはどうすれば良いのでしょう?
始めのプログラムであれば、println文を4つ追加する必要があります。
では、2つ目のプログラムではどうでしょう?
基本的には5行目のfor文の繰り返し回数を6から10に変えるだけです。
ね?簡単でしょう?
ただし、今回のプログラムには罠があります。
試しに10行表示のプログラムにしてみましょう。
public class Main2 {
public static void main( String[] args) {
int spaceNum = 5;
int hosiNum = 1;
for( int i=0; i<10; i++){
for( int j=0; j<spaceNum; j++){
System.out.print(" ");
}
for( int j=0; j<hosiNum; j++){
System.out.print("*");
}
System.out.println("");
spaceNum--;
hosiNum+=2;
}
}
}

どうですか? ちゃんと表示されましたか?
表示内容が
     *
***
*****
*******
*********
***********
*************
***************
*****************
*******************

こんな感じになっていませんか?
途中までは上手くいっているのに、後半が崩れちゃってます。
なぜでしょう?

結果をよく見ると、後半は表示して欲しい" "が抜けていることに気付きませんか?
つまり、" "の数が足りないのです。
なぜなら、はじめに『spaceNum=5』としてしまっているからです。
1行表示する度に1つ減りますから、5行分しか表示出来ないのです。
と言う事は、10行だと『spaceNum=9』とすれば良い事になります。
(最後の行にスペースは要らないので"表示行数-1"個となる)
もちろん、直接3行目を『spaceNum=9』としても良いのですが、
表示させたい行数も変数に入れてしまいましょう。
そうすると、こうなります。
public class Main2 {
public static void main( String[] args) {
int lineNum = 10;
int spaceNum = lineNum - 1;
int hosiNum = 1;
for( int i=0; i<lineNum; i++){
for( int j=0; j<spaceNum; j++){
System.out.print(" ");
}
for( int j=0; j<hosiNum; j++){
System.out.print("*");
}
System.out.println("");
spaceNum--;
hosiNum+=2;
}
}
}

変数lineNumを使って、1行目のスペースの数の設定とループ回数を指定できるようにしました。
これで、lineNumの数を変えるだけで表示する行数をいくらでも変えられるようになります。

どうですか? 少しはプログラムっぽくなってきていませんか?
表示する行数の変更が始めと比べ物にならないくらい簡単になっていると思います。

今回は行数の可変に対応しましたが、表示内容を可変にする事も簡単にできます。
例えば
         *
***
*******
***********
***************
*******************

こんな感じに少し横長の3角形にする事も簡単にできます。

と言う事で、次回は上のような横長3角形を作ってみましょう。
ついでにコマンドラインで表示したい行数を入力できるようにもしてみましょう。
lineNumをコマンドライン引数から取得するプログラムです。

では、また次回。

<前回:プログラムの練習問題1-画面に*を三角形に表示させる-
関連記事
スポンサーサイト
[ 2012/04/22 05:09 ] プログラム | TB(3) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック:
この記事のトラックバック URL

まとめteみた.【プログラムの練習問題2-画面に*を三角形に表示させる2-】
プログラムコードの組み方を考える記事の第2回。今回は、************************************と画面に表示するプログラムを考えたいと思います。とりあえず、1行ずつ表示させてみましょうか?publicclassMain{ pubけです。これで一応表示はできました。できました...け?...
[2012/04/22 05:20] まとめwoネタ速suru
まとめteみた.【プログラムの練習問題2-画面に*を三角形に表示させる2-】
プログラムコードの組み方を考える記事の第2回。今回は、************************************と画面に表示するプログラムを考えたいと思います。とりあえず、1行ずつ表示させてみましょうか?publicclassMain{ pubけです。これで一応表示はできました。できました...け?...
[2012/04/22 05:20] まとめwoネタ速suru
まとめteみた.【プログラムの練習問題2-画面に*を三角形に表示させる2-】
プログラムコードの組み方を考える記事の第2回。今回は、************************************と画面に表示するプログラムを考えたいと思います。とりあえず、1行ずつ表示させてみましょうか?publicclassMain{ pubけです。これで一応表示はできました。できました...け?...
[2012/04/22 05:20] まとめwoネタ速suru
FC2カウンター
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
Twitter@sweetsblast
過去ログ

2017年 08月 【1件】
2017年 06月 【3件】
2017年 05月 【3件】
2017年 04月 【3件】
2017年 03月 【5件】
2017年 01月 【1件】
2016年 09月 【2件】
2016年 04月 【2件】
2016年 03月 【2件】
2016年 01月 【5件】
2015年 12月 【3件】
2014年 05月 【1件】
2014年 04月 【1件】
2013年 12月 【1件】
2013年 03月 【4件】
2013年 02月 【3件】
2013年 01月 【1件】
2012年 12月 【3件】
2012年 11月 【4件】
2012年 10月 【2件】
2012年 09月 【4件】
2012年 08月 【2件】
2012年 07月 【3件】
2012年 06月 【11件】
2012年 05月 【11件】
2012年 04月 【9件】
2012年 03月 【15件】
2012年 02月 【17件】
2012年 01月 【5件】
2011年 12月 【14件】
2011年 11月 【11件】
2011年 10月 【19件】
2011年 09月 【10件】
2011年 08月 【4件】
2011年 07月 【11件】
2011年 06月 【4件】
2011年 05月 【1件】
2011年 04月 【17件】
2011年 03月 【29件】
2011年 02月 【24件】
2011年 01月 【30件】
2010年 12月 【30件】
2010年 11月 【22件】
2010年 10月 【26件】
2010年 09月 【27件】
2010年 08月 【30件】
2010年 07月 【27件】
2010年 06月 【24件】
2010年 05月 【7件】
2010年 04月 【6件】
2010年 03月 【3件】
2010年 02月 【6件】
2010年 01月 【8件】
2009年 12月 【8件】
2009年 11月 【5件】
2009年 10月 【7件】
2009年 09月 【18件】
2009年 08月 【22件】
2009年 07月 【14件】
2009年 06月 【16件】
2009年 05月 【28件】
2009年 04月 【25件】
2009年 03月 【5件】
2009年 01月 【2件】
2008年 12月 【1件】
2008年 11月 【2件】
2008年 10月 【3件】
2008年 09月 【6件】
2008年 08月 【3件】
2008年 07月 【2件】
2008年 06月 【2件】
2008年 05月 【3件】
2008年 04月 【4件】
2008年 03月 【11件】
2008年 02月 【12件】
2008年 01月 【7件】
2007年 12月 【8件】
2007年 11月 【5件】
2007年 10月 【8件】
2007年 09月 【6件】
2007年 08月 【15件】
2007年 07月 【10件】
2007年 06月 【14件】
2007年 05月 【12件】
2007年 04月 【10件】
2007年 03月 【7件】
2007年 02月 【19件】
2007年 01月 【18件】
2006年 12月 【25件】
2006年 11月 【27件】
2006年 10月 【19件】
2006年 09月 【26件】
2006年 08月 【12件】
2006年 07月 【5件】



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。