C语言 跳过方阵中的对角元素

qnzebej0  于 2023-02-18  发布在  其他
关注(0)|答案(2)|浏览(134)

编写了一个程序来显示一个正方形矩阵(例如:5x5),我试图计算元素的总数,不包括位于对角线内的元素(从左上角到右下角&从左下角到右上角)
例如:
在5x5矩阵中,仅计算X

O X X X O
X O X O X
X X O X X
X O X O X
O X X X O

因此:

2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2

Total: 32

下面是我的代码

int calculateVal(int **mat, int size)
{
    int count = 0;
    for (int row = 0; row < size; row++)
    {
        for (int col = 0; col < size; col++)
        {
            if (isRightDiagonal(size, row, col) == true ||
                isLeftDiagonal(size, row, col) == true)
            {
                col++;
            }
            count += mat[row][col];
        }
    }
    return count;
}

bool isRightDiagonal(int size, int row, int col)
{
    return (col = abs(row - size)) ? true : false; 
}

bool isLeftDiagonal(int size, int row, int col)
{
    return (row = abs(col - size)) ? true : false; 
}

我尝试使用if语句检查元素是否在对角线内,如果是,则跳到下一个元素,但是输出是错误的。
我主要使用的测试用例是一个1的5x5,就像上面的例子一样;但是,打印输出的总数为10,而不是16

rkkpypqq

rkkpypqq1#

对角线的测试不正确:

  • 如果col == row,则元素是左对角线的一部分
  • 如果size - 1 - col == row,则元素是右对角线的一部分

此外,如果元素是任一对角线的一部分,则应忽略它,递增col是不正确的,因为它可能使mat[row][col]引用矩阵外的元素,从而导致未定义的行为。
以下是修改后的版本:

int calculateVal(int **mat, int size) {
    int count = 0;
    for (int row = 0; row < size; row++) {
        for (int col = 0; col < size; col++) {
            if (col != row && size - 1 - col != row) {
                count += mat[row][col];
            }
        }
    }
    return count;
}
0sgqnhkj

0sgqnhkj2#

使用一个样本矩阵,其中1表示不想计数的条目(如果您将它们相加而不是计数,则值不为0,则您知道有问题)。您可以使用一个类似的精心编制的矩阵来确保您感兴趣的16个条目被计数:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int matrix[][5] = {
        {1, 0, 0, 0, 1},
        {0, 1, 0, 1, 0},
        {0, 0, 1, 0, 0},
        {0, 1, 0, 1, 0},
        {1, 0, 0, 0, 1}
    };
    size_t sum = 0;
    const size_t n = sizeof matrix / sizeof *matrix;
    for(size_t r = 0; r < n; r++)
        for(size_t c = 0; c < n; c++)
            sum += (r != c && r + c + 1 != n) * matrix[r][c];
    printf("sum = %zu\n", sum);
}

如果你不喜欢无分支的风格,这里有另一种表达方式:

if(r != c && r + c + 1 != n)
                sum += matrix[r][c];

相关问题