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

C++で整数の各桁を拡大表示(ズーム)するプログラムの作り方

この記事では、C++を使って整数の各桁を拡大表示(ズーム)するプログラムを紹介します。ここでの「ズーム」とは、数字を「#」などの記号を使って通常より大きな形で描画することを指します。考え方自体はシンプルですが、0から9までの各数字を大きな形式で一つずつパターン化する必要があります。

ズーム表示の基本的な考え方

各数字は5行×5列のグリッドとして表現します。二重のforループでグリッド全体を走査しながら、行・列の位置関係をもとに条件分岐を行い、「#」と空白のどちらを出力するかを決めます。たとえば「0」なら外枠だけを「#」で囲み、「8」なら上下の横線と左右の縦線を組み合わせて描画するといった具合です。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
void print_zero() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (i==0 || i==4)
                cout << '#';
            else if (j==0 || j==4)
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_one() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (j==2)
                cout << '#';
            else if ((i==1 && j==1))
                cout << '#';
            else if (i==4)
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_two() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<4; j++) {
            if (i==0 && j==4)
                cout << " ";
            else if (i==0 || i==4)
                cout << '#';
            else if (i==1 && j==0)
                cout << '#';
            else if (i==(4-j))
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_three() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (i==0 || i==2 || i==4)
                cout << '#';
            else if (j==4)
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_four() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (j==4)
                cout << '#';
            else if (i==2)
                cout << '#';
            else if (j==0 && (i==0 || i==1))
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_five() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (i==0 || i==2 || i==4)
                cout << '#';
            else if ((j==0 && i==1) ||
                     (j==4 && i==3))
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_six() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (i==0 || i==2 || i==4)
                cout << '#';
            else if ((j==0 && (i==1 || i==3)) ||
                     (j==4 && i==3))
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_seven() {
    for (int i=0 ; i<5; i++) {
        for (int j=0 ; j<5; j++) {
            if (i==0 && (j!=4))
                cout << '#';
            else if (i==2 && (j==2 || j==4))
                cout << '#';
            else if (j==3)
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_eight() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if (i==0 || i==2 || i==4)
                cout << '#';
            else if ((j==0 && (i==1 || i==3) ||
                      (j==4 && (i==1 || i==3))))
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void print_nine() {
    for (int i=0; i<5; i++) {
        for (int j=0; j<5; j++) {
            if ( i==0 || i==2 || j==4)
                cout << '#';
            else if (i==1 && j==0)
                cout << '#';
            else
                cout << " ";
        }
        cout << endl;
    }
}
void zoom_digit(int number) {
    // 数値を文字列に変換
    stringstream ss;
    ss << number;
    string str = ss.str();
    for (int k=0; k<str.length(); k++) {
        cout << endl;
        switch(str[k]-'0'){
            case 0:
                print_zero();
            continue;
            case 1:
                print_one();
            continue;
            case 2:
                print_two();
            continue;
            case 3:
                print_three();
            continue;
            case 4:
                print_four();
            continue;
            case 5:
                print_five();
            continue;
            case 6:
                print_six();
            continue;
            case 7:
                print_seven();
            continue;
            case 8:
                print_eight();
            continue;
            case 9:
                print_nine();
            continue;
        }
    }
}
int main() {
    long long number = 125478539;
    zoom_digit(number);
}

実行結果

C++で整数の各桁を拡大表示(ズーム)するプログラムの作り方

このプログラムを実行すると、整数「125478539」の各桁が「#」で構成された大きな数字として、左の桁から順番にコンソールへ出力されます。

プログラムのポイント

  • 数字ごとの描画関数: print_zero() から print_nine() まで、0〜9の各数字に対応した描画関数を個別に定義しています。
  • 数値から文字列への変換: zoom_digit() 関数内では、stringstream を使って数値を文字列に変換し、先頭の桁から順に処理できるようにしています。
  • switch文による振り分け: 各桁の値に応じて対応する描画関数を呼び出すため、桁数が異なる任意の整数にも柔軟に対応できます。
  • 大きな数値への対応: long long 型を使用しているため、非常に大きな整数でも問題なく処理できます。

カスタマイズのヒント

使用する文字を「#」から「*」や「@」などに変更したり、ループの回数を増やしてより大きなサイズで表示したりすることも簡単です。さらに、各描画関数の条件式を工夫すれば、斜めの線を加えるなど、より滑らかで見栄えの良い字形に調整することも可能です。アスキーアートの練習や、コンソールアプリケーションの演出としても活用できるでしょう。

  1. C++で行列の転置を求めるプログラムの書き方【サンプルコード付き解説】

    行列とは、数値を行と列の形式に整理して並べた長方形の配列のことです。そして「転置行列」とは、元の行列の行を列に、列を行に入れ替えて作られる新しい行列を指します。転置行列のイメージ例として、次のような3×3の行列を見てみましょう。1 2 3 4 5 6 7 8 9この行列を転置すると、次のようになります。1 4 7 2 5 8 3 6 9元の行列の1行目(1, 2, 3)が、転置後には1列目になっていることが分かります。このように、元の行列の要素 a[i][j] は、転置後には a[j][i] の位置へ移動します。C++による転置行列を求めるプログラム以下が、C++で行列の転置を求めるプログラム

  2. ユーザーが入力した数値を出力するC++プログラム

    C++では、入力と出力のためにそれぞれ「cin」と「cout」というオブジェクトを使用します。cinはistreamクラスのインスタンスであり、キーボードなどの標準入力デバイスに接続されています。一方、coutはostreamクラスのインスタンスであり、ディスプレイ画面などの標準出力デバイスに接続されています。 ユーザーが入力した数値を表示するプログラムは、以下のとおりです。 サンプルコード #include <iostream> using namespace std; int main() { int num; cout<<Enter the num