C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で2D図形をコンソールに出力するプログラムの作成方法


このチュートリアルでは、C++を使って2D図形をコンソールに出力するプログラムについて詳しく解説します。

図形を作成するために必要なパラメータ(半径、辺の長さ、幅など)が与えられ、それに応じて厚みのない輪郭だけの図形を出力するのが本プログラムの目的です。

対応する図形の種類

このプログラムでは、アスタリスク(*)を使って以下の4種類の2D図形を描画します。

  • : 半径を指定して出力
  • 長方形: 縦の長さと横の幅を指定して出力
  • 三角形: 辺の長さを指定して出力
  • 六角形: 辺の長さを指定して出力

プログラムの実装例

#include <bits/stdc++.h>
using namespace std;
void print_circle(int radius){
    for (int i = 0; i <= 2 * radius; i++){
        for (int j = 0; j <= 2 * radius; j++){
            double distance = sqrt((double)(i - radius) * (i -
            radius) + (j - radius) * (j - radius));
            if (distance > radius - 0.5 &&
                distance < radius + 0.5)
                printf("*");
            else
            printf(" ");
        }
        printf("\n");
    }
}
void print_rectangle(int l, int b){
    int i, j;
    for (i = 1; i <= l; i++){
        for (j = 1; j <= b; j++)
            if (i == 1 || i == l || j == 1 || j == b)
                printf("*");
            else
                printf(" ");
            printf("\n");
    }
}
void print_triangle(int side){
    int i, j;
    for (i = 1; i <= side; i++){
        for (j = i; j < side; j++)
            printf(" ");
        for (j = 1; j <= (2 * i - 1); j++){
            if (i == side || j == 1 || j == (2 * i - 1))
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}
void print_hexagon(int length){
    int l, j, i, k;
    for (i = 1, k = length, l = 2 * length - 1; i < length;
    i++, k--, l++){
        for (j = 0; j < 3 * length; j++)
            if (j >= k && j <= l)
                printf("*");
            else
                printf(" ");
                printf("\n");
        }
        for (i = 0, k = 1, l = 3 * length - 2; i < length; i++,
        k++, l--){
            for (j = 0; j < 3 * length; j++)
            if (j >= k && j <= l)
                printf("*");
            else
            printf(" ");
            printf("\n");
        }
    }
    void calc_pattern(int choice){
        int radius, length, breadth, side;
        switch (choice){
            case 1:
                radius = 4;
                print_circle(radius);
                break;
            case 2:
                length = 3, breadth = 8;
                print_rectangle(length, breadth);
                break;
            case 3:
                side = 6;
                print_triangle(side);
                break;
            case 4:
                side = 4;
                print_hexagon(side);
                break;
            default:
                printf("Invalid choice\n");
    }
}
int main(){
    int choice = 1;
    calc_pattern(choice);
    return 0;
}

各関数の仕組み

円の出力(print_circle)

各座標(i, j)と図形の中心との距離をユークリッド距離として計算し、その距離が「半径 - 0.5」より大きく「半径 + 0.5」より小さい場合にアスタリスクを出力します。この許容範囲を設けることで、文字グリッド上でも滑らかな輪郭の円が描かれます。

長方形の出力(print_rectangle)

現在の行または列が端(1行目・最終行・1列目・最終列)に位置する場合にのみアスタリスクを出力することで、外枠だけの中空の長方形を描画します。

三角形の出力(print_triangle)

各行の先頭に適切な数の空白を挿入して図形を中央に寄せ、左右の斜辺と底辺に相当する位置のみアスタリスクを出力します。

六角形の出力(print_hexagon)

上半分と下半分の2つのループに処理を分け、各行ごとにアスタリスクを表示する開始位置と終了位置を制御することで、対称的な六角形を描画します。

出力結果

choice に 1 を指定して実行した場合、半径4の円が出力されます。

      *****
     **  **
    **   **
  *        *
 *          *
 *          *
  **      **
   **    **
    *****

このように、選択した図形に応じて対応する関数が呼び出され、コンソール上に2D図形が出力されます。switch文による選択処理を組み込んでいるため、ユーザー入力を受け付けるように改造すれば、任意の図形を選択できる対話的なプログラムへと拡張することも可能です。

  1. C++で数値のパリティ(奇偶性)を求めるプログラム

    このチュートリアルでは、C++を使って数値のパリティ(奇偶性)を求める方法について解説します。パリティとは、ある数値を2進数で表したときに含まれる「1」の個数が、奇数であるか偶数であるかを指します。本記事では、入力として与えられた数値のパリティを効率的に判定するアルゴリズムを紹介します。パリティの求め方ここで紹介する手法では、ビット演算を活用します。ポイントとなるのは n & (n - 1) という式です。この式は、n の最下位にある「1」のビットを消去する働きがあります。この操作を n が 0 になるまで繰り返し、ループが回った回数(=1のビットの個数)から奇偶を判定します。C++での実装例

  2. C++で二分木を見やすい形式で2次元配列に出力する方法

    本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