编写了一个程序来显示一个正方形矩阵(例如: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
2条答案
按热度按时间rkkpypqq1#
对角线的测试不正确:
col == row
,则元素是左对角线的一部分size - 1 - col == row
,则元素是右对角线的一部分此外,如果元素是任一对角线的一部分,则应忽略它,递增
col
是不正确的,因为它可能使mat[row][col]
引用矩阵外的元素,从而导致未定义的行为。以下是修改后的版本:
0sgqnhkj2#
使用一个样本矩阵,其中1表示不想计数的条目(如果您将它们相加而不是计数,则值不为0,则您知道有问题)。您可以使用一个类似的精心编制的矩阵来确保您感兴趣的16个条目被计数:
如果你不喜欢无分支的风格,这里有另一种表达方式: