C++数组中的最大数。正数和负数

4
我可以帮助您进行翻译。这篇文章是关于编程的,任务是要打印矩阵第二行的最大整数。以下是示例输入:
3 2 (n, m)

-1 -2 <- 1 line

4 5 <- 2 line

2 6 <- 3 line

第二行的最大整数是5。我的程序打印出来了。但如果第二行是-100 -150,它就不能工作。当然,这是因为我把max设为0,但我不知道如何正确使用它。我是一名学生。提前感谢。

这是我的代码:

#include <iostream>

using namespace std;

int main() {
  int n, m, max = 0;
  cin >> n >> m;

  int matrix[10][10];

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> matrix[i][j];
    }
  }

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (matrix[1][j] > max) {
        max = matrix[1][j];
      }
    }
  }

  if (max == 0 || n == 1) {
    cout << "No";
  } else {
    cout << max;
  }
}

代码运行得非常好,除非第二行出现负数。


在你的 cin 循环后删除 max = 0 并添加 int max = matrix[1][0]; - user11923373
@user11923373 它运行成功了!非常感谢您! - Dewagg
有人能解释一下这是如何工作的,以及为什么将max = 0是不好的吗? - Dewagg
因为0大于任何负数。顺便提一下,for(int i...循环不需要,因为你只扫描一行,而且i也没有被使用(指第二个嵌套循环)。 - Constantine Georgiou
1
希望今天能过得愉快,但很遗憾滚石乐队是对的,你不可能总是得到想要的。 - user4581301
显示剩余3条评论
1个回答

2
你正确地怀疑了max = 0;。为什么这是个问题?首先,也许你应该试着向你的橡皮鸭解释为什么它是正确的。当你试着这样做时,你可能会表达出一个意图,比如说"这个值不会通过检查"或者"这个值将在循环的第一次迭代中被替换"。为什么呢?"因为matrix[1][j] > max将会成立,所以...等等,当matrix[1][j] > 0不成立时,问题不是出在哪里吗?所以当max0时,嗯...有问题?"

总体策略是有效的,但是有一个要求,就是max必须初始化为足够低的值。目前我能想到两种常见的策略。

  1. 对于你使用的类型,使用尽可能的值。即:
    int max = std::numeric_limits<int>::lowest();

  2. 使用循环的第一次迭代中的值。没有必要提供一个将被替换的值。但是,这种方法有一些注意事项。最相关的问题是:如果没有第一次迭代怎么办?(也许只有一行?也许没有列?)另外,你需要在循环之间初始化max,在矩阵赋值后进行。
    int max = (n > 1 && m > 0) ? matrix[1][0] : /* 在这里你想要什么值? */;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接