在 C 语言中检查矩阵是否对称

CBeginner
立即练习

简介

在本实验中,你将学习如何在 C 编程中检查矩阵是否对称。本实验涵盖以下步骤:读取矩阵的维度和元素、通过比较对称位置的元素来检查矩阵是否对称,以及打印矩阵是否对称的结果。本实验提供了带有代码示例的分步指南,以帮助你理解在 C 中检查矩阵对称性的过程。

本实验首先展示如何使用 C 编程读取矩阵的维度和元素。然后介绍通过比较对称位置的元素来检查矩阵是否对称的逻辑。最后,本实验演示如何打印结果,表明矩阵是否对称。

读取维度和元素

在这一步中,你将学习如何在 C 编程中读取矩阵的维度和元素,以检查矩阵的对称性。我们将创建一个程序,允许用户输入矩阵的大小和元素。

首先,让我们为矩阵对称程序创建一个新的 C 文件:

cd ~/project
nano symmetric_matrix.c

现在,添加以下代码来读取矩阵的维度和元素:

#include <stdio.h>

#define MAX_SIZE 100

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

    // 读取矩阵维度
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // 读取矩阵元素
    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]);
        }
    }

    // 打印输入的矩阵
    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;

    // 读取矩阵维度
    printf("Enter the size of the square matrix: ");
    scanf("%d", &n);

    // 读取矩阵元素
    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]);
        }
    }

    // 检查对称性
    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;
    }

    // 打印对称结果
    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_symmetric 被设置为 false
  • 如果发现不对称,程序会提前跳出循环

打印是否对称

在这最后一步中,你将改进程序,以提供关于矩阵对称性的更详细输出,并创建一个函数来提高代码的模块化程度。

打开现有文件并更新代码:

cd ~/project
nano symmetric_matrix.c

用以下实现替换之前的代码:

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

#define MAX_SIZE 100

// 检查矩阵对称性的函数
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;
}

// 打印矩阵的函数
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\n矩阵:\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];

    // 读取矩阵维度
    printf("输入方阵的大小:");
    scanf("%d", &n);

    // 读取矩阵元素
    printf("输入矩阵元素:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("输入元素 [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 打印输入的矩阵
    print_matrix(matrix, n);

    // 检查并打印对称状态
    if (is_symmetric_matrix(matrix, n)) {
        printf("\n对称性分析:\n");
        printf("✓ 该矩阵是对称的。\n");
        printf("  - 所有元素 A[i][j] 都等于 A[j][i]\n");
        printf("  - 矩阵转置后不变\n");
    } else {
        printf("\n对称性分析:\n");
        printf("✗ 该矩阵不是对称的。\n");
        printf("  - 某些元素 A[i][j] 不等于 A[j][i]\n");
    }

    return 0;
}

编译并运行程序:

gcc symmetric_matrix.c -o symmetric_matrix
./symmetric_matrix

对称矩阵的示例输出:

输入方阵的大小: 3
输入矩阵元素:
输入元素 [0][0]: 1
输入元素 [0][1]: 2
输入元素 [0][2]: 3
输入元素 [1][0]: 2
输入元素 [1][1]: 4
输入元素 [1][2]: 5
输入元素 [2][0]: 3
输入元素 [2][1]: 5
输入元素 [2][2]: 6

矩阵:
   1    2    3
   2    4    5
   3    5    6

对称性分析:
✓ 该矩阵是对称的。
  - 所有元素A[i][j] 都等于 A[j][i]
  - 矩阵转置后不变

非对称矩阵的示例输出:

输入方阵的大小: 3
输入矩阵元素:
输入元素 [0][0]: 1
输入元素 [0][1]: 2
输入元素 [0][2]: 3
输入元素 [1][0]: 4
输入元素 [1][1]: 5
输入元素 [1][2]: 6
输入元素 [2][0]: 7
输入元素 [2][1]: 8
输入元素 [2][2]: 9

矩阵:
   1    2    3
   4    5    6
   7    8    9

对称性分析:
✗ 该矩阵不是对称的。
  - 某些元素A[i][j] 不等于 A[j][i]

主要改进点:

  • 添加了 is_symmetric_matrix() 函数以实现更好的代码组织
  • 创建了 print_matrix() 函数来显示矩阵内容
  • 通过详细的对称性分析增强了输出
  • 使用视觉指示符 (✓/✗) 突出显示对称状态

总结

在本实验中,你将学习如何在 C 编程中读取矩阵的维度和元素,然后检查矩阵是否对称。首先,你将创建一个程序,允许用户输入矩阵的大小和元素。然后,你将修改该程序,通过验证每个元素 A[i][j]是否等于其对应的元素 A[j][i]来检查矩阵是否对称。最后,你将打印矩阵是否对称。

完成这些步骤后的关键学习要点包括使用scanf()读取矩阵维度和元素、显示输入的矩阵,以及比较矩阵元素以确定对称性。该程序确保用户可以输入最大为 100x100 的任意大小的方阵。