Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction trop longue

fabrication d'un minijeudecartes

Sujet résolu
    22 avril 2006 à 11:48:29

    voici la partie qui fait les jeux.
    il s'agit de remplir 2 tableaux de 10 cases chacuns avec tout les nombre de 1 à 20 compris, sans avoir bien sur, deux fois le meme nombre. en théorie sa marche mais en pratique, c'est très treès long, voir, cela ne se fini jamais. voici ma fonction.:
    formerjeu=0
    do
    {
    jeudecartes1[formerjeu]=tirercarte();/*tirer carte() est une fonction qui tire un nombre entre 0 et
    21 car je veux obtenir un nombre entre 1 et 20 compris*/

    dejautilise[formerjeu]= jeudecartes1[formerjeu];
    for(boucle=0; boucle<formerjeu; boucle++)
    {
    if (dejautilise[boucle]==jeudecartes1[formerjeu])
    {
    jeudecartes1[formerjeu]=0;
    dejautilise[formerjeu]=0;
    }}
    if (jeudecartes1[formerjeu]!=0)
    {
    formerjeu++;
    }
    }while (formerjeu=10);

    formerjeu=0;
    do
    {
    formerjeu2=formerjeu=10;
    jeudecartes2[formerjeu]=tirercarte();
    dejautilise[formerjeu2]= jeudecartes2[formerjeu];
    for(boucle=0; boucle<formerjeu; boucle++)
    {
    if (dejautilise[boucle]==jeudecartes1[formerjeu])
    {
    jeudecartes2[formerjeu]=0;
    dejautilise[formerjeu]=0;
    }}
    if (jeudecartes2[formerjeu]!=0)
    {
    formerjeu++;
    }
    }while (formerjeu=10);

    si vous avez une idee pour optimiser ce passage qui, je vous le rappelle, sur un vieux 98 comme le mien, est très long.
    merci de m'aider!!
    • Partager sur Facebook
    • Partager sur Twitter
      22 avril 2006 à 12:04:51

      Merci d'utiliser la balise "code" pour mettre en forme les codes, comme expliqué dans ce post-it :
      http://www.siteduzero.com/forum-83-6661-regles-de-ce-forum.html

      Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.

      Voici un exemple de code non coloré avec la balise "citation" (mauvais exemple) :

      Citation : Pas de titre

      int main(int argc, char *argv[])
      {
      long choixOperation;

      printf("Choisissez l'operation a effectuer \n\n");
      /* etc. */
      }



      Voici maintenant le même code coloré, si vous aviez utilisé la balise "code" (bon exemple) :

      int main(int argc, char *argv[])
      {
          long choixOperation;

          printf("Choisissez l'operation a effectuer \n\n");
          /* etc. */
      }


      C'est plus clair n'est-ce pas ? :)
      N'hésitez pas à éditer votre message pour changer la balise afin de colorer votre code.


      [Ceci est une réponse semi-automatique]
      • Partager sur Facebook
      • Partager sur Twitter
        22 avril 2006 à 13:18:29

        Indente ton code car là je ne comprends rien !!!

        formerjeu = 0
        do
        {
          jeudecartes1[formerjeu] = tirercarte();       /* tirer carte() est une
                                                         * fonction qui tire un
                                                         * nombre entre 0 et 21 car
                                                         * je veux obtenir un nombre
                                                         * entre 1 et 20 compris */

          dejautilise[formerjeu] = jeudecartes1[formerjeu];
          for (boucle = 0; boucle < formerjeu; boucle++)
          {

            if (dejautilise[boucle] == jeudecartes1[formerjeu])
            {

              jeudecartes1[formerjeu] = 0;
              dejautilise[formerjeu] = 0;

            }

          }

          if (jeudecartes1[formerjeu] != 0)
          {

            formerjeu++;

          }

        }while (formerjeu = 10);

        formerjeu = 0;
        do
        {

          formerjeu2 = formerjeu = 10;
          jeudecartes2[formerjeu] = tirercarte();
          dejautilise[formerjeu2] = jeudecartes2[formerjeu];

          for (boucle = 0; boucle < formerjeu; boucle++)
          {

            if (dejautilise[boucle] == jeudecartes1[formerjeu])
            {

              jeudecartes2[formerjeu] = 0;
              dejautilise[formerjeu] = 0;

            }

          }
          if (jeudecartes2[formerjeu] != 0)
          {

            formerjeu++;

          }

        }while (formerjeu = 10);


        pratique pour indenter !

        Après que le code ait été indenté, j'ai toujours du mal à le comprendre, il nous faudrait plus d'informations car là on ne sait pas du tout quelle variable correspond à quoi !
        • Partager sur Facebook
        • Partager sur Twitter
          22 avril 2006 à 14:07:16

          Regarde ma solution ici : http://www.siteduzero.com/forum-83-34229-p1-optimisation-d-un-code.html

          Tu peux faire la même chose, mais en une seule dimension (au lieu d'avoir un tableau de "cases vides restantes", tu stockes juste une variable qui contient le nombre de nombres à tirer).
          • Partager sur Facebook
          • Partager sur Twitter
            22 avril 2006 à 14:08:14

            Citation : grigreg

            voici la partie qui fait les jeux.
            il s'agit de remplir 2 tableaux de 10 cases chacuns avec tout les nombre de 1 à 20 compris, sans avoir bien sur, deux fois le meme nombre. en théorie sa marche mais en pratique, c'est très treès long, voir, cela ne se fini jamais. voici ma fonction.:

            formerjeu=0
            do
            {
            jeudecartes1[formerjeu]=tirercarte();/*tirer carte() est une fonction qui tire un   



            Problème récurrent. Je suis prêt à parier que srand() est dans cette fonction (tirercarte()), au lieu d'être appelé une seule fois au début du code comme il se doit. Le tirage étant toujours le même, impossible de 'mélanger'...
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              22 avril 2006 à 14:39:50

              Hop hop, ça m'amusait alors j'ai implémenté ma solution.
              Je te file le code ici, mais si tu veux pas de code tout fait et que tu veux trouver tout seul, bah t'as qu'à pas le lire.

              C'est une fonction qui prend un tableau et sa taille, et renvoie un autre tableau, contenant tous les éléments du premier, dans le désordre.

              Pour l'adapter à ton besoin précisément, et bien tu n'as qu'à faire un tableau de 20 éléments (de 1 à 20), lui appliquer ma fonction, et couper le résultat en deux pour avoir deux tableaux. (result et result+10 basiquement suffiraient).

              #include <stdio.h>
              #include <stdlib.h>
              #include <time.h>

              int * shuffle(int tab[], int len)
              {
                  int *temp, *result;
                  result = malloc(len * sizeof tab[0]);
                  temp = calloc(len, sizeof tab[0]); //temp est initalisé : 0 partout

                  int i, j;
                  for(i = 0; i < len; ++i) {
                      int index = rand() % (len - i);
                      /* (len-i) représente le nombre de nombres non encore choisis au hasard
                         index représente la position d'un de ces nombres
                      */

                      for(j = 0; index > 0 || temp[j]; j++)
                          if (!temp[j])
                              --index;
                      /* on parcourt le tableau pour trouver le nombre non choisi
                         de rang 'index'. Quand index vaut 0, alors j représente l'index
                         du nombre choisi. */

                      temp[j] = i;
                      /* temp[i] ne vaut plus 0, il sera considéré comme "ayant été choisi" */
                      result[i] = tab[j];
                  }
                  free(temp);
                  return result;
                  /* result a été malloc ici. Vous n'oublierez pas de le freer plus tard ? */
              }

              int main(void)
              {
                  int tab[10] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
                  int *shfl;
                  srand(time(NULL));
                  shfl = shuffle(tab, 10);

                  int i;
                  for (i = 0; i < 10; ++i)
                      printf("%d\n", shfl[i]);
                 
                  free(shfl);
                  return 0;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                22 avril 2006 à 19:35:04

                excuse moi,

                Citation : bluestorm

                result = malloc(len * sizeof tab[0]);
                    temp = calloc(len, sizeof tab[0]);

                c'est quoi ces fonction??
                • Partager sur Facebook
                • Partager sur Twitter
                  22 avril 2006 à 19:36:32

                  Hum... mauvaise question.
                  Punition : recopier 10 fois pour demain
                  http://dpobel.free.fr/man/html/affiche_man.php/1698/man/malloc/
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 avril 2006 à 19:54:52

                    c'est bizarre mais sa marche pas, en faisant tout comme tu as dit voila ce que cela donne dans la fonction "main":
                    int tab[20] ={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                    15, 16, 17, 18, 19, 20 };
                    int *shfl;
                    srand(time(NULL));
                    shfl = shuffle(tab, 20);
                    free(shfl);
                    for (boucle = 0; boucle < 10; boucle++) {
                            jeudecartes1[boucle] = tab[boucle];
                            jeudecartes2[boucle] = tab[boucle + 10];
                    }


                    ensuite j'ai mis exactement la fonction que tu m'avais propose, bluestorm mais les chiffres restent trier.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 avril 2006 à 0:32:26


                      shfl = shuffle(tab, 20);
                      // [...]
                               jeudecartes1[boucle] = tab[boucle];
                               jeudecartes2[boucle] = tab[boucle + 10];

                      En bas, c'est pas tab[boucle] mais shfl[boucle];
                      Essaie de réfléchir un chouilla quand tu copie cool du code hein :p
                      Et vire le free(shfl) aussi... Enfin, met le à la fin.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 avril 2006 à 1:12:04

                        Oh ben non on devrait faire une réforme du langage C qui changerait ça automatiquement :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 avril 2006 à 8:58:11

                          oui merci beaucoup sa marche.
                          Secret (cliquez pour afficher)
                          mais j'ai rien compris à ton code quand meme!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 avril 2006 à 9:46:11

                            Ben si tu l'as pas compris, ne l'utilise pas.

                            Relis l'explication que j'ai donné sur l'autre topic, relis mon code (j'ai même mis des commentaires, quand même), et pose moi des questions sur là où tu comprends plus.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            fonction trop longue

                            × 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