在Array中找到对称性

时间:2017-10-04 15:48:49

标签: 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 个答案:

答案 0 :(得分:2)

几个问题:

  1. 根据您的定义,当且仅当矩阵等于其转置时,矩阵才是对称的。只有方形矩阵才是这种情况,但你也可以使用非方形矩阵,没有明显的理由。

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

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

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

  3. 目前还不清楚您认为if / elsesymmetry2D()末尾的循环嵌套对您的影响是什么,但前提是rowSize和{ {1}}大于零,整个构造的实际效果与简单colSize相同。

  4. 看起来这个想法可能是创建一个包含输入转置的数组,然后将输入与之比较。这本来会有效,尽管它的效率相当低,但你实际上从来没有为转置创建单独的数组。如果你要在没有创建转置的情况下进行测试 - 你应该 - 然后

    1. 请勿修改输入数组(因此请完全删除第一个循环嵌套)。

    2. 为对称比较获取正确的索引:return result;

    3. 为了获得最佳效率,请避免冗余和不必要的比较。例如,如果您已经测试过M[h][k] != M[k][h],则无需测试M[1][2] == M[2][1]。而且你永远不需要在主对角线上测试元素。通过更好地选择循环边界,您可以非常轻松地实现这种效率。

    4. 此外,如果M[2][1] == M[1][2]函数确实应该避免修改输入数组,请考虑将其第一个参数的元素类型声明为symmetry2D()而不是普通const int(但是不修改int)中相应变量的类型。如果您首先以这种方式编写它,那么编译器会注意到该函数在逻辑上错误地尝试修改数组元素,并拒绝了代码。