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行
アルゴリズムの概要
パターン生成の手順は以下の通りです。
- 初期化: nが偶数の場合、調整変数を設定。スペース数p = n-1、文字数s = 1で開始。
- 上半分のループ: (x-1)/2回繰り返し、各イテレーションで2行ずつ出力。奇数行は'x'から始まる交互文字、偶数行は'o'から始まる交互文字を出力。スペースと文字数を調整しながら進める。
- 中央部分(偶数nの場合): 追加の中央行を出力。n%4の値によって開始文字を決定。
- メインの中央行: 奇数nならprintx(n)、偶数nならn/2ずつの組み合わせで出力。
- 下半分の追加行(偶数nの場合): インデント付きでprintx(n/2)を出力。
- 下半分のループ: 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つのヘルパー関数(
printx、printo)で交互文字列の生成を共通化 - 奇数・偶数で分岐し、対称性を保つようスペースと文字数を制御
- 上半分は2行ずつ、下半分は1行ずつ出力することで菱形に近い形状を実現
- 計算量はO(n²)で、ネストしたループによるスペースと文字の出力が主
-
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 の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実