Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau exercice 5

    21 novembre 2007 à 11:21:00

    Salutation,
    bon voilà, à l'exercice 5, je creais une fonction pour organiser les données du tableau:

    1. void ordonnerTableau (long *tableau, long tTab)
    2. {
    3.     do
    4.     {
    5.                      long i, temp=0;
    6.                      for (i=0; i<tTab; i++)
    7.                      {
    8.                           if (tableau[i]>tableau[i++])
    9.                           {
    10.                              temp=tableau[i++];
    11.                              tableau[i++]=tableau[i];
    12.                              tableau[i]=temp;
    13.                            }
    14.                      }
    15.     }
    16.     while (! tableau[1]<tableau[2]<tableau[3]<tableau[4]);
    17. }
    cependant, le programme bugue, et je ne trouve pas mon erreur :/

    J'ai aussi essayé de creer des chiffres aleatoire pour mon tableau avec une fonction utilisant srand (comme pour plus ou moin), pourtant il affice 4 fois le même chiffre :/

    1. #include <time.h>
    2. void generationNombre (long *tableau, long tTab)
    3. {
    4.      long i;
    5.      for (i=0; i<tTab; i++)
    6.      {
    7.     const long MAX=50, MIN=1;
    8.     srand(time (NULL));
    9.     tableau[i]=(rand() % (MAX-MIN+1))+MIN;
    10.     }
    11. }

    Le probleme est que ce sont 4 chiffres identiques qui sont générés
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2007 à 12:14:30

      Bonjour, pour commencer LES BALISES C sinon c'est moche et très peu lisible :colere2:

      Voila maintenant je pense que tu devais au lieu de mettre :

      1. tableau[i++]


      utilisé :

      1. j = i + 1
      2. tableau[j]


      Voila, car en plus, par la suite tu tilise i+1 dans l'indice de ton tableau ^^

      Après utilise deux boucle for imbriquées, une parcourant un tableau avec i et l'autre avec j (j = i + 1) et à chaque tour de boucle vérifie si tableau[i] (qui correspond à une valeur affichée avant tablea[j]) est supèrieure à tableau[j] et donc à ce moment utilise un algorithme basique de permutation :

      1. Essaye de trouver tout seul, le tien est faux  ^^


      Pense qu'il faut que ta permutation respecte ce principe :

      1. - La valeur de tableau[i] prend la valeur de tableau[j]
      2. - La valeur de tableau[j] prend la valeur de tableau[i]


      Je ne sais pas si tu la vu mais il y'a un problème, si tableau[i] prend la valeur de tableau[j] et qu'après tableau[j] reprend la valeur de tableau[i], en aucun cas il y aura une permutation.
      Il faut donc que tu trouve le moyen d'isoler la valeur de tableau[i] avant la permutation.

      J'ai fait en vitesse un shéma pour te montrer comment sa marche, en espérant que sa t'aidera ^^ :

      Image utilisateur

      Voila ;)

      Cordialement War - Yor.

      EDIT : J'édite mon message pour dire que cette technique de tri par ordre croissant a été choisie par M@teo pour sa simplicité à être codé mais je ne pense pas que sa soit une méthode adapté à des très gros tableau.
      Effectivement, un tri d'un tableau tel que :

      1. long int tableau[8000] = {0}


      avec la technique de permutation, le programme prendrait trop de temps à faire le tri, c'est pour que si tu cherche à trier un grand tableau cherche sur le web un algorithme de tri plus sophistiqué ou code le tien :p

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2007 à 14:26:48

        Merci pour tes conseils, j'ai reussi à ordonner le tableau
        grace en modifiant la fonction:
        1. void ordonnerTableau (long *tableau, long tTab)
        2. {
        3.                      long i, temp=0, j=0;
        4.                      for (i=0; i<tTab; i++)
        5.                      {
        6.                          for (j=i+1; j<tTab; j++)
        7.                          {
        8.                              if (tableau[i]>tableau[j])
        9.                              {
        10.                                 temp=tableau[j];
        11.                                 tableau[j]=tableau[i];
        12.                                 tableau[i]=temp;
        13.                              }
        14.                          }
        15.                      }
        16. }

        Et là les chiffres s'ordonnent. Par contre j'essaye encore de comprendre
        pourquoi ça marche maintenant alors que ça ne marchait pas avant :/.

        T'auras pas un pti conseil pour mes chiffres aleatoires? ;o)

        edith: j'ai supprimé la boucle while est ça marche aussi :). Mais je ne comprends pas trop pourquoi... j'y retourne ^^
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2007 à 15:11:46

          Alors voila ta fonction :

          1. void ordonnerTableau (long *tableau, long tTab)
          2. {
          3.     do
          4.     {
          5.                      long i, temp=0;
          6.                      for (i=0; i<tTab; i++)
          7.                      {
          8.                           if (tableau[i]>tableau[i++])
          9.                           {
          10.                              temp=tableau[i++];
          11.                              tableau[i++]=tableau[i];
          12.                              tableau[i]=temp;
          13.                            }
          14.                      }
          15.     }
          16.     while (! tableau[1]<tableau[2]<tableau[3]<tableau[4]);
          17. }


          Tu n'utilise pas le type de boucle, tu utilise do alors que pour parcourir un tableau c'est bien mieux les boucles for ;)

          Ensuite tu incrémente tableau[j] à la variable temp alors que tu devrais incrémente tableau[i] à cette variable pour l'isoler.
          Ensuite maintenant que tu as isolé tableau[i] dans une variable tu peux modifier la valeur de tableau[i] directement en lui attribuant la valeur de tableau[j] donc tableau[i] = tableau[j] et c'est la que temp qui vaut tableau[i] va nous être utile car elle contient la valeur de tableau[i] et on peut donc incrémenter la valeur de temp à tableau[j].

          C'est bien se que tu fais ici, sauf que tu inverse (mais sa reste correct)

          1. void ordonnerTableau (long *tableau, long tTab)
          2. {
          3.                      long i, temp=0, j=0;
          4.                      for (i=0; i<tTab; i++)
          5.                      {
          6.                          for (j=i+1; j<tTab; j++)
          7.                          {
          8.                              if (tableau[i]>tableau[j])
          9.                              {
          10.                                 temp=tableau[j];
          11.                                 tableau[j]=tableau[i];
          12.                                 tableau[i]=temp;
          13.                              }
          14.                          }
          15.                      }
          16. }


          Voila.

          Cordialement War - Yor.
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2007 à 15:20:38

            :-° rooooooooooooh j'ai compris mes erreurs
            Encore merci pour ton aide :D
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2007 à 16:07:17

              Tu as compris tes erreurs, c'est bien mais as tu compris le comment du pourquoi du code et c'est là ou réside le problème.
              Il faut que tu es compris pourquoi tu avez codé comme ça, sinon sa ne sert à rien ;)

              A bientôt !

              Cordialement War - Yor.
              • Partager sur Facebook
              • Partager sur Twitter

              Tableau exercice 5

              × 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