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

C言語で対称的な二重三角形パターンを出力する

指定された行数に基づき、最小限の計算量で対称的な二重三角形パターンを出力するCプログラムを解説します。

実行例

入力: 5
出力:
    X
     X
    O X
     O X
  X O X O X
   X O
    X O
     X
      X

この問題は大きく分けて3つのパートで構成されます。

  • 上半分の出力: nが奇数ならn-1行、偶数ならn-2行
  • 中央部分の出力: nが奇数なら1行、偶数なら3行
  • 下半分の出力: nが奇数ならn-1行、偶数ならn-2行

アルゴリズムの概要

パターン生成の手順は以下の通りです。

  1. 初期化: nが偶数の場合、調整変数を設定。スペース数p = n-1、文字数s = 1で開始。
  2. 上半分のループ: (x-1)/2回繰り返し、各イテレーションで2行ずつ出力。奇数行は'x'から始まる交互文字、偶数行は'o'から始まる交互文字を出力。スペースと文字数を調整しながら進める。
  3. 中央部分(偶数nの場合): 追加の中央行を出力。n%4の値によって開始文字を決定。
  4. メインの中央行: 奇数nならprintx(n)、偶数nならn/2ずつの組み合わせで出力。
  5. 下半分の追加行(偶数nの場合): インデント付きでprintx(n/2)を出力。
  6. 下半分のループ: x行分を出力。スペースを増やしながら、文字数qを調整して対称形を完成させる。

C言語実装コード

#include <stdio.h>

// 'x'から始まる交互文字列を出力
int printx(int n) {
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            printf("x ");
        else
            printf("o ");
    }
    return 0;
}

// 'o'から始まる交互文字列を出力
int printo(int n) {
    for (int i = 1; i <= n; i++) {
        if (i % 2 != 0)
            printf("o ");
        else
            printf("x ");
    }
    return 0;
}

// パターン全体を出力する関数
int printpattern(int n) {
    int x = n;
    int i, j;
    
    // 偶数nの調整
    if (n % 2 == 0)
        x = x - 1;
    
    int p = n - 1;  // 初期スペース数
    int s = 1;      // 初期文字数
    
    // 上半分:各イテレーションで2行出力
    for (i = 1; i <= (x - 1) / 2; i++) {
        for (j = 1; j <= p; j++)
            printf(" ");
        
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
        printf("\n");
        
        p++;
        for (j = 1; j <= p; j++)
            printf(" ");
        
        if (i % 2 != 0)
            printx(s);
        else
            printo(s);
        printf("\n");
        
        p--;
        s++;
    }
    
    // 偶数nの場合:追加の上部中央行
    if (n % 2 == 0) {
        for (i = 1; i <= p; i++)
            printf(" ");
        if (n % 4 != 0)
            printx(n / 2);
        else
            printo(n / 2);
        printf("\n");
    }
    
    // メインの中央行
    if (n % 2 != 0) {
        printx(n);
    } else {
        if (n % 4 != 0) {
            printx(n / 2);
            printx(n / 2);
        } else {
            printx(n / 2);
            printo(n / 2);
        }
    }
    printf("\n");
    
    // 偶数nの場合:追加の下部中央行
    if (n % 2 == 0) {
        printf(" ");
        printx(n / 2);
        printf("\n");
    }
    
    // 下半分
    p = 1;
    if (n % 2 == 0) {
        x--;
        p = 2;
    }
    int q = x / 2;
    
    for (i = 1; i <= x; i++) {
        for (j = 1; j <= p; j++)
            printf(" ");
        printx(q);
        
        if (i % 2 == 0)
            q--;
        printf("\n");
        p++;
    }
    printf("\n");
    return 1;
}

int main() {
    int n = 5;
    printpattern(n);
    return 0;
}

実行結果(n=5の場合)

    X
     X
    O X
     O X
  X O X O X
   X O
    X O
     X
      X

ポイント

  • 2つのヘルパー関数(printxprinto)で交互文字列の生成を共通化
  • 奇数・偶数で分岐し、対称性を保つようスペースと文字数を制御
  • 上半分は2行ずつ、下半分は1行ずつ出力することで菱形に近い形状を実現
  • 計算量はO(n²)で、ネストしたループによるスペースと文字の出力が主
  1. Cプログラムで行列を対角パターンに沿って数値出力する方法

    この課題は、n×nの行列を対角パターンで出力することです。 例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。 そして、実際の出力結果は以下の通りです。 実行例 Input: 3 Output: 1 2 4 3 5 7 6 8 9 Input: 4 Output: 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 考え方 一見すると、「数値 n を受け取り n×n の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます

  2. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実