Récupérer le rang i dans une boucle for

Bonjour ! J'ai un code à faire pour le Bac (presque fini je ne vais pas vous demander de le faire à ma place ^^), et ça ressemble à ça :

      int max1 = 0;
      int min1 = 0;
      int max2 = 0;
      int min2 = 0;

      for (int i=0; i<=19; i++){

      if (son2[i+1] > son2[i]){
        max1 = son2[i+1];
      }
      if (son[i+1] < son[i]) {
        min1 = son2[i+1];
      }
      }
      for (int i =20; i<=39; i++){

        if (son2[i+1] > son2[i]){
          max2 = son2[i+1]; 
        }
        if (son2[i+1] < son2[i]){
          min2 = son2[i+1];
        }
      }

En clair j'acquiers des données que j'analyse afin de trouver le max et le min dans cet échantillon (20 nombres ici).
Je voudrais ensuite connaître le rang i+1 pour lequel on a les max et les min, en même temps que la valeur stockée dans son*.*
Je sais pas si c'est très clair mais je peux vous donner le reste du code si vous voulez.
Merci d'avance !

Bonjour,

Il faut déjà revoir ton algorithme de recherche des min et max.

Ensuite il suffit de mémoriser i dans une variable (par exemple imin1 et imax1 ) quand tu mémorise min1 et max1.

kamill:
Bonjour,

Il faut déjà revoir ton algorithme de recherche des min et max.

Ensuite il suffit de mémoriser i dans une variable (par exemple imin1 et imax1 ) quand tu mémorise min1 et max1.

Est tu sur que les max/min soient univoques?
Souvent les mesures ont du bruit il y a des max provisoires...

Voici un code qui fonctionne bien chez moi:

if (A0Byte > Treshold && ATpointer < 394)
{ // Detection of Events Above Treshold, that must last for at least Duration and max 3xDuration
  // Find maximum value and record corresponding time.
  ATDuration ++;
  if (A0Byte > ATMax)
    {
      ATMax = A0Byte;
      AThour = hour;
      ATmin = minute;
      ATsec = second;
    }
  }
  else // At the end of the event categorize it
  {
    if (ATDuration > Duration && ATDuration < 3 * Duration)
    {
      // record event data in Array
      filbuff4[ATpointer] = AThour;
      ATpointer ++;
      filbuff4[ATpointer] = ATmin;
      ATpointer ++;
      filbuff4[ATpointer] = ATsec;
      ATpointer ++;
      filbuff4[ATpointer] = ATMax; // Maximum
      ATpointer ++;
      filbuff4[ATpointer] = ATDuration;
      ATpointer ++;
      ATDuration = 0;
      if (ATMax > NAT1) nNAT1 ++;
      if (ATMax > NAT2) nNAT2 ++;
      if (ATMax > NAT3) nNAT3 ++;
    }
    else
    {
      // drop event
      ATDuration = 0;
      ATMax = 0;
    } // end if/else duration
  } // end if/else above treshold

Je classe tous les max dans un array avec l'heure, le maximum et la durée.

Il y a des conditions supplémentaires:
le max doit durer au moins x et moins de 3x et
l'évènement doit être supérieur a une limite inférieure.

J'attends de repasser par la limite inférieure avand d'enregistrer l'évènement,

En effet, je ne comprends pas bien le besoin (il y a des son et des son2, c'est pas très clair), mais si tu veux connaitre les valeurs min et max et leurs indices, il te faut un truc comme ça :

      int imin1 = 0;
      int min1 = son2[0];
      int imax1 = 0;
      int max1 = son2[0];

      for (int i=1; i<=19; i++)
  {
      if (son2[i] > max1){
        max1 = son2[i];
        imax1 = i;
      }
      if (son[] < min1) {
        min1 = son2[i];
        imin1 = i;
      }
    }

Mais je ne sais pas si c'est ce que tu cherches...

Merci beaucoup j'ai utilisé ton code et j'ai adapté quelques trucs et ca marche !
Tu viens sûrement de me faire gagner des points pour le bac :grinning:
Et merci aux autres qui ont pris le temps de me répondre.
Sujet résolu !

mignonfripe:
Tu viens sûrement de me faire gagner des points pour le bac :grinning:

Je prends 50% :slight_smile:

lesept:
Je prends 50% :slight_smile:

Alors tu vas rater ton bac.

SCNR.

RIN67630:
Alors tu vas rater ton bac.

SCNR.

Ça fait un bout de temps que je l'ai...