Decimal relatif vers binaire

Résolu/Fermé
Lilou - 2 nov. 2022 à 17:33
 PierrotLeFou - 4 nov. 2022 à 01:25

Bonjour,

j'ai donc essayé de compléter mon 3ème programme.

Voici la consigne : 

Compléter la fonction dec_to_bin_relatif permettant de convertir un nombre décimal entier relatif en nombre binaire relatif.

  • On se limitera aux entiers relatifs codés sur 4 bits !
  • il est fortement conseillé d'utliser la méthode du complément à 2 donnée dans le cours.
  • vous pouvez appeler (utiliser) les fonctions que vous avez codées au-dessus.
  • la valeur absolue d'un nombre (nombre sans le signe) s'obtient par la méthode abs() : par exemple abs(-6) renvoie 6
  • le nombre au format binaire sera déclaré par une chaîne de caractères

Voici le programme à compléter : 

def dec_to_bin_relatif(relatif):
    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if ... :
        ...
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire=...
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse=...
            else:
                inverse=...
        
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(...): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire=...
                retenue=...     
            elif inverse[j]=="1" and retenue=="1":
                binaire=...
                retenue=...  
            else:
                binaire=...
                retenue=...

    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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'

Et voici ce que j'ai pu faire :  

def dec_to_bin_relatif(relatif):
    
    relatif=-10
    
    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if relatif > 0 :
        binaire = dec_to_bin(relatif)
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire = dec_to_bin(abs(relatif))
        
        print(binaire)
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= i + inverse
            else:
                inverse= "1" + i + inverse
        
        print(binaire)
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire=binaire+"1"
                retenue="0"     
            elif inverse[j]=="1" and retenue=="1":
                binaire=binaire+"0"
                retenue="1" 
            else:
                binaire=binaire+"1"
                retenue="0"

    print(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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'

Je sais que j'ai un problème au niveau de la ligne 20 et 22, quand je veux inverser mon binaire, je ne comprends pourquoi on vient mettre notre valeur dans la variable inverse et comment cela va faire évoluer notre variable binaire, pour l'inversion que j'ai pu faire je me suis aidée d'une aide qu'on avait au-dessus de l'exercice disant : 

Inversion d'une chaine de caractère "abcdef" "fedcba" :

  • Parcours de gauche à droite : 
txt="abcdef"
inverse=""
for i in txt :
    inverse = i + inverse
txt
>> "fedcba"
  • Parcours de droite à gauche :
txt="abcdef"
inverse=""
for i in range(len(txt)-1,-1,-1) :
    inverse = inverse + txt[i]
txt
>> "fedcba"

Je sais aussi qu'il y a un ou des problèmes au niveau de mon complément à deux de la ligne 29 à 38, je ne comprends pas vraiment la notation inverse [j], je l'ai comprise dans le sens de si dans inverse j'ai un 0 alors je lui rajoute la retenue, sinon si dans inverse j'ai un 1 et ma retenue est de 1 alors le binaire donne 0 (1+1) et la retenue donne 1 et sinon le binaire donne 1 et la retenue 0 mais je ne suis vraiment pas sur de cela. Et aussi je ne comprends pas pourquoi lorsque je veux afficher la valeur de mon binaire après le complément à deux, je n'y arrive pas.

Merci beaucoup de votre aide

Windows / Edge 107.0.1418.26

4 réponses

jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024 9 322
Modifié le 2 nov. 2022 à 18:00

Bonjour,

Comme la fois précédente, tu devrais essayer de convertir le décimal relatif en binaire relatif à la main, avant d'écrire le code.  Voir ce message où je faisais un exemple hier : https://forums.commentcamarche.net/forum/affich-37721776-nombre-binaire#7 Par ailleurs, tu es partie sur une mauvaise piste pour l'inversion des bits, on ne change pas leur position comme dans l'inversion des caractères d'une chaine, on change juste la valeur de chaque bit 1==>0, 0==>1, 1010 ==> 0101 ; 0100 ==> >1011

J'ai vu que tu as mis des print ;-) plutôt de dans la fonction mettre relatif=-10 tu devrais, pour les tests, avant les assert (moi je les mets en commentaire), mettre un print(dec_to_bin_relatif(-10))


0

J'ai bien commencé à convertir mon décimal à la main mais je n'ai pas dû réussir à le retranscrire au niveau du code.

Pour ce qui est de l'inversion j'aurai mis cela du coup:

# ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= "1"
            else:
                inverse= "0"

je l'aurais vu comme si c'est un 0 on mets un 1 sinon on met un 0 mais je vois que ça ne marche pas.

Pour ce qui est du print(dec_to_bin_relatif(-10)) j'ai essayé de le mettre mais il ne marche pas, je n'ai sûrement pas dû faire de la bonne manière.

def dec_to_bin_relatif(relatif):

    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if relatif > 0 :
        binaire = dec_to_bin(relatif)
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire = dec_to_bin(abs(relatif))
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= "1"
            else:
                inverse= "0" 
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire=binaire+"1"
                retenue="0"     
            elif inverse[j]=="1" and retenue=="1":
                binaire=binaire+"0"
                retenue="1" 
            else:
                binaire=binaire+"1"
                retenue="0"
                
    return binaire

print(dec_to_bin_relatif(-10))

# 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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'
0
jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024 9 322
Modifié le 2 nov. 2022 à 18:57

Attention, sur 4 bits, on ne peut pas coder -10, sur 4 bits on va de -8 à +7, donc tester -6

Pour l'inverse, il ne faut pas oublier de cumuler : inverse=inverse+"1"

print(dec_to_bin_relatif(-6)) fonctionne pour moi, c'est peut être ton environnement ? essaye
 

result=dec_to_bin_relatif(-6)
print(result)

0

J'ai copié ce que vous avez écrit à la fin de mon programme et la seule donnée que j'ai à la fin c'est l'erreur.

def dec_to_bin_relatif(relatif):

    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if relatif > 0 :
        binaire = dec_to_bin(relatif)
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire = dec_to_bin(abs(relatif))
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= "1"
            else:
                inverse= "0" 
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire=binaire+"1"
                retenue="0"     
            elif inverse[j]=="1" and retenue=="1":
                binaire=binaire+"0"
                retenue="1" 
            else:
                binaire=binaire+"1"
                retenue="0"
                
    return binaire

result=dec_to_bin_relatif(-6)
print(result)

# 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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
Traceback (most recent call last):
  File "<input>", line 41, in <module>
AssertionError
0
jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024 9 322 > Lilou
Modifié le 2 nov. 2022 à 19:07

je pense que c'est ton environnement de développement, mets les assert en commentaire, ou

met un print de binaire avant le return

tu devrais aussi faire un print de j dans ta boucle, tu verras un soucis

0
Lilou > jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024
2 nov. 2022 à 19:25

d'accord merci beaucoup je regarde ceci dans les jours à venir.

0
Lilou > jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024
3 nov. 2022 à 18:40

Bonjour, 

J'ai pu retravailler mon programme et voici ce que ça donne. Il reste toujours faux mais je ne comprends pas pourquoi mon binaire n'évolue pas et je ne suis pas sûr de ce que j'ai pu faire pour l'inverse.

Merci 

def dec_to_bin_relatif(relatif):
    
    binaire=-6
    
    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if relatif > 0 :
        binaire = dec_to_bin(relatif)
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire = dec_to_bin(abs(relatif))
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= "1" + inverse  
            else:
                inverse= "0" + inverse 
        print("inverse :",inverse)        
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(len(binaire),-1,-1): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire= retenue + binaire   
                retenue="0"     
            elif inverse[j]=="1" and retenue=="1":
                binaire="0"+ binaire
                retenue="1" 
            else:
                binaire="1"+ binaire
                retenue="0"
        print("binaire :",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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'
inverse : 1001
binaire : 0
Traceback (most recent call last):
  File "<input>", line 42, in <module>
AssertionError
0
jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024 9 322 > Lilou
Modifié le 3 nov. 2022 à 19:19

déjà ta ligne 3 n'a pas de sens ;-) peut être relatif ?

en 26, binaire initialisé 2 lignes au dessus vaut "", donc il ne se passe rien

en 15 et 17 la concaténation n'est pas dans le bon sens

0

Malheureusement il doit y avoir encore une autre faute quelque part car mon binaire pour -6 est bien 1010 mais j'ai quand même une erreur.

def dec_to_bin_relatif(relatif):
    
    relatif=-6
    
    # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
    if relatif > 0 :
        binaire = dec_to_bin(relatif)
        
    # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
    else:
        # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
        binaire = dec_to_bin(abs(relatif))
        
        # ecriture du complément à UN (on inverse les bits)
        inverse=""
        for i in binaire :
            if i == "0" :
                inverse= inverse + "1"   
            else:
                inverse= inverse + "0"  
        print("inverse :",inverse)        
        
        # écriture du complémént à DEUX (on fait +1)
        binaire=""
        retenue="1" # c'est notre +1
        for j in range(len(inverse)-1,-1,-1): # attention, parcours de droite à gauche !!!
            if inverse[j]=="0":
                binaire= retenue + binaire   
                retenue="0"     
            elif inverse[j]=="1" and retenue=="1":
                binaire="0"+ binaire
                retenue="1" 
            else:
                binaire="1"+ binaire
                retenue="0"
        print("binaire :",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_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'
inverse : 1001
binaire : 1010
inverse : 1001
binaire : 1010
Traceback (most recent call last):
  File "<input>", line 42, in <module>
AssertionError
0
jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024 9 322
Modifié le 3 nov. 2022 à 20:53

Bien sur puisque tu as -6 en dur dans la fonction

alors l'assert sur -1 échoue

0
Lilou > jee pee Messages postés 40183 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 12 septembre 2024
3 nov. 2022 à 21:07

ah oui c'est vrai merci beaucoup de l'aide

0

6 = 110 qui devrait être 0110 pour être positif.

Tu devras donc ajouter "0" à la gauche de la chaîne.
Son complément à 1 est donc 1001 qui est bien négatif.

Si on fait la somme à partir des bits les moins significatifs: 1001 + 1 = 1010

0