Dewagg
Dewagg

Reputation: 145

C++ Largest number in array. Positive and negative

I have a task to print maximum int of matrix second line.

Example input:

3 2 (n, m)

-1 -2 <- 1 line

4 5 <- 2 line

2 6 <- 3 line

Max int in second line is 5. My program prints it. But if second line would be -100 -150, it not works. Sure it is because I have max = 0, but I don't know how to use it properly. I'm a student. Thanks in advance.

It is my code:

#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;
  }
}

And code works pretty good, unless there are negative numbers in second line

Upvotes: 4

Views: 1270

Answers (1)

JaMiT
JaMiT

Reputation: 16843

You are correct to suspect max = 0;. Why is that a problem? Well, first, perhaps you should try to explain to your rubber duck why it is correct. As you try to do so, you are likely to express an intent along the lines of "this value will not make it through the checks" or "this value will be replaced in the first iteration of the loop". Why? "Because matrix[1][j] > max will be true, so... Hold on, wasn't the problem when matrix[1][j] > 0 is false? So when max is 0, um... problem?"

The overall strategy is valid, but there is a requirement that max be initialized to a low enough value. There are two common strategies I can think of at the moment.

  1. Use a value that is as low as possible for the type you are using. That is:
    int max = std::numeric_limits<int>::lowest();

  2. Use the value from the first iteration of the loop. No need to provide a value that is just going to be replaced anyway. There are some caveats for this, though. The most relevant for your example can be expressed as a question: what if there is no first iteration? (Perhaps there is only one row? Perhaps there are no columns?) Also, you would need to initialize max between your loops, after the matrix has been given values.
    int max = (n > 1 && m > 0) ? matrix[1][0] : /* what value do you want here? */;

Upvotes: 2

Related Questions