Tri à bulles

Résolu
Marryde Messages postés 3 Statut Membre -  
Marryde Messages postés 3 Statut Membre -
Bonjour,

Je dois effectuer un tri à bulle en langage C. En voici la structure:

#include <stdio.h>  
#define MAX 100  

void Permutation (int nb1, int nb2, int tab[MAX]){ 
 int memoire; 
 memoire = tab[nb1];  
 tab[nb1] = tab[nb2];
 tab[nb2] = memoire;
}
void tri_a_bulle (int tab[MAX]){ 
 int i,y; 
 for (i=0; i<MAX; i++){  
 int inférieur = tab[i];   
 int case_inférieur = i;  
 for (y=(i+1); y<MAX; y++){ 
 if (inférieur > tab[y]){   
 inférieur = tab[y];  
 case_inférieur = y; 
   }
  }
  Permutation (i, case_inférieur, tab) ; 
 }
}
void main (void){
 int tab[MAX];  
 int i,nb;   
 printf("Nombre de valeur dans le tableau : \n ");
 do{
  scanf("%d", &nb);
 } while (nb<=0 && nb>=100);
 for (i=0; i<nb; i++){  
 printf("Saisir la masse molaire n° %d : ",i);  
 scanf_s("%d",&tab[i]);  
 }
 tri_a_bulle (tab);  
 for (i=0; i<MAX; i++){  
 printf("valeur %d : %d \n",i,tab[i]);  
 }
}  

Le programme "fonctionne": En effet, je peux choisir le nombre de ligne du tableau et y mettre les valeurs que je souhaite. Cependant, lorsque le tableau doit se mettre dans l'ordre, celui-ci m'affiche des valeurs illogiques (du type -8094637). Après avoir relu une vingtaine de fois le programme, je ne trouve pas l'erreur... Pourriez vous m'aider?

Je vous remercie d'avance!

1 réponse

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut,
    dans ton
    main
    tu créés un tableau
    tab
    de taille
    MAX
    , cette taille étant fixe car faire un tableau de la taille qu'on veut vraiment est un peu plus complexe. Ainsi soit-il, c'est une très bonne méthode pour démarrer.

    Tu demandes le nombre d'éléments (intrinsèquement limité à MAX et dont tu fait la vérif sans re-mentionner MAX,
    } while (nb<=0 && nb>=MAX);
    serait donc plus adéquat), demande la valeur des éléments, puis trie...

    Sauf que ta fonction de tri trie l'intégralité du tableau, et pas seulement la partie où les données ont été entrées. Or en C, un tableau, tant qu'on ne le remplit pas, contient des valeurs indéfinies, qui peuvent être -8094637 par exemple.

    Il faut donc faire en sorte que
    tri_a_bulle
    n'aille pas jusque
    MAX
    , mais juqu'à un paramètre
    int tailleTab
    (par exemple) que tu passeras à la fonction, sa valeur étant celle de
    nb
    dans ton main.

    Il en va de même pour l'affichage de ton tableau: tu vas jusqu'au bout de
    tab
    alors que tu n'as attribué de valeur qu'aux
    nb
    premiers éléments.

    Par ailleurs, le bon prototype de main est
    int main (void)
    , pas
    void main (void)
    , et il faut un
    return 0;
    à la fin.
    0
    1. Marryde Messages postés 3 Statut Membre
       
      Hey!

      Tout d'abord, merci pour ta réponse, c'est très gentil!

      Ensuite, pour que je comprenne bien, il faut que je rajoute une variable comme tu l'as dit "tailletab" dans ma fonction "tri a bulle", que j'initialise à nb qui correspond à mon nombre de ligne (j'aurais donc int tailletab=nb)?
      Ainsi dans mes boucles "for" de ma fonction, au lieu d'avoir MAX, j'aurais mon tailletab?
      Puis dans mon MAIN, je mets mon tailletab (ou nb) au lieu des MAX?

      Pour ce qui est du "void main (void), je l'ai appris comme ça, mais pourrais tu m'expliquer la différence entre les 2 (si ça te dérange pas bien sur!).

      Encore merci, j'espère avoir compris ton explication ( et je m'excuse si je l'ai pas compris d'ailleurs)
      0
      1. ElementW Messages postés 5690 Statut Contributeur 1 293 > Marryde Messages postés 3 Statut Membre
         
        tailletab
        , dans l'idée, sera un paramètre supplémentaire de
        tri_a_bulle
        , indiquant combien d'éléments il faut trier. Effectivement, quand tu appelleras
        tri_a_bulle
        , tu passeras ton tableau ainsi que
        nb
        .
        Pour les boucles, tu as compris.
        Concernant le prototype du
        main
        , la différence entre ton code et le standard, c'est que
        main
        est censé retourner un
        int
        qui est en fait le code numérique de retour/fin de ton programme entier (sur Windows ça ne sert que peu mais c'est important sur les systèmes Unix(-like) comme Linux ou Mac OS),
        0
        indiquant que le programme s'est déroulé correctement. Or toi tu ne revoies rien (
        void
        ), ce qui est invalide.
        0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Salut Gravgun,
      } while (nb<=0 && nb>=MAX);
      serait donc plus adéquat), demande la valeur des éléments, puis trie...

      Et surtout mettre || au lieu de &&. Sinon, la boucle ne sert à rien ;-).
      0
      1. ElementW Messages postés 5690 Statut Contributeur 1 293 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Effectivement, j'ai zappé ce détail...
        0
    3. Marryde Messages postés 3 Statut Membre
       
      Merci de vos réponses j'ai résolu le problème! :)
      0