C言語 中が空洞のピラミッドの作り方

プログラミング

 

ピラミッド系の問題を解説したサイトはそこそこありますが、基本的にのっているのは「ピラミッド」か「逆ピラミッド」のみで、「中が空洞のピラミッド」を解説するところが他に見当たりませんでした。

 

なので、今回は「中が空洞になっているピラミッド」をC言語で作っていきます。頻出で出るわけではなく、たまたま私の通っている学校ででた宿題ですが、ほかにこの問題で困っている方がいたら参考にしてください。

中が空洞のピラミッドの規則性

今回作成する「中が空洞のピラミッド」は以下のような画像のようなピラミッドです。

規則性は、普通のピラミッドと大きく変わるわけではないのでそこまで難しくないのですが、中が空洞と言うことで新しく空白を入れるプログラムを作る必要がありそうです。以下に実際に空白と*を入れる必要がある部分を番号で振り分けてみました。

つまり、全部でdansu段あるピラミッドを作る場合、1段目と最後の段以外は基本的に①~④で構成されています。①~④と順番に説明すると、①は空白、②は1つの*、③は空白、④は1つの*、をそれぞれ表示します。

 

それだけだったら楽だったのですが、上の画像でも書いたように1段目と最後の段だけは少し勝手が違うのが分かります。1段目は①と②だけが表示されて③と④は入らず、最後の段は*だけが2つ以上続けて表示されています。

 

つまり、ただfor文でループ文を作るのではなく何らかの形で場合分け(if文)が必要と言うことになります。どこでどのような場合分けがあるかはひとまず後回しにして、ここではまず①~④をつなげた式を考えていきます。

 

①について、空白が1段目の「dansu-1」個から1づつ減少するので、初項dansu-1で交差-1とするとi段目の空白は「dansu-i」となります。

 

②、④について、*はたった1つあればいいのでprintf(“*”);と記述すればオーケーです。

 

④について、③と④は1段目では表示せず2段目から表示すると書いたのを覚えていますか?つまり、④では1段目からではなく2段目からiが始まってしまうので、等差数列においては「n=i-1」と書くことになります。よって、初項1で交差2とする等差数列のn(=i-1)番目の空白の個数は、「2i-3」となります。

 

これらをfor文であらわすと以下のようになります。

 

そして、上に書いたコードの①と②には「最後の段は表示しない」と、 ③と④には「最初の段と最後の段は表示しない」という条件をif文で付けなければいけません。それぞれ変数iが数をあらわすため、①と②にはif ( i != 1)、③と④にはif ( i != 1 && i != dansu ) という条件が付くことになります。最後の段( i ==dansu)は*が2dansu-1個付くことになるので、for文で簡単に回してあげましょう。

 

中が空洞のピラミッドのソースコード

 

上で書いた説明をコードで実際にあらわすと、以下のようなコードになります。パッと見ただけでは、全体の構成や要所要所の関係が分かりにくいと思いますが、私が書いた注釈とブロック{ }の対応関係をしっかり意識すると頭に入りやすいです。

 

注意してほしいのが、次の段に移るとき(iが変化するとき)にprintf'(“\n”);で改行を入れてあげることです。空白と*の規則性に気を取られると以外に忘れやすい所ですが、これを忘れる形が崩れます。

コマンドプロンプトでの実行結果は以下のようになります。

まずはユーザーに段数を入力してもらって、その段数の中が空洞のピラミッドを作成します。

最後に、ここで作った「中が空洞のピラミッド作成するコード」はあくまでブログ管理人が個人で考えたものなので、もっと効率的に回すことができるコード構成がある可能性があります。なので、自分でもっと効率化できる方法や改善点を思いついたらぜひその通りにしてください。

コメント