Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableaux simples

exercice

Sujet résolu
    19 novembre 2007 à 16:00:04

    bonjour,je suis débutant en C++, j'essaye de faire cet exercice mais je vois pas comment procéder, je sais pas si je dois utiliser une fonction swap ou d'autres.
    j'attends vos suggestions, voici l'exercice :
    Écrire une fonction qui tasse un vecteur d’entiers : tous les zéros se retrouvent à la fin,
    l’ordre des autres nombres ne doit pas être conservé.
    Exemple : (0,1,0,2,0,0,3,4) devient (4,1,3,2,0,0,0,0).
    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2007 à 16:23:56

      Sais-tu comment utiliser les boucles, lire des valeurs dans un vecteurs, les modifier? tu peux imaginer une technique pour faire un échange entre 2 valeurs, c'est vraiment pas compliqué! tu peux le faire sur papier pour tester ton algorithme!
      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2007 à 17:50:26

        std::partition je crois.
        Sinon, c'est deux pointeurs/indices/itérateurs qui vont en sens inverse. Si le "premier" tombe sur un 0, tu inverses/échange (std::swap) les valeurs référencées et décrémente l'itérateur de fin. Dans tous les cas tu incrémentes l'itérateur de début jusqu'à "dépasser/ateindre" celui de fin.
        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          19 novembre 2007 à 21:01:11

          Si tout tes nombres sont positifs, un sort de <algorithm> suivi d'une inversion te suffira. Sinon, la solution de lmghs me semble la meilleure.

          Peut-être qu'avec des outils "plus avancés" tels les val_array tu pourrais t'en sortir plus facilement encore. Mais je suis pas sûr.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            19 novembre 2007 à 23:55:37

            bon je crois qu'il manque un petit truc dans mon code, en fait voilà ce que j'ai comme résultat
            si par exemple je tape(0,1,0,2,0,0,3,4)devient(4,1,0,2,0,0,3,0).
            et voici la fonction que j'utilise :

            void vecteur(int v[], int taille)
            {int i;
            for(i=0;i<taille;++i)
            {
            if(v[i]==0)
            swap(v[i],v[taille-1-i]);
            else
            ++i;
            }
            }
            • Partager sur Facebook
            • Partager sur Twitter
              20 novembre 2007 à 15:50:21

              balise <code >... tssssk

              relis ton code et fais le fonctionner par étape tu devrais te rendre compte de ce qui tourne mal.

              • Partager sur Facebook
              • Partager sur Twitter
                20 novembre 2007 à 19:32:52

                j'ai fait quelques réctifications dans mon algorithme.
                bon disons que ça ne marche pas pour tous les cas.
                si quelqu'un pourrait faire l'exercice svp, ça m'aidera bcp :D
                • Partager sur Facebook
                • Partager sur Twitter
                  20 novembre 2007 à 20:19:21

                  voilà ton code bien présenté :
                  1. void vecteur( int v[], int taille )
                  2. {  
                  3.     for( int i = 0; i < taille; ++i )
                  4.     {
                  5.         if( v[ i ] == 0 )
                  6.             swap( v[ i ], v[ taille - 1 - i ] );
                  7.         else
                  8.             ++i;
                  9.     }
                  10. }


                  voilà ce que donne ton algo prouvé sur papier

                  1. pour v = { 0, 1, 0, 2, 0, 0, 3, 4 } et taille = 8
                  2. faire tant que i < taille(8)
                  3. itération i = 0
                  4. i(0) < taille(8) ? oui
                  5. v[ i ](0) == 0 ? oui
                  6. swap : v[ i ](0) <=> v[ 8 - 1 - 0 (7)](4)
                  7. fin iteration
                  8. i(1) <- i(0) + 1
                  9. v = { 4, 1, 0, 2, 0, 0, 3, 0 }
                  10. iteration i = 1
                  11. i(1) < taille(8) ? oui
                  12. v[ i ](1) == 0 ? non
                  13. i(2) <- i(1) + 1
                  14. fin iteration
                  15. i(3) <- i(2) + 1
                  16. iteration i = 3
                  17. i(3) < taille(8) ? oui
                  18. v[ i ](2) == 0 ? non
                  19. i(4) <- i(3) + 1
                  20. fin iteration
                  21. i(5) <- i(4) + 1
                  22. iteration i = 5
                  23. i(5) < taille(8) ? oui
                  24. v[ i ](0) == 0 ? oui
                  25. swap : v[ i ](0) <=> v[ 8 - 1 - 5 (2)](0)
                  26. fin iteration
                  27. i(6) <- i(5) + 1
                  28. v = { 4, 1, 0, 2, 0, 0, 3, 0 }
                  29. iteration i = 6
                  30. i(6) < taille(8) ? oui
                  31. v[ i ](3) == 0 ? non
                  32. i(7) <- i(6) + 1
                  33. fin iteration
                  34. i(8) <- i(7) + 1
                  35. iteration i = 8
                  36. i(8) < taille(8) ? non
                  37. fin faire tant que!
                  38. vecteur final : v = { 4, 1, 0, 2, 0, 0, 3, 0 }


                  ;) maintenant tu es bon pour réussir ton devoir tout seul!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 novembre 2007 à 22:55:05

                    Merci Mattex, dis stp tu fais comment pour avoir ces captures d'écran ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 novembre 2007 à 22:56:59

                      va voir l'un des post-it du forum que tu devrais avoir lu AVANT de poster un message sur le forum


                      ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 novembre 2007 à 1:42:27

                        Indice: 4e mot de ma seconde phrase de mon premier post de ce fil.

                        PS pour Nanoc: les outils avancés de la SL, c'est std::partition, qui suffit amplement (inutile de sortir std::stable_partition)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                        Tableaux simples

                        × 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