c - 查找数组中的对称性

标签 c arrays function

您好,我需要检查数组是否对称。我有一个函数,它接受整数 M 的二维数组以及行和列的数组大小作为参数,如果 M 是对称的,则返回 1,否则返回 0。我尝试了很多次,但输出要么对非对称数组是,要么对对称数组不是

这是我的代码:

#include <stdio.h>
#define SIZE 10
#define INIT_VALUE -1
int symmetry2D(int M[][SIZE], int rowSize, int colSize);
int main()
{
    int M[SIZE][SIZE], i, j, result = INIT_VALUE;
    int rowSize, colSize;
    printf("Enter the array size (rowSize, colSize): \n");
    scanf("%d %d", &rowSize, &colSize);
    printf("Enter the matrix (%dx%d): \n", rowSize, colSize);
    for (i = 0; i < rowSize; i++)
        for (j = 0; j < colSize; j++)
            scanf("%d", &M[i][j]);
    result = symmetry2D(M, rowSize, colSize);
    if (result == 1)
        printf("symmetry2D(): No\n");
    else if (result == 0)
        printf("symmetry2D(): Yes\n");
    else
        printf("Error\n");
    return 0;
}

int symmetry2D(int M[][SIZE], int rowSize, int colSize)
{
    int h, k, temp;
    int result;

    for (h = 0; h < rowSize; h++)
    {
        for (k = 0; k < colSize; k++)
        {
            M[h][k] = M[k][h];
        }

    }

    result = 0;
    for (h = 0; h < rowSize && result; h++)
    {
        for (k = 0; k < colSize; k++)
        {
            //if it is not equal to its transpose
            if (M[h][k] != M[h][k])
            {
                result = 1;
                break;
            }

        }
    }

    if (result == 0)
    {
        for (h = 0; h < rowSize; h++)
        {
            for (k = 0; k < colSize; k++)
            {
                return result = 0;
            }

        }

    }
    else
        return result = 1;
}

最佳答案

几个问题:

  1. 根据您的定义,矩阵是对称的当且仅当它等于其转置。这可能仅适用于方阵,但您也可以无缘无故地适应非方阵。

  2. 您的 symmetry2D() 函数包含严重的逻辑缺陷:

    • 它通过执行 M[h][k] = M[k][h]

      的循环使输入对称/li>
    • 即使它不这样做,它也永远不会发现输入是非对称的,因为它对此的测试是 if (M[h][k] != M[h][k ]),它必须始终失败。

  3. 不清楚您认为 if/elsesymmetry2D() 末尾的循环嵌套为您实现了什么, 但前提是 rowSizecolSize 都大于零,整个构造的实际效果与简单的 相同返回结果;.

看起来这个想法可能是创建一个包含输入转置的数组,然后将输入与它进行比较。那会奏效,尽管效率低得离谱,但实际上您永远不会为转置创建单独的数组。如果您打算在不创建转置的情况下进行测试——您应该这样做——那么

  1. 不要修改输入数组(因此完全移除第一个循环嵌套)。

  2. 为对称比较获取正确的索引:M[h][k] != M[k][h]

  3. 为获得最佳效率,请避免冗余和不必要的比较。例如,如果您已经测试了 M[1][2] == M[2][1] 那么您就不需要测试是否 M[2][1] == M[1][2]。而且您永远不需要测试主对角线上的元素。通过更好地选择循环边界,您可以很容易地实现这种效率。

此外,如果确实 symmetry2D() 函数应该避免修改输入数组,请考虑将其第一个参数的元素类型声明为 const int 而不是plain int(但不要修改main()中相应变量的类型)。如果您一开始就以这种方式编写它,那么编译器会注意到该函数试图修改数组元素的逻辑错误尝试,并拒绝该代码。

关于c - 查找数组中的对称性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569091/

相关文章:

c - 与守护进程的进程间通信

java - 如何使用 C/java 检测 Activity 应用程序?

javascript - 使用类/构造函数与变量方法时的范围不同

javascript - 按整数大小对嵌套数组进行排序

c++ - 将 C++ 用于网络守护进程有什么缺点吗?

c - '.' 标记之前预期为不合格-i - C 结构

php - 获取数组中的值到数据库

c - 骰子游戏功能帮助

c - 如何修改传递给函数的二维数组?

javascript - Bootstrap v5 wp-bootstrap-navwalker 下拉导航栏不起作用