Décimal en binaire

Résolu
Lilou -  
 Lilou -

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. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973
     

    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
  2. georges97 Messages postés 14565 Date d'inscription   Statut Contributeur Dernière intervention   2 919
     

    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
  3. Lilou
     

    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
  4. georges97 Messages postés 14565 Date d'inscription   Statut Contributeur Dernière intervention   2 919
     

    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. Lilou
       

      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973
     

    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. georges97 Messages postés 14565 Date d'inscription   Statut Contributeur Dernière intervention   2 919
       

      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. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973 > Lilou
       

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

      1
    3. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973 > georges97 Messages postés 14565 Date d'inscription   Statut Contributeur Dernière intervention  
       

      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
    4. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973 > Lilou
       

      oui sans message le code est bon. A noter que tu ne respectes pas l'énoncé, tu as changé,

      quotient = decimal//2

       il faut le remettre, ce qui ne change rien

      1
    5. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973 > Lilou
       

      pour un autre exercice, il est préférable de créer une nouvelle question.

      et de nous donner l'énoncé et ta solution, cela peut nous permettre de mieux t'aider, et penses bien pour le code à utiliser l'icone sources et le langage python qui donne la coloration syntaxique.

      1
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     

    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