4
votes

Plus petit nombre impair dans un tableau donné

Ce code est censé trouver le plus petit nombre impair dans un tableau donné et le stocker dans min mais quand j'essaye d'imprimer min il imprime toujours 0 .

int smallestodd(int x[5]){
  int j;
  int k[5];
  int p = 0;
  int r = 0;

  for(int h =0; h<5;h++){

    j = x[h] % 2;
    if(j == 1){
      int temp =x[h];
      k[p] =temp;
      p++;
    }
  }

  int min = k[0];


  while(k[r] !=0){
    if(k[r] < min ){
      min = k[r];
      r++;
    }
  }

  return min;
}


10 commentaires

Vous avez une boucle infinie lorsque vous mettez à jour r dans si (k [r] et min est initialisé à k [0 ] .


Cela semble être le bon moment pour apprendre à déboguer vos programmes .


Cela n'imprime rien.


pourquoi gardez-vous k [] il suffirait d'initialiser min au premier élément de x (ou d'une grande valeur) puis de regarder à travers le reste, s'il est plus petit et impair, attribuer à min


Notez également que les variables locales (y compris les tableaux) ne sont pas automatiquement initialisées. Les variables non initialisées auront des valeurs indéterminées (et apparemment aléatoires). Cela signifie que la condition de boucle k [r]! = 0 est fausse (car il peut ne pas y avoir d'élément égal à zéro dans le tableau). Vous avez le nombre d'éléments valides en k dans la variable p . Utilise le.


int min = k [0]; , que faire si le premier élément est pair? Oops.


Le premier élément ne peut pas être pair car il ne stocke que les éléments impairs, mais cela n'a pas d'importance de toute façon à cause de la réponse de @ Someprogrammerdude


@Touche. Ayez un vote positif car j'ai trollé la question.


@kiranBiradar que voulez-vous dire? min est k [0] et que si l'instruction vérifie si k [r] est plus petit que min, ne devrait-il pas simplement passer le premier parce que c'est la même valeur que min? pourquoi serait-ce une boucle infinie


if (j == 1) { ne détectera pas les valeurs impaires lorsque x [h] est un impair négatif.


3 Réponses :


0
votes

C'est assez simple en fait. Vous devez simplement vérifier 2 conditions sur votre baie.

int smallestOdd(int arr[]){
    int min = 99999; //Some very large number
    for(int i = 0; i < (length of your array); i++) {
        if(arr[i]%2 != 0 && arr[i] < min) { //Check if number is odd and less than the current minimum value
            min = arr[i];
        }
    }
    return min;
}


3 commentaires

int min = 99999; - cela me donne des frissons


cela fonctionne grâce mais je dois trouver l'algorithme qui fonctionne pour tout.


Au lieu de 99999, mieux vaut utiliser le plus grand int - ce qui est impair: int min = INT_MAX;



4
votes

En supposant qu'il y ait un nombre impair dans le tableau - disons que d'essayer de trouver le nombre impair minimum dans un tableau avec juste des nombres pairs (ou pas de nombres) est UB :)

index = 0;
while (arr[index] % 2 == 0) index++; // skip even numbers
min = arr[index++]; // first odd number
while (index < length) {
    if (arr[index] % 2) {
        if (arr[index] < min) min = arr[index];
    }
    index++;
}


2 commentaires

on dirait que ça marche, mais quand je le compile, ça ne donne parfois pas le bon nombre mais ça donne même un nombre pair une fois que je ne comprends pas, pouvez-vous écrire tout le code pour ça?


Voir https://ideone.com/ReMpmO ; J'ai eu un petit bug dans la première version, désolé :)



1
votes

ce code évite le débordement dans la recherche et renvoie 1 lorsqu'il est trouvé ou 0 si le tableau ne contient que des nombres pairs.

int getMinOdd(int arr[], int length, int *value) {
    int found = 0;
    for(int idx=0; idx < length; idx++) {
        if (arr[idx] % 2) {
            if (!found || *value > arr[idx]) {
                *value = arr[idx];
            }
            found = 1;
        }
    }
    return found;
}


0 commentaires