C言語 for文を使って*逆ピラミッドを作る

プログラミング

 

前回は「C言語のfor文を使って*でできたピラミッド」を作りました。for文の中にさらにfor文を入れることでより複雑なループ処理ができるようになりました。これを多重ループといいます。

 

今回は、ピラミッドつながりで「逆ピラミッド」を作っていこうと思います。作るのは下の画像のようなピラミッドです。

通常のピラミッドの作り方を理解できた方には復習のような内容かもしれませんが、よくわからなかったという人のためにもここで簡単に「*を使った逆ピラミッドの作り方」を解説します。

 

逆ピラミッド作成にあたっての基本的な考え方

 

ここでは「*でできた逆ピラミッド」を作るにあたっての基本的な考え方を解説していきます。基本的な考え方とは、規則性を発見してそれをプログラミで実現する考えのことです。

 

特にピラミッドの形をしたものは、具体例や見た感じの形からその規則性が発見しやすいのでfor文を使った問題としてはよく出題されます。それでは見ていきましょう。

 

具体例から規則性を発見

 

では、具体例から規則性を見つけていきましょう。以下は4段ピラミッドを書いた画像です。

確認ですが、表示するピラミッドは「*と空白(□)」で構成されています。それぞれの段で、空白が表示されてから*が表示されています。(□→*)

 

規則性は各段にある、空白と*の個数です。4段逆ピラミッドの場合、上の画像のように空白は「0→1→2→3」*は「7→5→3→1」と個数が増減します。

 

それぞれ、空白は2づつ減り、*は1づつ増えていますがこれは等差数列です。つまり、この逆ピラミッドには各段に等差数列の規則があることが分かりました。では、次にその等差数列をプログラムに落としていきましょう。

 

規則性をプログラムであらわす

 

先ほども言ったように規則性は等差数列です。それでは、空白と*のそれぞれを始めに代入された逆ピラミッドの段数を使って等差数列をあらわしていきましょう。

 

今回は、ユーザーに逆ピラミッドの段数を指定してもらいます。入力してもらう段数を変数dansuをとして宣言します。また、変数iをi段目として使います(i=1,2,3,4…)

 

するとまず空白は、「1段目は0個」、「段目は1個」、「段目は2個」とi段目に対して1つ引いた個数になっているので、i段目の空白の個数は「i-1」となります。

 

次に*の個数は、先ほどの4段ピラミッドの1段目は「2*4-1=7個」で、3段ピラミッドの1段目は「2*3-1」となることから逆ピラミッドの1段目は必ず「2*dansu-1」個です。

 

つまり、等差数列でいう初項が「2*dansu-1」となり、2づつ減っていくので交差は-2となります。等差数列の公式にこれを当てはめると、以下の画像のように「2(dansu-i)+1」となります。

これで*の個数が分かったので、あとはfor文であらわすだけです。下で実際に作ったプログラムコードがあるので、先ほど発見した規則(今回でいえば等差数列)をどう使っているのかを確認してください。

*でできた逆ピラミッドのプログラムコード

 

以下が実際の逆ピラミッドのコードです。正常に動作することが確認できたので、必要に応じてコピペして使ってもらって大丈夫です。また、変数に関しても分かりにくかったら自分のわかりやすいように改変してください。

それでは実際に実行してみた結果を見てみましょう。コマンドプロンプトでソースコードをコンパイルしてエラーがなければ、そのまま実行です。

しっかりと表示されていますね。段数は実行するたびに好きに変えられるので、例えば20とかにしても大きな逆ピラミッドがちゃんとでてきます。

 

規則性の部分を見てもわかる通り、逆ピラミッドは通常のピラミッドよりもけっこう難しいです。特に、*の個数のところはそのままコードを見せられただけでは絶対わからないと思います。多くのサイトではここら辺の部分の説明がなかったので、細かく付け足してみました。

 

最後にもう一度言いますが、パッと見て規則性が分からないときはいくつかの具体例をボーと見て、その変化に注目してください。簡単、難しいに限らずアルゴリズムを作るときは具体例から落とし込むことが規則性を発見する近道です。

 

コメント