Décimal en binaire

Résolu/Fermé
Lilou - Modifié le 31 oct. 2022 à 09:48
 Lilou - 31 oct. 2022 à 12:38

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

A voir également:

6 réponses

jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348
Modifié le 31 oct. 2022 à 10:11

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
georges97 Messages postés 12265 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 26 septembre 2024 2 354
Modifié le 31 oct. 2022 à 10:17

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

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
georges97 Messages postés 12265 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 26 septembre 2024 2 354
Modifié le 31 oct. 2022 à 11:27

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

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348
Modifié le 31 oct. 2022 à 11:28

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
georges97 Messages postés 12265 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 26 septembre 2024 2 354
Modifié le 31 oct. 2022 à 11:37

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
jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348 > Lilou
31 oct. 2022 à 11:40

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

1
jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348 > georges97 Messages postés 12265 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 26 septembre 2024
31 oct. 2022 à 11:44

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
jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348 > Lilou
31 oct. 2022 à 11:52

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
jee pee Messages postés 40277 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 septembre 2024 9 348 > Lilou
31 oct. 2022 à 11:57

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
ccm81 Messages postés 10891 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 26 septembre 2024 2 421
31 oct. 2022 à 12:04

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