web-dev-qa-db-fra.com

Recherche de la valeur maximale de chaque ligne dans un tableau 2D C++

J'ai réussi à trouver la valeur minimale de chaque ligne de mon tableau 2D avec cette

void findLowest(int A[][Cm], int n, int m)
{
    int min = A[0][0];
    for (int i = 0; i < n; i++)
    {
         for (int j = 0; j < m; j++)
         {
             if (A[i][j] < min)
             {
                 min = A[i][j];
             }
         }
     out << i << " row's lowest value " << min << endl;
    }
}

J'essaie de trouver la valeur maximale de chaque ligne de la même manière, mais cela ne me montre que la première valeur maximale

void findHighest(int A[][Cm], int n, int m)
{
     int max = A[0][0];
     for (int i = 0; i < n; i++)
     {
         for (int j = 0; j < m; j++)
         {
             if (A[i][j] > max)
             {
                max = A[i][j];
             }
         }
     out << i << " row's highest value " << max << endl;
     }
}

Je ne trouve pas ce qui ne va pas avec la deuxième fonction et pourquoi ne me montre-t-elle que la première valeur maximale trouvée. De l'aide ?

4
feco

Les deux fonctions renvoient le résultat (maximum ou minimum) pour l'ensemble du tableau plutôt que pour chaque ligne, car vous définissez max une fois plutôt qu'une fois par ligne. Vous pouvez obtenir le résultat pour chaque ligne comme suit:

void findHighest(int A[][Cm], int n, int m)
{
     for (int i = 0; i < n; i++)
     {
         int max = A[i][0];
         for (int j = 1; j < m; j++)
         {
             if (A[i][j] > max)
             {
                max = A[i][j];
             }
         }
         // do something with max
     }
}

ou, mieux encore, utilisez la fonction de bibliothèque standard max_element :

void findHighest(int A[][Cm], int n, int m)
{
     if (m <= 0) return;
     for (int i = 0; i < n; i++)
     {
         int max = *std::max_element(A[i], A[i] + m);
         // do something with max
     }
}

Cela devrait vous donner toutes les valeurs faciles à vérifier:

#include <algorithm>
#include <iostream>

enum { Cm = 2 };

void findHighest(int A[][Cm], int n, int m) {
  if (m <= 0) return;
  for (int i = 0; i < n; i++) {
    int max = *std::max_element(A[i], A[i] + m);
    std::cout << max << " ";
  }
}

int main() {
  int A[2][2] = {{1, 2}, {3, 4}};
  findHighest(A, 2, 2);
}

imprime 2 4.

5
vitaut

Si votre compilateur prend en charge C++ 11, vous pouvez utiliser l'alternative suivante pour les tableaux concrets: std::minmax_element :

template<typename T, std::size_t N, std::size_t M>
void
minmax_row(T const (&arr)[N][M], T (&mincol)[N], T (&maxcol)[N]) {
  for(int i(0); i < N; ++i) {
    auto mnmx = std::minmax_element(std::begin(arr[i]), std::end(arr[i]));
    if(mnmx.first != std::end(arr[i]))  mincol[i] = *(mnmx.first);
    if(mnmx.second != std::end(arr[i])) maxcol[i] = *(mnmx.second);
  }
}

Démo en direct

4
101010

Vos données de test sont coupables de ne pas vous montrer clairement le défaut.

Les minima de ligne apparaissent dans des valeurs décroissantes, de sorte qu'ils sont mis à jour à chaque ligne.

Et les maxima des lignes apparaissent également dans les valeurs décroissantes, de sorte que le premier continue de gagner.

Comme d'autres l'ont souligné, votre fonction trouve le minimum/maximum global, pas les extrema par ligne.

Déplacez l'initialisation de la variable min/max à l'intérieur de la boucle externe.

2
Yves Daoust

Comme mentionné précédemment, votre code ne montre que l’élément maximum dans l’ensemble du tableau. Voici le code qui vous aidera.

 void findHighest(int A[][Cm], int n, int m)
 {
    int max[n];
    max[0]=A[0][0];
    for (int i = 0; i < n; i++)
  {
      for (int j = 0; j < m; j++)
      {
         if (A[i][j] > max[i])
         {
            max[i] = A[i][j];
         }
     }
  cout << i << " row's highest value " << max[i] << endl;
 }
}
1
The_Novice