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

Cプログラムで行列を対角パターンに沿って数値出力する方法

この課題は、n×nの行列を対角パターンで出力することです。

例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。

Cプログラムで行列を対角パターンに沿って数値出力する方法

そして、実際の出力結果は以下の通りです。

Cプログラムで行列を対角パターンに沿って数値出力する方法

実行例

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 の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます。

しかしこの方法では処理が二重になり、コードの複雑度が上がってしまいます。そこで、より効率的な以下の手順を採用します。

  • まず、パターンを格納しておくための N×N サイズの行列を用意します。

  • パターンの上三角部分から要素を格納していきます。対角線に沿って左下へ進むたびに、行インデックスは 1 ずつ増加し、列インデックスは 1 ずつ減少するという規則性があります。

  • 上三角部分が完成したら、下三角部分も同じ規則(行インデックス +1、列インデックス -1)に従って残りの要素を格納します。

アルゴリズム

int printdiagonal(int n)
START
STEP 1: DECLARE int mat[n][n], i, j, k, d=1, m
STEP 2: LOOP FOR i = 0 AND i < n AND i++
    ASSIGN j AS i AND k AS 0
    LOOP FOR j = i AND j >= 0 AND j--
        ASSIGN mat[k][j] AS d
        INCREMENT d AND k BY 1
    END LOOP
END LOOP
STEP 3: LOOP FOR k = 1 AND k < n AND k++
    ASSIGN i AND m EQUALS TO k
    LOOP FOR j = n-1 AND j >= m AND j--
        ASSIGN mat[i][j] AS d;
        INCREMENT d AND i WITH 1
    END FOR
END FOR
STEP 4: LOOP FOR i = 0 AND i < n AND i++
    LOOP FOR j = 0 AND j < n AND j++
        PRINT mat[i][j]
    END FOR
    PRINT NEWLINE
END FOR
STOP

C言語による実装例

#include <stdio.h>
int printdiagonal(int n){
    int mat[n][n], i, j, k, d=1, m;
    /* 上三角部分への格納 */
    for ( i = 0; i < n; i++){
        j = i;
        k = 0;
        for ( j = i; j >= 0; j--){
            mat[k][j] = d;
            d++;
            k++;
        }
    }
    /* 下三角部分への格納 */
    for ( k = 1; k < n; k++){
        i = m = k;
        for ( j = n-1; j >= m; j--){
            mat[i][j] = d;
            d++;
            i++;
        }
    }
    /* 結果の出力 */
    for ( i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            printf("%d ", mat[i][j] );
        }
        printf("\n");
    }
}
int main(int argc, char const *argv[]){
    int n = 3;
    printdiagonal(n);
    return 0;
}

実行結果

上記のプログラムをコンパイルして実行すると、次の出力が得られます。

1 2 4
3 5 7
6 8 9

  1. C言語でスネークパターン(蛇行順)に行列を出力する方法

    n×nサイズの2次元配列が与えられたとき、要素の元の位置を一切変更せずに、スネークパターン(蛇行する順序)で配列の要素を出力するCプログラムを紹介します。例入力: arr[]= 100 99 98 97 93 94 95 96 92 91 90 89 85 86 87 88 出力: 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85このプログラムでは、行列の各行を順番に走査し、その行が偶数行か奇数行かを判定することで処理を切り替えます。偶数行(0行目、2行目など)の場合:その行の要素を左から右へ出力します。奇数行(1行

  2. Cプログラムで指定された配列から下三角行列パターンを出力する方法

    n×n の行列が与えられたとき、その行列を下三角行列(下三角形パターン)の形で出力するのが本記事のテーマです。下三角行列とは、主対角線より下の要素(主対角線上の要素を含む)が元の値をそのまま保持し、主対角線より上の要素がすべて 0 になった行列のことです。次の図を見ると理解しやすくなります。図の緑色の要素は主対角線より下(および主対角線上)の要素で、元の値がそのまま残ります。一方、赤色の要素は主対角線より上の要素で、すべて 0 に設定されます。入力と出力の例入力: matrix[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9