Décimal en binaire

Résolu

Bonjour,

je cherche à convertir un nombre décimal entier en nombre binaire. Mais lors de l'exécution de ma fonction, il est dit que je ne pas additionner un int et un str mais ce que je ne comprends pas c'est que juste avant je mets les deux en str.

Voici mon programme :

def dec_to_bin(decimal):
    binaire=""
    quotient = decimal//2
    reste = decimal%2
    str(reste)
    binaire = reste + binaire
    while quotient!=0 :
        decimal = quotient
        reste = decimal% 2
        binaire = reste + binaire
        quotient = quotient//2

    
    while len(binaire)==4 :
        binaire = binaire+str(0)
        
    return binaire


assert dec_to_bin(10) == '1010'
assert dec_to_bin(15) == '1111'
assert dec_to_bin(0) == '0000'

Et voici le message d'erreur :

 
Traceback (most recent call last):
  File "<input>", line 24, in <module>
  File "<input>", line 6, in dec_to_bin
TypeError: unsupported operand type(s) for +: 'int' and 'str'

En espérant trouver de l'aide, merci d'avance
Windows / Edge 107.0.1418.24

6 réponses

  1. Modérateur

    Bonjour,

    str(reste) ne convertit pas reste en chaine, l'instruction crée une chaine au moment de l’exécution dont tu ne fais rien.

    il faudrait au moins faire reste = str(reste), ou plus simplement binaire = str(reste) + binaire.

    Enfin, avant le return tu devrais afficher binaire pour voir ce que contient la chaine.


    1
    1. Contributeur

      Bonjour,

      Essayez :



      binaire = o en ligne 6

      car quand vous déclarez binaire = "" binaire est mémorisé en type string

      donc en ligne  6, vous additionnez un int et un string, d'où le message d'erreur.

      Si vous aviez voulu transformer le string "reste" initial en string, il aurait fallu entrer : reste = string(reste)

      La ligne doit donc être supprimée, à moins que vous vouliez concaténer le string "reste" et le string decimal (à convertir comme indiqué plus haut).

      Sous réserve d'invalidation ou amélioration par un "pythoniste".

      1
      1. J'ai fait ça maintenant mais j'ai toujours un message d'erreur et merci de l'aide

        def dec_to_bin(decimal):
            binaire=""
            quotient = decimal//2
            reste = decimal%2
            binaire = str(reste) + binaire
            while quotient!=0 :
                decimal = quotient
                reste = decimal%2
                binaire = str(reste) + binaire
                quotient = quotient//2

            

            while len(binaire)==4 :
                binaire = str(0)+ binaire
            
            print (binaire)
            return binaire


        assert dec_to_bin(10) == '1010'
        assert dec_to_bin(15) == '1111'
        assert dec_to_bin(0) == '0000'

        1
        1. Contributeur

          Je ne vois pas que vous ayez écrit binaire == 0
           

          Cela ne préjuge pas d'autres erreurs qui seront signalées par la suite mais celle-ci devait disparaître (j'ai bien entendu vérifié sur cette partie du code).
           

          Mais l'important n'est pas de recopier ma proposition mais de comprendre ce que signifie ce message d'erreur et ce que vous faîtes pour le corriger.

          Par ailleurs, il est plus que recommandé d''utiliser les balises de code (python) pour encadrer votre script (utiliser l'icone correspondante au dessus de la zone de saisie des réponses

          1
          1. Désole mais je ne comprends pas ce que vous dites. 

            Lorsque je lance mon programme il m'affiche cela : 

            Traceback (most recent call last):
              File "<input>", line 24, in <module>
            AssertionError

            Ce qui selon moi signifie qu'il y a une erreur quelque part mais je ne comprends pas ou.

            0
        2. Modérateur

          Là ton code fonctionne, c'est l'assert qui indique une erreur car ta fonction renvoie '01010' alors que tu attend '1010'

          Pourquoi rajouter 0 quand longueur = 4 ?

          Après ton code est imparfait car si la valeur décimale passée est supérieure à 15 et que tu attends un binaire sur 4 bits, la réponse ne sera par correcte. Il faudrait vérifier la valeur décimale reçue, ou ne pas limiter la chaine binaire à 4 positions.


          1
          1. Contributeur

            Bonjour jee pee,
             

            Ma proposition est-elle incorrecte et lilou doit-elle maintenir la ligne 6 initiale. Je ne voudrais pas la diriger vers de fausses solutions.
             

            edit:
             

            Désolé de la question superflue. Je ne sais pas pourquoi, malgré le fait que j'aie vérifié avant de poster, je n'avais pas la réponse #1, que j'ai doublonnée par rapport à la tienne. Encore heureux qu'elles correspondent.

            Par ailleurs, je n'ai pas la ligne 24 dans le post initial.
             

            Je te laisse la main pour ne pas embrouiller lilou.

            1
          2. Alors je ne sais pas vraiment c'est un travail à faire et c'est ma consigne, voici ce que j'avais initialement : 

            B - Compléter la fonction ????????????_????????_????????????dec_to_bin permettant de convertir un nombre décimal entier en nombre binaire.

            • on ne traite que les nombres entiers positifs
            • le nombre binaire sera déclaré par une chaîne de caractères
            • le nombre binaire sera toujours de longueur 4

            Rappel de la procédure (pseudo-algorithme) :

            • La fonction prend un entier ????????????????????????????decimal en paramètre : (????????????????????????????decimal est de type entier)
              • On déclare une variable ????????????????????????????binaire et on lui affecte la valeur """" (chaine de caractère vide)
              • On calcule ????????????????????????????????=???????????????????????????? // 2quotient=decimal // 2 (division entière aussi appelée division Euclidienne)
              • On calcule le reste : ????????????????????=???????????????????????????? % 2reste=decimal % 2
              • On concatene ????????????????????reste à gauche de ????????????????????????????binaire (Attention, ????????????????????reste doit être au format chaine de caractères !!)
              • Tant que ????????????????????????????????!=0quotient!=0 :
                • Le ????????????????????????????????quotient est chargé dans ????????????????????????????decimal
                • On calcule le nouveau reste : ????????????????????=???????????????????????????? % 2reste=decimal % 2
                • On concatene ????????????????????reste à gauche de ????????????????????????????binaire (Attention, ????????????????????reste doit être au format chaine de caractères !!)
                • On calcule le nouveau ????????????????????????????????=???????????????????????????????? // 2quotient=quotient // 2
              • Quand on a terminé, tant que binaire n'a pas une longueur de 4 :
                • On complete binaire à gauche avec des "0"
              • La fonction retourne ????????????????????????????binaire (qui doit être un binaire au format chaine de caractères)
            def dec_to_bin(decimal):
                binaire=""
                quotient = ...
                reste = ...
                binaire = ...
                while ... :
                    ... = quotient
                    reste = ...
                    binaire = ...
                    quotient = decimal//2
            
                
                # au final, tant que le binaire n'a pas une taille de 4
                while ... :
                    # on ajoute des "0" à gauche
                    binaire = ...
                    
                return binaire
            
            
            # Les lignes ci-dessous testent votre code... n'y touchez pas !
            # Si une AssertionError apparaît... c'est que votre code n'est pas bon...
            assert dec_to_bin(10) == '1010'
            assert dec_to_bin(15) == '1111'
            assert dec_to_bin(0) == '0000'
            0
          3. Modérateur
            @Lilou

            Dans ta dernière partie, il faut tester longueur < à 4

            1
          4. @jee pee

            Si j'ai plus aucun message c'est que le code est bon ? 

            Dans ce cas merci beaucoup

            0
          5. Modérateur
            @georges97

            bonjour, je n'ai pas bien compris ce que tu voulais faire/dire ;-)

            le code de lilou n'est pas optimum, long et beaucoup de variables, mais en fait, comme au final elle nous donné l'énoncé, c'est bien sur cette base qu'il faut rester. Elle doit débuter donc disons qu'obtenir le bon résultat est moins important que comprendre chaque ligne du code.

            1
        3. Bonjour à tous

          Tu n'étais pas loin,

          Tant que longueur de binaire est différent de 4 et non égal à 4 comme tu as écrit ici

          while len(binaire)==4

          Cdlmnt

          1