[C言語] ひし形を作成するプログラムの書き方
C言語でひし形を作成するプログラムは、通常、二重のforループを使用して実装されます。
外側のループは行を制御し、内側のループは各行におけるスペースとアスタリスクの数を制御します。
ひし形の上半分と下半分を別々に処理することで、中央を基準に対称的な形状を描画します。
このプログラムでは、スペースを適切に配置することで、アスタリスクがひし形の形状を形成するようにします。
ユーザーからひし形の高さを入力として受け取り、その高さに基づいて出力を調整することも可能です。
ひし形を描画するためのアルゴリズム
ひし形を描画するためには、まずその形状を理解し、適切なアルゴリズムを設計する必要があります。
ひし形は、上半分と下半分に分けて考えると理解しやすくなります。
ここでは、ひし形を描画するための基本的なアルゴリズムについて説明します。
上半分の描画
ひし形の上半分は、中央から上に向かって広がる形状をしています。
これを描画するためには、行ごとに空白とアスタリスクを適切に配置する必要があります。
#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;
}
*******
*****
***
*
このコードは、ひし形の下半分を描画します。
上半分と同様に、空白とアスタリスクの数を調整して形状を作成します。
空白とアスタリスクの配置
ひし形を描画する際のポイントは、空白とアスタリスクの配置です。
各行における空白とアスタリスクの数は、ひし形の高さに依存します。
以下の表に、各行における空白とアスタリスクの数を示します。
行番号 | 空白の数 | アスタリスクの数 |
---|---|---|
0 | n – 1 | 1 |
1 | n – 2 | 3 |
2 | n – 3 | 5 |
… | … | … |
n – 1 | 0 | 2n – 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))
を使用して乱数の種を初期化することで、毎回異なるサイズのひし形を描画します。
まとめ
この記事では、C言語を用いてひし形を描画する方法とその応用例について解説しました。
ひし形の描画には、ループと条件分岐を効果的に活用することが重要であり、応用例を通じてさまざまな描画方法を学びました。
これを機に、他の図形の描画にも挑戦し、C言語のプログラミングスキルをさらに向上させてみてください。