[C言語] ひし形を作成するプログラムの書き方

C言語でひし形を作成するプログラムは、通常、二重のforループを使用して実装されます。

外側のループは行を制御し、内側のループは各行におけるスペースとアスタリスクの数を制御します。

ひし形の上半分と下半分を別々に処理することで、中央を基準に対称的な形状を描画します。

このプログラムでは、スペースを適切に配置することで、アスタリスクがひし形の形状を形成するようにします。

ユーザーからひし形の高さを入力として受け取り、その高さに基づいて出力を調整することも可能です。

この記事でわかること
  • ひし形を描画するための基本的なアルゴリズム
  • C言語でのループと条件分岐の活用方法
  • ひし形の中を塗りつぶす、縁だけを描画する方法
  • 複数のひし形を描画する方法とサイズをランダムにする方法
  • プログラムのデバッグ方法と他の図形を描画するためのヒント

目次から探す

ひし形を描画するためのアルゴリズム

ひし形を描画するためには、まずその形状を理解し、適切なアルゴリズムを設計する必要があります。

ひし形は、上半分と下半分に分けて考えると理解しやすくなります。

ここでは、ひし形を描画するための基本的なアルゴリズムについて説明します。

上半分の描画

ひし形の上半分は、中央から上に向かって広がる形状をしています。

これを描画するためには、行ごとに空白とアスタリスクを適切に配置する必要があります。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = 0; i < n; i++) {
        // 空白を出力
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        // アスタリスクを出力
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
*
   ***
  *****
 *******
*********

このコードは、ひし形の上半分を描画します。

nはひし形の高さの半分を表し、iは現在の行を示します。

空白とアスタリスクの数を調整することで、上半分の形状を作成します。

下半分の描画

ひし形の下半分は、上半分の逆の形状をしています。

上半分と同様に、行ごとに空白とアスタリスクを配置します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = n - 2; i >= 0; i--) {
        // 空白を出力
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        // アスタリスクを出力
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
*******
  *****
   ***
    *

このコードは、ひし形の下半分を描画します。

上半分と同様に、空白とアスタリスクの数を調整して形状を作成します。

空白とアスタリスクの配置

ひし形を描画する際のポイントは、空白とアスタリスクの配置です。

各行における空白とアスタリスクの数は、ひし形の高さに依存します。

以下の表に、各行における空白とアスタリスクの数を示します。

スクロールできます
行番号空白の数アスタリスクの数
0n – 11
1n – 23
2n – 35
n – 102n – 1

この表を参考に、各行の空白とアスタリスクを適切に配置することで、ひし形を正確に描画することができます。

C言語でのループと条件分岐の活用

C言語でひし形を描画するためには、ループと条件分岐を効果的に活用することが重要です。

ここでは、forループとif文を用いた基本的な使い方から、ネストされたループの実装、そして完成したプログラムの例を紹介します。

forループの使い方

forループは、特定の回数だけ繰り返し処理を行うために使用されます。

ひし形を描画する際には、行ごとに空白とアスタリスクを出力するためにforループを使用します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = 0; i < n; i++) {
        printf("行番号: %d\n", i);
    }
    return 0;
}

このコードは、0からn-1までの行番号を出力します。

iはループカウンタで、nはループの終了条件を示します。

if文による条件分岐

if文は、特定の条件に基づいて処理を分岐させるために使用されます。

ひし形の描画では、空白とアスタリスクの出力を制御するためにif文を使用します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = 0; i < n; i++) {
        if (i % 2 == 0) {
            printf("偶数行: %d\n", i);
        } else {
            printf("奇数行: %d\n", i);
        }
    }
    return 0;
}

このコードは、行番号が偶数か奇数かによって異なるメッセージを出力します。

i % 2 == 0は、iが偶数であることを確認する条件です。

ネストされたループの実装

ネストされたループは、ループの中にさらにループを含む構造です。

