该程序似乎运行良好,但是我的主持人告诉我,如果我输入一个非常大的负数,它将无法正常工作。他还告诉我,它与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;
}
答案 0 :(得分:1)
虽然我们只能推测讲师要关注的是什么,但是可以做一些客观的考虑,以求在矩阵的主对角线下找到最大偶数。
我将只关注搜索循环,而不是整个实现以及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
答案 1 :(得分:0)
您的代码存在一些问题:
cout << "enter the type of square matrix (nxn) "; cin >> n;
您没有检查n <= 10
(数组a
的大小是10)
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) {