该程序似乎工作得很好,但我的导师告诉我,如果我输入一个非常大的负数,它将无法工作。他还告诉我它与行max = a [i] [j]有关。它可以用一行代码计算出来,但由于我是一个纯粹的初学者,我不知道该怎么做。这是代码
int a[10][10], i, j, n, max, amount = 0;
cout << "enter the type of square matrix (nxn) "; cin >> n;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cout << "enter the element of matrix a[" << i << "][" << j << "]"; cin >> a[i][j];
}
}
cout << "the matrix is " << endl;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cout << setw(8)<<a[i][j];
}
cout << endl;
}
max = a[i][j];
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (a[i][j] > max) {
if (a[i][j] % 2 == 0) {
if (i > j) {
max = a[i][j];
amount++;
}
}
}
}
}
if (amount > 0) {
cout << "the highest even number under main diagonal is " << max;
}
else cout << "the number does not exist in this matrix " << endl;
return 0;
}
虽然我们只能推测讲师的顾虑是什么,但可以对在矩阵中主对角线下找到最大偶数的任务进行客观考虑。
我将只关注搜索循环,而不是OP的代码中的整体实现和其他问题,例如越界访问。
当扫描一系列值以找到最大值时,我们通常将每个元素与一个变量进行比较,比如max
,它保存到目前为止找到的较大值,并在找到更大的值时更新。但是应该记住一些注意事项:
max
。没有这样的元素。例如,在OP的情况下,对角线下可能没有偶数(实际上,它们的错误是max
用未初始化元素的值初始化,也可能在分配的数组之外)。max
。在int
值的情况下,它是std::numeric_limits<int>::min()
,这可能确实是一个非常大的负数(甚至也是如此)。问题是这是一个有效的可能值,所以如果我们只检查更严格的值并且我们只有那个值,那么我们会错过最大值。此外,在这种特殊情况下,不是遍历整个矩阵检查每个元素是否在对角线下,我们只能遍历矩阵的左下部分。
以下代码段显示了如何考虑这些注意事项:
#include <limits>
int max = std::numeric_limits<int>::min();
bool found = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) { // only the elements of a square matrix under the diagonal
if ( a[i][j] >= max && a[i][j] % 2 == 0 ) {
max = a[i][j];
found = true;
}
}
}
编辑:
正如@user3386109在评论中指出的那样,内部条件略有变化,有可能将max
初始化为更方便的值,如0:
if ( (!found || a[i][j] > max) && a[i][j] % 2 == 0)
// ^^^^^^ checks if it's the first
您的代码存在一些问题:
cout << "enter the type of square matrix (nxn) "; cin >> n;
你没有检查n <= 10
(10是你的阵列a
的大小)
for (i = 1; i <= n; i++)
您从1开始索引,而数组索引从0开始。您现在只能将9 X 9矩阵写入数组。当i
达到n
并且n
为10时,这也会导致出界异常。
max = a[i][j];
在上面的陈述之前,有一个for循环,其中i
和j
已经增加到n
。如果n
等于10,这将导致超出范围的异常。
在此之后的for循环中你犯了同样的错误:
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (a[i][j] > max) {