まず、ピラミッドの絵を描いてみましょう。こういう問題は、絵を見ながら考えると判りやすいですからね。
□□□■
□□■■■
□■■■■■
空白文字を使うと、回答のどこが空白文字なのかが判りずらいので、上の図では空白文字(" ")の代わりに □ 、アスタリスク("*")の代わりに■を使っています。
この絵をプログラムで書くには
下の行(プログラムで後で書き出す行)ほど、最初に出力する空白文字の数は少なくする。(1ずつ減る)
下の行(プログラムで後で書き出す行)ほど、その後に出力する"*"の数は多くする。(2ずつ増える)
という事がわかるかと思います。
*が2ずつ多くするのは、左右対称な三角形にするためです。
ここで、プログラムの構造を見てみると、次のような構造になっています。
・外側のForループは、出力する行を制御します。 (hが行の総数(高さ)、iが現在印刷中の行)
・内側の1つめのForループは、空白文字を印刷します。 (jが何個目の空白文字かを示す)
・内側の2つめのForループは、アスタリスクを印刷します。 (jが何個目の空白文字かを示す)
== ここから、質問への直接の回答です ==
1)内側の1つ目のForループについて
/* なぜ、h-i+1 なのか? なぜ、h-i じゃないのか? */
これは「一番下の段(3段目)の左側に空白文字を置くかどうか」によって決まります。
h-i+1ではなく、h-iとすれば、下のようなピラミッドが書かれることになりますが、これもピラミッドが書かれているので正しいプログラムです。 左側にもっと多くの空白が欲しければ、h-i+3とかすれば良いです。
□□■
□■■■
■■■■■
どんな出力が良いか(好きか)は、好みの問題ですから自由にして良いと思います。(h-i,h-i+1,h-i+2,h-i+3、どれでも正解です(^o^)
1)内側の2つ目のForループについて
左右対称のピラミッドにするためには、ある行には、その上の行で出力したアスタリスクに、左右それぞれ一つのアスタリスクを付け加えたものを出力する必要があります。
1つ目のForループで、空白文字の数が下にいくほど減っていますから、2つ目のループでは出力するアスタリスクの数を2つずつ増やしていけばOKということになります。
その計算をしている式が、for分の中の (i-1)2+1 です。
(i-1)2+1 = (i2) - 1 と変形できます。(分配法則)
i2で、1行したに行く毎にアスタリスクの数が2つ増えます。
-1 で、最初の行(ピラミッドの頂上)のアスタリスクの数を1にしています(1行目(i=1)の時に、i*2-1=1になりますから)
(i-1)*2+1を(i-1)*2に変えると、頂上のアスタリスクが2個のピラミッドになります(下図)。
これも正解だと思いますが、頂上のアスタリスクを1つにしたほうがピラミッドらしいですね。
□□□■■
□□■■■■
□■■■■■■
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/04/21 08:52