Decimal relatif vers binaire
RésoluPierrotLeFou -
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
- Decimal relatif vers binaire
- Binaire - Guide
- Windows 7 vers windows 10 - Accueil - Mise à jour
- Clavier qwerty vers azerty - Guide
- Vers quelle adresse web renvoie ce lien - Guide
- Envoyer vers - Guide
4 réponses
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))
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)
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
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
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
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:
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.