C 言語で行列が対称行列かどうかをチェックする

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C 言語で行列が対称行列であるかどうかをチェックする方法を学びます。この実験では以下の手順がカバーされます。行列の次元と要素を読み取ること、対称な位置にある要素を比較することで行列が対称行列であるかどうかをチェックすること、そして行列が対称行列であるかどうかを出力することです。この実験では、C 言語で行列の対称性をチェックするプロセスを理解するのに役立つコード例付きのステップバイステップガイドが提供されます。

この実験では、まず C 言語を使って行列の次元と要素を読み取る方法を示します。次に、対称な位置にある要素を比較することで行列が対称行列であるかどうかをチェックするロジックを紹介します。最後に、行列が対称行列であるかどうかを示す結果を出力する方法をデモンストレーションします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/if_else -.-> lab-435140{{"C 言語で行列が対称行列かどうかをチェックする"}} c/for_loop -.-> lab-435140{{"C 言語で行列が対称行列かどうかをチェックする"}} c/arrays -.-> lab-435140{{"C 言語で行列が対称行列かどうかをチェックする"}} c/user_input -.-> lab-435140{{"C 言語で行列が対称行列かどうかをチェックする"}} c/output -.-> lab-435140{{"C 言語で行列が対称行列かどうかをチェックする"}} end

次元と要素の読み取り

このステップでは、行列の対称性をチェックするために C 言語で行列の次元と要素を読み取る方法を学びます。ユーザーが行列のサイズと要素を入力できるプログラムを作成します。

まず、行列の対称性をチェックするプログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano symmetric_matrix.c

次に、行列の次元と要素を読み取るための以下のコードを追加します。

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Print the entered matrix
    printf("\nEntered Matrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

プログラムをコンパイルして実行します。

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

出力例:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

Entered Matrix:
1 2 3
2 4 5
3 5 6

コードの主要な部分を解説しましょう。

  • #define MAX_SIZE 100 は、バッファオーバーフローを防ぐために行列の最大サイズを設定します。
  • scanf() は、行列の次元と個々の要素を読み取るために使用されます。
  • 入れ子になったループは、行列の要素を入力して表示するために使用されます。
  • このプログラムは、ユーザーが最大 100x100 の任意のサイズの正方行列を入力できるようにします。

A[i][j] = A[j][i] かどうかをチェックする

このステップでは、前のプログラムを修正して、行と列にまたがる要素を比較することで行列が対称行列であるかどうかをチェックします。

既存のファイルを開き、コードを更新します。

cd ~/project
nano symmetric_matrix.c

前のコードを以下の実装に置き換えます。

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];
    bool is_symmetric = true;

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Check symmetry
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                is_symmetric = false;
                break;
            }
        }
        if (!is_symmetric) break;
    }

    // Print symmetry result
    if (is_symmetric) {
        printf("\nThe matrix is symmetric.\n");
    } else {
        printf("\nThe matrix is not symmetric.\n");
    }

    return 0;
}

プログラムをコンパイルして実行します。

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

対称行列の出力例:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

The matrix is symmetric.

非対称行列の出力例:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 4
Enter element [1][1]: 5
Enter element [1][2]: 6
Enter element [2][0]: 7
Enter element [2][1]: 8
Enter element [2][2]: 9

The matrix is not symmetric.

コードの要点:

  • is_symmetric というブール型の変数で行列の対称性を追跡します。
  • 入れ子になったループで matrix[i][j]matrix[j][i] を比較します。
  • 要素に違いがある場合、is_symmetricfalse に設定されます。
  • 非対称性が見つかった場合、プログラムはループから早期に抜け出します。

対称行列かどうかを出力する

この最後のステップでは、行列の対称性に関するより詳細な出力を提供するようにプログラムを拡張し、コードのモジュール性を向上させるための関数を作成します。

既存のファイルを開き、コードを更新します。

cd ~/project
nano symmetric_matrix.c

前のコードを以下の実装に置き換えます。

#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

// Function to check matrix symmetry
bool is_symmetric_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] != matrix[j][i]) {
                return false;
            }
        }
    }
    return true;
}

// Function to print matrix
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\nMatrix:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, matrix[MAX_SIZE][MAX_SIZE];

    // Read matrix dimensions
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // Read matrix elements
    printf("Enter matrix elements:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("Enter element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // Print the entered matrix
    print_matrix(matrix, n);

    // Check and print symmetry status
    if (is_symmetric_matrix(matrix, n)) {
        printf("\nSymmetry Analysis:\n");
        printf("✓ The matrix is symmetric.\n");
        printf("  - All elements A[i][j] are equal to A[j][i]\n");
        printf("  - Matrix is invariant under transpose\n");
    } else {
        printf("\nSymmetry Analysis:\n");
        printf("✗ The matrix is not symmetric.\n");
        printf("  - Some elements A[i][j] are not equal to A[j][i]\n");
    }

    return 0;
}

プログラムをコンパイルして実行します。

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

対称行列の出力例:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 2
Enter element [1][1]: 4
Enter element [1][2]: 5
Enter element [2][0]: 3
Enter element [2][1]: 5
Enter element [2][2]: 6

Matrix:
   1    2    3
   2    4    5
   3    5    6

Symmetry Analysis:
✓ The matrix is symmetric.
  - All elements A[i][j] are equal to A[j][i]
  - Matrix is invariant under transpose

非対称行列の出力例:

Enter the size of the square matrix: 3
Enter matrix elements:
Enter element [0][0]: 1
Enter element [0][1]: 2
Enter element [0][2]: 3
Enter element [1][0]: 4
Enter element [1][1]: 5
Enter element [1][2]: 6
Enter element [2][0]: 7
Enter element [2][1]: 8
Enter element [2][2]: 9

Matrix:
   1    2    3
   4    5    6
   7    8    9

Symmetry Analysis:
✗ The matrix is not symmetric.
  - Some elements A[i][j] are not equal to A[j][i]

主な改良点:

  • コードの整理を行うために is_symmetric_matrix() 関数を追加しました。
  • 行列の内容を表示する print_matrix() 関数を作成しました。
  • 詳細な対称性分析を含む出力を強化しました。
  • 対称性の状態を強調するために視覚的なインジケータ (✓/✗) を使用しました。

まとめ

この実験では、C 言語で行列の次元と要素を読み取り、その行列が対称行列であるかどうかをチェックする方法を学びます。まず、ユーザーが行列のサイズと要素を入力できるプログラムを作成します。次に、各要素 A[i][j] が対応する要素 A[j][i] と等しいことを検証することで、行列が対称行列であるかどうかをチェックするようにプログラムを修正します。最後に、行列が対称行列であるかどうかを出力します。

完了したステップから得られる主要な学習ポイントには、scanf() を使用して行列の次元と要素を読み取ること、入力された行列を表示すること、および行列の要素を比較して対称性を判断することが含まれます。このプログラムは、ユーザーが最大 100x100 の任意のサイズの正方行列を入力できるようにします。