C言語で正方行列をZ字形に表示するプログラム
プログラムの概要
本記事では、C言語を使って正方行列の要素を「Z」の字形に沿って出力するプログラムを解説します。
正方行列とは、行数と列数が等しい行列のことです。n行n列の行列は「n次の正方行列」と呼ばれ、2×2、3×3、4×4などの行列が該当します。
Z字形出力のアルゴリズム
行列の要素をZ字形で表示するには、次の3つの部分を順番に出力します。
- 最上行(1行目):左端から右端までのすべての要素
- 対角成分:右上から左下へ向かう斜めの要素(両端の角は除く)
- 最下行(最終行):すべての要素
これらを順につなげると、アルファベットの「Z」の形が完成します。
3×3の行列の場合: a00 a01 a02 ← 1行目をすべて表示 a10 a11 a12 ← 対角成分のみ表示 a20 a21 a22 ← 最終行をすべて表示
C言語によるサンプルコード
/* 正方行列をZ字形に表示するプログラム */
#include<stdio.h>
int main(void){
int n, r, c;
int matrix[10][10];
printf("正方行列のサイズ n を入力してください: ");
scanf("%d", &n);
printf("\n");
printf("行列の要素を入力してください:\n");
/* 行列の要素を読み込む */
for(r = 0; r < n; r++){
for(c = 0; c < n; c++){
scanf("%d", &matrix[r][c]);
}
}
printf("\nZ字形で表示した結果: \n");
/* 1. 最上行をすべて表示 */
for(c = 0; c < n; c++){
printf("%d\t ", matrix[0][c]);
}
/* 2. 右上から左下への対角成分を表示 */
for(r = 1, c = n - 2; r < n && c >= 0; r++, c--){
printf("%d\t ", matrix[r][c]);
}
/* 3. 最下行をすべて表示 */
for(c = 1; c < n; c++){
printf("%d\t ", matrix[n - 1][c]);
}
return 0;
}※ 元のコードで使用されていた clrscr() や getch() はTurbo C++固有の関数(conio.hが必要)のため、GCCなどの標準的な開発環境でもそのまま動作するよう省略しています。
実行例
入力: 3 1 2 3 4 5 6 7 8 9 出力: 1 2 3 5 7 8 9
コードの解説
- 最初に、行列のサイズnと全要素を標準入力から読み込みます。
- 1つ目のループ:
matrix[0][0]からmatrix[0][n-1]まで、最上行の全要素を表示します。 - 2つ目のループ:行インデックスrを1ずつ増やし、列インデックスcを1ずつ減らすことで、右上から左下へ向かう対角成分だけを表示します。
- 3つ目のループ:最下行の2列目以降を表示します。左下の角(
matrix[n-1][0])は対角成分の出力に含まれるため、ここでは除外して重複を防いでいます。
Z字形部分の出力にかかる時間計算量はO(n)と非常に効率的です(行列の入力読み込み自体はO(n²)かかります)。
-
C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法
N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。 例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。 入力例と出力例 Input: 0 0 0 1 1 1 1 0 1 Output: 1 3 2 解説 上記の入力における各列の0の個数は次のとおり
-
Cプログラムで2次元行列の四隅の要素とその合計を出力する方法
概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算