Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Javascript] Boucle infinie....

Boucle interminable pour script conversion décimal->binaire

Sujet résolu
Anonyme
    15 décembre 2011 à 16:41:30

    Bonjour à tous,
    Je suis confronté à un problème que je n'arrive pas à résoudre ( sûrement dû à mon manque d'expérience en javascript ). J'aimerais réaliser un script convertissant un nombre décimal entré par l'utilisateur en nombre binaire.

    Voici mon code :

    <script>
    
    var nombre = prompt("Veuillez insérer le nombre à convertir :");
    var reste = null;
    
    
    while ( nombre != 0 ) {	
    
    	if ( reste != null ) {
    		reste = (nombre%2)+''+reste;
    		
    	} else {
    		reste = nombre%2;
    	}
    	
    	nombre = nombre / 2;
    	
    }
    
    alert(reste);
    
    </script>
    


    Tout semble nikel, mais la boucle ne s'arrête jamais... Cependant après plusieurs bidouilles, il semblerait que la ligne à problème soit celle-ci ( je n'en suis pas sûr ) :

    nombre = nombre / 2;
    


    Voilà, merci pour votre attention ^^

    edit : voilà ce que me retourne la console web de firefox :

    Image utilisateur


    ps : la boucle me renvoie ce genre d'informations :
    Image utilisateur
    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2011 à 2:13:43

      (à déplacer dans le forum JS)

      A priori il y a plusieurs problèmes:
      - tu mélanges des strings et des entiers (en réalité tu n'as jamais d'entier comme nombre est une string, si tu fais pas attention js peut être assez, comment dire, déroutant: '2' + 3 == '23', et '2' * 3 == 6)
      - si je ne dis pas d'erreur la division en js est une "vraie" division, donc tu auras beau diviser un nombre autant de fois que tu le veux pas 2 il ne sera jamais nul.
      - ton algo me semble étrange (par exemple, on passera dans le if qu'au premier tour de boucle, ou bien où est-ce que tu stockes le résultat, dans reste?)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        16 décembre 2011 à 11:36:43

        Oui en effet je me suis trompé de forum. Comme je naviguais sur 2 forums en même temps, j'ai créer le sujet sur le mauvais forum ^^'
        Bref si un modérateur passe par là, il saura quoi faire :)

        Sinon cerium50, en fait mon algorithme se passe comme ça :

        1) L'utilisateur entre le nombre souhaité ( variable nombre ).
        2) Tant que nombre est différent de 0, on peut le diviser par 2 ( car le binaire utilise la base 2 ) et le reste de la division donne 0 ou 1.
        3) La variable reste ajoute à chaque fois le reste de la division de droite à gauche, pour que l'écriture binaire soit dans le bon sens.

        Voilà, donc mon problème viendrait de la variable nombre qui serait un string. Comment dois-je faire pour qu'elle devienne un entier ?
        • Partager sur Facebook
        • Partager sur Twitter
          16 décembre 2011 à 12:02:50

          Sujet déplacé dans la catégorie Javascript.
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
          Anonyme
            16 décembre 2011 à 12:22:50

            Merci nohar.

            Voilà ce que la console web de firefox me renvoie :

            Image utilisateur


            C'est écrit " undefined "....

            ps : même en ajoutant un parseInt pour la variable nombre, j'ai toujours ce même problème...
            • Partager sur Facebook
            • Partager sur Twitter
              16 décembre 2011 à 13:29:15

              Je viens de tester ça dans Firebug:

              var nombre = parseInt(prompt("Veuillez insérer le nombre à convertir:"), 10),
                   // préciser le 10, c'est la base du nombre d'origine,
                   // tu peux avoir des suprises si tu ne le fais pas
                  resultat = ''; // au début c'est vide
              
              while(nombre) { // tant que le nombre est vrai (!= 0)
                  // si nombre est divisble par deux on ajoute un 0 au début
                  resultat = (nombre % 2 ? '1' : '0') + resultat;
                  // on décale les bits de nombres vers la droite (ça résouds le problème
                  // de vraie division (tu pourrais aussi faire
                  // nombre = (nombre - nombre % 2) / 2 si tu trouves ça plus simple)
                  nombre >>= 1;
              }
              
              if(!resultat) { // si la chaîne est vide
                  // alors nombre valait 0 donc:
                  resultat = '0';
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
                16 décembre 2011 à 20:24:24

                Si tu cheches une solutions simple :
                parseInt( prompt( 'Nombre ?' ), 10 ).toString( 2 )
                

                Si tu fais ca pour t'entrainer reposte ton code.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  17 décembre 2011 à 1:13:50

                  Merci beaucoup à vous deux !

                  @cerium50 : grâce à ton code j'ai pu constaté certaines manies qu'a JS. Merci beaucoup ! :)

                  @xavierm02 : le code que tu m'a proposé est super : simple et court.
                  Voilà le script fonctionnel que j'ai pu obtenir avec ce bout de code :

                  var nombre = parseInt( prompt( 'Nombre ?' ), 10 ).toString( 2 );
                  alert(nombre);
                  


                  Bref merci à tous d'avoir éclairé ma lanterne ! ;)
                  Problème résolu.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Javascript] Boucle infinie....

                  × 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