Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice 5 - Fonction ordonnerTableau

Difficulté à résoudre la fonction

Sujet résolu
    11 septembre 2017 à 9:34:25

    Bonjour tout le monde,

    Je suis nouveau sur la programmation en C et je suis le manuel de ce site (qui est génial) pour apprendre. 

    Cependant, je bloque à l’exercice 5 de la page 131 Créer une fonction Ordonner tableau pour avoir les nombre dans un ordre croissant.

    Voici mon code qui malheureusement ne compare que les ligne 1 et 2, 2 et 3, 3 et 4 mais ne les comparent pas toutes les unes entre elles.

    #include <stdio.h>
    #include <stdlib.h>
    
    void ordonnerTableau(int tableau[], int tailleTableau);
    void affichageTableau (int tableau[], int tailleTableau);
    
    int main(double argc, char *argv[])
    {
    int i = 0;
    int tableau[4] = {4, 3, 2,5,1};
    
    ordonnerTableau(tableau,5);
    affichageTableau(tableau,5);
    return 0;
    }
    
    void ordonnerTableau(int tableau[], int tailleTableau)
    {
    int i = 0 , j=0;
    
    for (i = 0 ; i < tailleTableau ; i++)
    {
    if (tableau[i]>tableau[i+1])
    {
    j = tableau[i+1];
    tableau [i+1]=tableau [i];
    tableau [i] = j;
    }}
    }
    
    void affichageTableau (int tableau[], int tailleTableau)
    {int i;
    for (i = 0 ; i < tailleTableau ; i++)
    {
    printf("Case %d\t",i);
    printf("%d\n", tableau [i]);
    }
    }
    

    et le résultat est 3,2,4,5,0.

    Si vous pouviez m'aider, ce serait formidable. Je vous remercie d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
    --
      11 septembre 2017 à 9:53:26

      Salut,

      Alors déjà avant ton tris tu as un petit soucis au niveau de la déclaration de ton tableau :) tu as un tableau de 4 et tu y mets 5 nombres hmmmm ^^

      et ensuit je vois que tu as choisis le tri à bulle bonne méthode mais un peu lente :) mais bon du coup je te conseil de chercher comment faire un tri a bulle si tu ne l'as pas déjà fait car tu n'as que la moitié de l'algo la :) wikipedia l'explique plutôt bien :) si tu n'as pas tout compris revient et on t'expliquera :)

      • Partager sur Facebook
      • Partager sur Twitter
      Quand tu regardes l'abîme, l'abîme regarde aussi en toi.
        11 septembre 2017 à 14:16:26

        Pour ce genre d'exercice, je trouve qu'une bonne idée est de faire le tri à la main. Quand on doit trier un tableau (sans ordinateur), comment fait-on ? Si on y réfléchit bien, on suit un certain algorithme, qu'il faut alors traduire dans le langage. Je trouve ça plus intéressant que de recopier bêtement un algorithme de tri déjà connu. Après tout, le but n'est pas d'avoir un tri efficace, il est d'apprendre à écrire des programmes.

        • Partager sur Facebook
        • Partager sur Twitter
          11 septembre 2017 à 14:46:02

          @robun c'est aussi une bonne méthode mais tu peux trouvé un façon de trier (Ex: trie a bulle) puis faire l'algo après si tu es un génie tu peux essayer mais je pense que aucun algo fait main dépasse un algo qui existe pas déjà
          • Partager sur Facebook
          • Partager sur Twitter
          Quand tu regardes l'abîme, l'abîme regarde aussi en toi.
            11 septembre 2017 à 15:08:00

            NutNut tu coco a écrit:

            @robun c'est aussi une bonne méthode mais tu peux trouvé un façon de trier (Ex: trie a bulle) puis faire l'algo après si tu es un génie tu peux essayer mais je pense que aucun algo fait main dépasse un algo qui existe pas déjà


            Je pense que ce que voulais dire Robun, c'est que quelque soit le tri que tu imagines de tête, un truc intéressant c'est de l'écrire sur papier pour pouvoir le coder derrière. Je pense pas qu'il parlait de créer son propre algo, mais que les gens ont une façon de penser qui va changer le tri que tu vas utiliser de base.
            • Partager sur Facebook
            • Partager sur Twitter

            « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
            D. Mendeleïev

              12 septembre 2017 à 10:34:30

              renseignes toi sur le tri a bulle !

              • Partager sur Facebook
              • Partager sur Twitter

              On estime à environ 550 millions le nombre d'armes à feu actuellement en circulation. Autrement dit il y a un homme sur douze qui est armé sur cette planète. La seule question c'est … comment armer les onze autres ?

                13 septembre 2017 à 5:32:26

                Bonjour tout le monde,

                Merci pour votre aide et pour vos réponse rapide. Et désolé pour le temps de réponse, ma première réponse a été considérée comme du spam...

                J'ai trouvé une solution, qui est de répéter l'action de comparer les nombres temps que le compteur n'est pas égal au nombre de case du tableau- 1. J'ai pensé à cela puisque si le compteur détecte à chaque comparaison que les nombres sont dans le bon ordre, ça signifie qu'on a plus besoin de relancer d'analyse. 

                Est-ce que vous pourriez me donner votre avis sur mon code s'il vous plait  :) Vous êtes géniaux!

                #include <stdio.h>
                #include <stdlib.h>
                
                void ordonnerTableau(int tableau[], int tailleTableau);
                void affichageTableau (int tableau[], int tailleTableau);
                
                int main(double argc, char *argv[])
                {
                    int i = 0;
                    int tableau[7] = {7,6,4, 5, 102,2,1};
                
                    ordonnerTableau(tableau,7); //On envoie le tableau sur la fonction
                    affichageTableau(tableau,7); // On affiche le tableau
                    return 0;
                }
                
                void ordonnerTableau(int tableau[], int tailleTableau)
                {
                    int i = 0 , j=0, compteurTableau=0; // J sert à garder la plus petite variable en mémoire pour la permutation
                
                    while (compteurTableau<tailleTableau-1) /*le compteur est là pour vérifier le nombre de fois où il n'y a pas de permutation,
                    si on arrive à un nombre de non-permutation égale aux nombre de case du tableau - 1, ça siginifie que le tableau est bon */
                    {
                        compteurTableau=0; // on met le compteur à Zero en début de boucle
                        printf("Verification 1 : %d\n",compteurTableau); // on affiche le compteur pour être sûr que ça fonctionne
                        for (i = 0 ; i < tailleTableau ; i++)
                        {
                            if (tableau[i]>tableau[i+1])
                            {
                                j = tableau[i+1];
                                tableau [i+1]=tableau [i];
                                tableau [i] = j;
                                printf("Verification boucle for : %d\n",compteurTableau);
                                affichageTableau(tableau,7); // on affiche le tableau, dans le cas où une permutation a été faite
                            }
                            else
                            {
                                compteurTableau ++;
                            }
                        }
                    printf("Verification 2 : %d\n",compteurTableau); // on vérifie la valeur du compteur à la fin de la boucle
                    }
                }
                
                void affichageTableau (int tableau[], int tailleTableau)
                {
                    int i;
                    for (i = 0 ; i < tailleTableau ; i++){
                        printf("Case %d\t",i+1);
                        printf("%d\n", tableau [i]);}
                }
                



                • Partager sur Facebook
                • Partager sur Twitter
                --
                  16 septembre 2017 à 7:58:25

                  Quelqu'un conseillait de se renseigner sur le tri à bulles. 

                  • Excellente idée, et si on se renseigne bien, on s'apercevra que c'est à peu près le plus mauvais tri. Il n'est pas particulièrement simple, en tout cas moins que le tri par insertion ou le tri par sélection qui sont plus courts, plus faciles à expliquer, et plus rapides en pratique. Il figure dans les exemples habituels pour des raisons historiques (c'était le premier exemple présenté dans les premiers bouquins de programmation des années 60  : hé, regardez, l'ordinateur est capable de trier un tableau !)

                  Ceci dit, l'objet de l'exercice, c'est de chercher _par soi même_ une méthode de tri. Ca veut dire, de l'inventer. D'avoir des idées à soi. Pas d'implémenter une idée trouvée à l'extérieur.

                  Ici l'idée est raisonnable : parcourir le tableau en intervertissant au passage les valeurs adjacentes qui sont dans l'ordre inverse, et recommencer jusqu'à ce qu'il n'y en ait plus.  Il y a quelques complications inutiles : compter les non permutations du tour précédent, alors qu'il suffit de détecter qu'il y a eu au moins une permutation. Et des perspectives d'idées d'amélioration : remarquer qu'à la fin du premier tour, le dernier élément se trouve bien placé, et qu'au second il n'est donc pas nécessaire d'aller jusqu'au dernier. Et aussi qu'au second tour on peut commencer à coté de l'endroit où on a fait la première inversion , inutile de reprendre tout le début.  Tout ça ça conduit effectivement à un tri à bulles amélioré, mais c'est une démarche à faire soi même. Et ça ne donne jamais qu'un pauvre tri à bulles avec sa complexité quadratique.


                  A part ça, il y a un problème : la boucle (ligne 28) fait varier un indice i de 0 à tailleTableau-1.  Dans cette boucle, on accède à tableau[i+1] ligne 28. Quand i vaut tailleTableau-1, ça fait accéder à tableau[tailleTableau], qui est en dehors du tableau. Crac, ça va merder.

                  -
                  Edité par michelbillaud 16 septembre 2017 à 12:17:21

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 septembre 2017 à 5:07:57

                    Merci MichelBillaud pour ton message.

                    Concernant cette partie : 

                    michelbillaud a écrit:

                    A part ça, il y a un problème : la boucle (ligne 28) fait varier un indice i de 0 à tailleTableau-1.  Dans cette boucle, on accède à tableau[i+1] ligne 28. Quand i vaut tailleTableau-1, ça fait accéder à tableau[tailleTableau], qui est en dehors du tableau. Crac, ça va merder.

                    J'ai essayé de remplacer les i par des i-1 et les i+1 par des i mais ça me fait une erreur sur la dernière case : "1" qu'il devient 9156486... Alors que pour moi le système i et i+1 a l'aire de fonctionner. 

                    Est-ce que je me suis trompé quelque part?

                    -
                    Edité par Kadoizo 19 septembre 2017 à 5:08:25

                    • Partager sur Facebook
                    • Partager sur Twitter
                    --
                      19 septembre 2017 à 14:34:25

                      Kadoizo a écrit:

                      J'ai essayé de remplacer les i par des i-1 et les i+1 par des i mais ça me fait une erreur sur la dernière case : "1" qu'il devient 9156486... Alors que pour moi le système i et i+1 a l'aire de fonctionner. 

                      Est-ce que je me suis trompé quelque part?

                      -
                      Edité par Kadoizo il y a environ 9 heures


                      Non, ça ne fonctionne pas du tout. Si tu regardes ce qui s'affiche vraiment à la fin de ton programme (il faut virer les affichages intermédiaires), c'est

                      Case 1	0
                      Case 2	1
                      Case 3	2
                      Case 4	4
                      Case 5	5
                      Case 6	6
                      Case 7	7
                      

                      et ça ne correspond pas au tableau à ordonner

                          int tableau[7] = {7,6,4, 5, 102,2,1};

                      donc oui, tu t'es trompé. Tu as tes indices qui débordent, soit d'un côté tableau[-1], soit de l'autre.

                      Ta boucle qui échange une case avec son voisin, elle doit être exécution tailleTableau-1 fois.  Parce qu'il y a N-1 intervalles si il y a N poteaux.



                      -
                      Edité par michelbillaud 19 septembre 2017 à 14:35:06

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 septembre 2017 à 17:54:27

                        michelbillaud a écrit:

                        Ceci dit, l'objet de l'exercice, c'est de chercher _par soi même_ une méthode de tri. Ca veut dire, de l'inventer. D'avoir des idées à soi. Pas d'implémenter une idée trouvée à l'extérieur.

                        Voilà, et c'est ça que j'ai dit dans mon précédent message ! Je crois que chercher un algorithme existant n'est pas du tout le but de ce genre d'exercice.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Exercice 5 - Fonction ordonnerTableau

                        × 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