Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tour de boucle incrémenté

    18 octobre 2018 à 18:38:05

    Bonjour, j'aimerais faire de sorte que aaa s'affiche tel que:

    - aaa.aab..aac..zzz ..aa0..aa1.a00..999

    Mais j'y arrive pas du tout car une fois à z le programme se répète indéfiniment, j'suis complètement largué si quelqu'un peut m'expliquer comment m'y prendre, ce serait sympa !

    Voici mon début de code: (avec 5chiffres)

    private char res_tmp(char a)
            {
                if (a == '9')
                    return (a);
                if (a == 'z')
                    return (a);
                return (++a);
            }
    
            private void btn_start_Click(object sender, EventArgs e)
            {
                string id = txtb_id.Text;
    
                int id_length = id.Length;
                int index = 0;
                if (id_length > 6)
                    return;
    
                char[] tmp = id.ToArray();
                while (tmp[0] <= '9' || tmp[0] <= 'z')
                {
                    while (tmp[1] <= '9' || tmp[1] <= 'z')
                    {
                        while (tmp[2] <= '9' || tmp[2] <= 'z')
                        {
                            while (tmp[3] <= '9' || tmp[3] <= 'z')
                            {
                                while (tmp[4] <= '9' || tmp[4] <= 'z')
                                {
                                    while (tmp[5] <= '9' || tmp[5] <= 'z')
                                    {
                                        lbl_id.Text = index.ToString();
                                        index++;
                                    }
                                    tmp[4] = res_tmp(tmp[4]);
                                }
                                tmp[3] = res_tmp(tmp[3]);
                            }
                            tmp[2] = res_tmp(tmp[2]);
                        }
                        tmp[1] = res_tmp(tmp[1]);
                    }
                    tmp[0]++;
                }
            }

    Merci d'avance !

    -
    Edité par AxelGossaye 18 octobre 2018 à 18:50:08

    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2018 à 18:57:42

      Imaginons qu'au lieu de ta séquence tu cherches à obtenir celle-ci :

      000 001 002 … 009 00A 00B … 00F 010 … 019 01A … FFF

      Autrement dit une séquence hexadécimale, typiquement on se casserait pas la tête à bidouiller dans un tableau et compagnie, on ferait une boucle toute bête de 0 à 2047 (16*16*16 - 1) et on afficherait chaque nombre en représentation hexadécimale.

      Dans ton cas l'idée est la même, il s'agit juste d'une base 36 avec d'abord les lettres et ensuite les chiffres mais fondamentalement c'est le même principe.

      Du coup d'abord il te faudrait une méthode de conversion (int -> string) pour passer de la base 10 à la base 36 et armé de ça suffira juste d'une boucle

      Quant à la méthode de conversion, l'algo pour passer d'une base à une autre est classique et connu, quelques recherches devraient donner pas mal d'infos

      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.
        18 octobre 2018 à 19:09:20

        Votre code est imbitable.

        Utilisez un débogueur, parce que des erreurs, il y en a à peu près partout.

        C'est quoi la sémantique de la fonction "res_tmp" ?

        "Je ++, mais pas trop" ???

        Les conditions de tous les while sont aux fraises, '9' est toujours plus petit que 'z', donc le premier terme de l'expression booléenne ne sert à rien.

        etc..

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          18 octobre 2018 à 20:39:19

          Merci pour vos réponses, c'est normal si le code est incohérent, j'ai posté une partie du code.

          Maintenant merci pour t'es remarques @bacelar, trop de trucs qui sert à rien ^^

          @Sehnsucht, je comprend pas vraiment ce que tu me dis.. une méthode de conversion int to string ? .ToString() n'est pas suffisant ou string.Format ? j'avoue ne pas comprendre, mais j'ai quand même " ma fonction "

          private string toString(int nbr)
                  {
                      string res = "";
          
                      if (nbr < 10)
                          return string.Concat(nbr);
                      while (nbr > 10)
                      {
                          res = string.Concat(res, nbr % 10);
                          nbr /= 10;
                      }
                      res = string.Concat(res, nbr % 10);
                      return new string(res.Reverse().ToArray());
                  }

          Je comprend pas comment de la base 36 ont peu obtenir le résultat souhaité, auriez-vous un peu plus d'explications pour un novice ?

          • Partager sur Facebook
          • Partager sur Twitter
            19 octobre 2018 à 12:26:50

            >le code est incohérent, j'ai posté une partie du code.

            Et ?

            Les noms des fonctions doivent indiquer CLAIREMENT ce qu'elles font, quand on n'arrive pas à poser un nom à une fonction, c'est que la fonction est mal fichue. Posez un "bon" nom à votre méthode "res_tmp". :lol:

            Vous devez faire en sorte que votre code soit facilement compréhensible et ne nécessitant pas de connaitre des millions de détails, votre "moi" de dans 6 mois vous remerciera lors de la relecture du code.

            Ce que vous propose @Sehnsucht, c'est de changer de paradigme, d'angle de vue.

            Si on vous demande d'afficher les 100000 premiers nombres avec toujours 5 chiffres (donc avec des 0 devant pour les valeurs inférieurs à 10000 : 00000, 00001, 00002 .... 00010, 00011, .... 09999, 10000 ..... 99998, 99999), cela ne vous pose pas de problème particulier.

            Si on vous demande de faire la même chose mais en hexadécimale (chiffres : 0, 1, ... E, F), cela ne posera pas de problème non plus (quelques % 16 à la place de %10).

            Ici, vous avez juste à le faire sur une base 36 (et pas 10 comme vous le faite dans votre fonction "toString") et utiliser un ensemble de chiffres [a,b,....z,0,1...9] à la place de [0....9,A....Z] de la représentation hexadécimale.

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              19 octobre 2018 à 13:08:01

              res_tmp :D
              Quoiqu'il en soit, je comprend toujours pas (n'allez surtout pas croire que je le fais exprès ^^)
              base36c'est bien ça?
              private string toBase36(int nbr)
                      {
                          string result = "";
                          string base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
              
                          while (nbr > 0)
                          {
                              result = base36[nbr % 36] + result;
                              nbr /= 36;
                          }
              
                          return result;
                      }
              En quoi l'affichage en hexadécimal m'aiderait à avoir ma suite de chiffres ? Et les lettres dans tout ça ? Incroyable c'est vraiment du chinois pour moi.
              A quoi me sert cette fonction si je peux que lui envoyer des int ?
              • Partager sur Facebook
              • Partager sur Twitter
                19 octobre 2018 à 14:28:11

                >base36c'est bien ça?

                Oui.

                Et maintenant, ça donnerait quoi comme sortie, ce code :

                for(int i = 0 ; i< Math.Pow(36,id_length);i++)
                {
                    Console.WriteLine(toBase36(i));
                }

                Il manque plus que le padding à gauche avec des "0".

                -
                Edité par bacelar 22 octobre 2018 à 10:48:52

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  19 octobre 2018 à 22:55:12

                  bacelar a écrit:

                  >base36c'est bien ça?

                  Oui.

                  Et maintenant, ça donnerait quoi comme sortie, ce code :

                  for(int = 0 ; i< Math.Pow(36,id_length);i++)
                  {
                      Console.WriteLine(toBase36(i));
                  }

                  Il manque plus que le padding à gauche avec des "0".

                  Incroyable ! mais j'aurais jamais pu trouver ça tout seul..

                  Mais comment démarrer avec pour valeur: A00000 ? int n'est pas le bon format peut etre ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 octobre 2018 à 10:57:56

                    >Mais comment démarrer avec pour valeur: A00000 ?

                    Tu remplaces le "int i = 0" de la partie initialisation de la boucle par:

                    int startEnumeration = 10 * (Math.Pow(36,id_length-1));
                    int endEnumeration = Math.Pow(36,id_length);
                    ...
                    for(int i = startEnumeration ; i < endEnumeration; i++)
                    {
                    ....
                    }
                    


                    >int n'est pas le bon format peut etre ?

                    int n'est pas un format mais un type de variable.

                    Tu peux utiliser n'importe quel type entier (short, int, long, ...) du moment qu'il est assez grand pour contenir "endEnumeration" (donc pas vraiment "short").

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      23 octobre 2018 à 9:37:00

                      Sinon de manière beaucoup moins propre mais largement plus intuitive (du moins je trouve), ca serait de faire une triple boucle imbriquée de 1 à 36, et de retourner la concaténation des 3 toBase36(i).
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 octobre 2018 à 10:45:41

                        3 boucles ?

                        T'as pas lu son source, la longueur de la chaine est variable, pas forcement 3.

                        Mais effectivement, la solution proposée n'est pas la plus intuitive mais elle est bien plus simple que la solution "triviale".

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                        Tour de boucle incrémenté

                        × 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