ひし形の描画では、各行における空白とアスタリスクの出力にネストされたループを使用します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = 0; i < n; i++) {
        // 空白を出力
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        // アスタリスクを出力
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

このコードは、ひし形の上半分を描画するためのネストされたループの例です。

外側のループは行を制御し、内側のループは各行の空白とアスタリスクを制御します。

完成したプログラム

ここまでの知識を組み合わせて、ひし形全体を描画する完成したプログラムを作成します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    // 上半分の描画
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    // 下半分の描画
    for (int i = n - 2; i >= 0; i--) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

このプログラムは、ひし形の上半分と下半分を描画します。

forループとif文を組み合わせることで、ひし形の形状を正確に描画することができます。

応用例

ひし形を描画する基本的なプログラムを理解したら、次はその応用例を考えてみましょう。

ここでは、ひし形の中を塗りつぶす方法や、縁だけを描画する方法、複数のひし形を描画する方法、さらにはひし形のサイズをランダムにする方法について説明します。

ひし形の中を塗りつぶす

ひし形の中を塗りつぶすには、アスタリスクを出力する範囲を調整します。

具体的には、各行のアスタリスクの数を増やすことで実現できます。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    // 上半分の描画
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    // 下半分の描画
    for (int i = n - 2; i >= 0; i--) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

このプログラムは、ひし形の中を塗りつぶすために、各行のアスタリスクを連続して出力します。

ひし形の縁だけを描画する

ひし形の縁だけを描画するには、アスタリスクを出力する位置を条件で制御します。

具体的には、行の最初と最後のアスタリスクのみを出力します。

#include <stdio.h>
int main() {
    int n = 5; // ひし形の高さの半分
    // 上半分の描画
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            if (k == 0 || k == 2 * i) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
    // 下半分の描画
    for (int i = n - 2; i >= 0; i--) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            if (k == 0 || k == 2 * i) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

このプログラムは、ひし形の縁だけを描画するために、各行の最初と最後のアスタリスクのみを出力します。

ひし形を複数描画する

複数のひし形を描画するには、ひし形を描画する処理をループで繰り返します。

ここでは、2つのひし形を描画する例を示します。

#include <stdio.h>
void drawDiamond(int n) {
    // 上半分の描画
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    // 下半分の描画
    for (int i = n - 2; i >= 0; i--) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
}
int main() {
    int n = 5; // ひし形の高さの半分
    for (int i = 0; i < 2; i++) { // 2つのひし形を描画
        drawDiamond(n);
        printf("\n"); // ひし形の間に空行を挿入
    }
    return 0;
}

このプログラムは、drawDiamond関数を呼び出すことで、2つのひし形を描画します。

ひし形のサイズをランダムにする

ひし形のサイズをランダムにするには、rand関数を使用してランダムな高さを生成します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void drawDiamond(int n) {
    // 上半分の描画
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
    // 下半分の描画
    for (int i = n - 2; i >= 0; i--) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
}
int main() {
    srand(time(NULL)); // 乱数の種を初期化
    int n = rand() % 5 + 3; // 3から7のランダムな高さ
    drawDiamond(n);
    return 0;
}

このプログラムは、rand関数を使用して3から7の範囲でランダムな高さを生成し、その高さでひし形を描画します。

srand(time(NULL))を使用して乱数の種を初期化することで、毎回異なるサイズのひし形を描画します。

よくある質問

ひし形のサイズを変更するにはどうすればいいですか?

ひし形のサイズを変更するには、プログラム内の変数nの値を変更します。

nはひし形の高さの半分を表しており、この値を大きくするとひし形が大きくなり、小さくするとひし形が小さくなります。

例えば、n = 3に設定すると、ひし形の高さは6行になります。

プログラムが正しく動作しない場合のデバッグ方法は?

プログラムが正しく動作しない場合は、以下の方法でデバッグを行います。

  • コンパイルエラーの確認: コンパイル時にエラーメッセージが表示される場合は、その内容を確認し、該当する行を修正します。
  • 変数の値を確認: 変数の値が期待通りかどうかを確認するために、printf関数を使って変数の値を出力します。
  • ループの範囲を確認: ループの開始条件と終了条件が正しいかどうかを確認します。

特に、ループのインデックスが範囲外にアクセスしていないかをチェックします。

他の図形を描画するにはどうすればいいですか?

他の図形を描画するには、描画したい図形の形状に応じて、ループと条件分岐を適切に組み合わせます。

例えば、正方形や三角形を描画する場合は、各行に出力する文字の数と位置を調整します。

基本的な考え方は、ひし形の描画と同様に、空白とアスタリスクの配置を制御することです。

まとめ

この記事では、C言語を用いてひし形を描画する方法とその応用例について解説しました。

ひし形の描画には、ループと条件分岐を効果的に活用することが重要であり、応用例を通じてさまざまな描画方法を学びました。

これを機に、他の図形の描画にも挑戦し、C言語のプログラミングスキルをさらに向上させてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 初学者向け (30)
  • URLをコピーしました!
目次から探す