Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ordonner un tableau de valeurs

    9 octobre 2021 à 20:07:41

    Bonjour à tous!

    Tout d'abord, pour ceux qui ont suivi ma série sur les tableaux, je tiens à préciser que j'ai modifié mon programme sur la fonction "tableauCopie" et je l'ai posté ce matin. Malheureusement, j'ai tellement édité mon message qu'il a été considéré comme un spam. La sanction est que je ne peux plus rien poster pendant 24H donc je vous proposerai l'amélioration de mon programme demain et vous remercie pour tous vos précieux conseils quim'aident à progresser.

    Aujourd'hui, je vous propose de clore notre série sur les tableaux avec un dernier exercice qui met en jeu la fonction "ordonnerTableau": je dois créer un de valeurs que ma fonction classera dans l'ordre croissant. Un classique sur les tableaux! Je vous propose ma solution ici:

    Production :

    #include <stdio.h>
    #include <stdlib.h>
    
    void afficheTableauAvt(int *tableau, int tailleTableau);     /*les prototypes: une fonction qui affiche le tableau désordonné,*/
    void afficheTableauApr(int *tableau, int tailleTableau);     /*  une autre qui range les valeurs et une dernière*/
    void ordonnerTableau(int tableau[], int tailleTableau);      /*  qui affiche le tableau ordonné */
    
    int main()
    {
        int tableau[4]={15, 81, 22, 13};
        afficheTableauAvt(tableau, 4);
        ordonnerTableau(tableau, 4);
        afficheTableauApr(tableau, 4);
    
    
        return 0;
    }
    
    void afficheTableauAvt(int *tableau, int tailleTableau)
        {
            int i;
            printf("Les valeurs de Tableau desordonne sont: ");
            for(i=0; i<tailleTableau; i++ )
            {
                printf("%d ", tableau[i]);
            }
            printf("\n");
            return 0;
        }
    
    void afficheTableauApr(int *tableau, int tailleTableau)
        {
            int i;
            printf("\n\n");
            printf("Les valeurs de Tableau apres transformation sont: ");
    
            for(i=0; i<tailleTableau; i++)
            {
                printf("%d ", tableau[i]);
            }
            printf("\n\n");
            return 0;
        }
    
    void ordonnerTableau(int tableau[], int tailleTableau)
        {
            int i, j, k=0;
    
    while(k<tailleTableau)                         // Ma boucle "for" permet juste de décaler d'une seule place une valeur.
       {
    
            for(i=0; i<tailleTableau; i++)         // C'est mon "while" qui permet de rentrer une 2ème, 3éme ou 4ème fois dans 
                {
                    if(tableau[i]>tableau[i+1])    // ma boucle "for" et donc de décaler une valeur de deux, trois ou quatre place
                        {
                            j=tableau[i];
                            tableau[i]=tableau[i+1];
                            tableau[i+1]=j;
    
                        }
    
                     else
                     {
                         tableau[i]=tableau[i];
                     }
                }
                k++;
        }
          return 0;
        }

    Voilà, voilà n'hésitez pas à critiquer mon code source.

    Il fonctionne pour un tableau de 4 valeurs et l'affichage n'est pas mauvais selon moi mais est-ce que

    j'ai la bonne façon de coder ? Est-ce que c'est compréhensible ?

    Merci d'avance pour vos retours

    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2021 à 20:41:01

      Tu aurais du lire les réponses de ton autre sujet : Copier les valeurs d'un tableau dans un autre avant de créer un autre sujet.
      • Partager sur Facebook
      • Partager sur Twitter
      ...
        10 octobre 2021 à 1:53:57

        Je ne reviendrai pas outre mesure sur les deux fonction pour afficher la même chose. :)
        Pour la fonction ordonnerTableau, le else tableau[i] = tableau[i];  est inutile.
        Tu prends une valeur dans une case et tu la remets dans la même case.
        Ce tri s'appelle un "tri à bulles".
        Je te suggère de faire le test même si je te donne la solution.
        Affiches le tableau après la premiêre boucle (ou toutes)
        Tu verras qu'à la fin du premier passage, l'élément le plus grand est à la fin.
        Alors pourquoi refaire la boucle sur tout le tableau?
        Refais la boucle sur les taille-1 premiers éléments.
        En fait, le truc est de diminuer tailleTableau après chaque tour de boucle.
        Note: tu le diminue seulement pour la fonction car on a pris une copie de la valeur fournie par le main.
        Tu n'auras pas besoin de la variable 'k', fais seulement  while(tailleTableau > 1)

        Dans ta boucle for, tu écris i < tailleTableau, donc la plus grande valeur sera tailleTableau-1
        mais dans le if qui suit, tu compares avec tableau[i+1]  qui se trouve hors de ton tableau.
        Il faut tester  i < tailleTableau-1  dans le for

        -
        Edité par PierrotLeFou 10 octobre 2021 à 2:20:55

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          10 octobre 2021 à 10:18:16

          Oui tu as raison j'ai enlevé les deux fonctions "afficheTableauAvt" et "afficheTableauApr" pour les remplacer par une seule fonction "afficheTableau".

          Pour le "else", je sais que tableau[i] = tableau[i] est inutile mais le problème c'est que dans mon "if...else", je ne souhaite que traiter le cas où tableau[i] > tableau[i+1] car c'est le cas qu'il faut modifier. Le problème avec le "if" c'est le "else" qu'il faut aussi traiter mais je n'avais rien à dire concernant le cas où tableau[i]<tableau[i+1]. Justement, c'est ce qu'on veut donc pas besoin de traiter ce cas. Du coup, je voulais demander à mon programme de ne rien faire dans le "else" et comme je savais pas comment lui dire alors j'ai mis une instruction inutile: tableau[i] = tableau [i].

          Pour le i < tailleTableau - 1 dans la boucle "for" , tu as raison. A cause de tableau[i+1], je sortais du domaine de définition du tableau ce qui est fâcheux donc je l'ai modifié.

          En revanche, ce que j'ai moins pas bien compris c'est ton "while(tailleTableau > 1) :

          tailleTableau est une valeur entière fixée à 4 dans mon programme. "tailleTableau > 1" est donc toujours vrai et donc, cette condition dans un "while" donne une boucle infinie, non ? 

          • Partager sur Facebook
          • Partager sur Twitter
            10 octobre 2021 à 15:01:01

            D'abord, un if n'a pas forcément besoin d'un else. Enlèves le else et l'assignation.
            Pour le while, voici en simplifié:
            while(tailleTableau > 1) {
                for(int i=0; i<tailleTableau-1; i++) {
                    ...
                }
                tailleTableau--;
            }
            C'est seulement la copie locale qui sera modifiée.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              11 octobre 2021 à 11:23:26

              Ah je savais pas que "if" n'avait pas besoin d'un else.

              En appliquant ma boucle "for" sur papier, j'ai vu que j'en avais besoin 3 fois donc j'ai mis while(k<tailleTableau-1) (k=0; k=1 et k=2 | tailleTableau = 4) et j'ai remarqué aussi qu'à chaque fin de boucle "for", le plus grand élément se retrouve à la fin donc je comprends pourquoi tu décrémente tailleTableau.

              Du coup, je vous propose ça:

              Nouvelle Production:

              #include <stdio.h>
              #include <stdlib.h>
              
              void afficheTableau(int *tableau, int tailleTableau);     /*les prototypes: une fonction qui affiche le tableau désordonné,*/
                                                                        /*  une autre qui range les valeurs */
              void ordonnerTableau(int tableau[], int tailleTableau);
              
              int main()
              {
                  int tableau[4]={15, 81, 22, 13};
                  printf("Les valeurs de Tableau desordonne sont: ");
                  afficheTableau(tableau, 4);
                  printf("Les valeurs de Tableau range sont: ");
                  ordonnerTableau(tableau, 4);
                  afficheTableau(tableau, 4);
              
              
                  return 0;
              }
              
              void afficheTableau(int *tableau, int tailleTableau)
                  {
                      int i;
                      for(i=0; i<tailleTableau; i++ )
                      {
                          printf("%d ", tableau[i]);
                      }
                      printf("\n");
                      return 0;
                  }
              
              void ordonnerTableau(int tableau[], int tailleTableau)
                 {
                    int i, j, k=0;
                      while(k<tailleTableau-1)                         // Ma boucle "for" permet de mettre le plus grand élément à la fin.
                          {
              
                      for(i=0; i<tailleTableau-1; i++)         // C'est mon "while" qui permet de rentrer 3 fois dans
                          {
                              if(tableau[i]>tableau[i+1])    // ma boucle "for"
                                  {
                                      j=tableau[i];
                                      tableau[i]=tableau[i+1];
                                      tableau[i+1]=j;
              
                                  }
                          }
                          k++;
                          }
                    return 0;
              
                 }
              

              C'est mieux que le premier code déjà, non ? Surtout que j'ai enlevé les deux fonctions "affiche"

              -
              Edité par RiadOuhibi 11 octobre 2021 à 11:26:02

              • Partager sur Facebook
              • Partager sur Twitter
                11 octobre 2021 à 12:04:52

                Tes deux fonction ont un prototype qui retourne void, il ne faut donc pas retourner de valeur or toi tu retourne la valeur 0. Dans ce cas on fait un return sans valeur : return; et ce return étant la dernière instruction de tes fonctions tu peux l'omettre.
                • Partager sur Facebook
                • Partager sur Twitter
                ...
                  11 octobre 2021 à 15:53:57

                  Si tu veux tester ce genre de tri, crées un tableau trié à l'envers: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                  Ordonner un tableau de valeurs

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown