Binaire relatif en décimal entier relatif
Résolu/Fermé- Binaire relatif en décimal entier relatif
- Binaire - Guide
- Convertir heure en décimal excel - Forum Excel
- Alphabet binaire ✓ - Forum Programmation
- Question binaire - Forum Bases de données
- Casio fx-92 affichage décimal ✓ - Forum calculatrices
12 réponses
Modifié le 31 oct. 2022 à 13:08
Rebonjour,
Pour moi, i est un indice. Un indice on va l'initialiser au départ à 0, on va l’incrémenter par pas de 1 i=i+1, on va faire une boucle sur la longueur de la chaine len(binaire) et on va utiliser la donnée de la chaine pointée par l'indice binaire[i]
Le programme fait appel à la fonction bin_to_dec(), tu l'as déjà écrite ? c'est une étape préalable à l'écriture de la fonction bin_to_dec_relatif().
Modifié le 31 oct. 2022 à 13:33
bin_to_dec() traitait les binaires positifs, bin_to_dec_relatif() traite les binaires positifs ou négatifs, si il détecte un positif il appelle la 1ère fonction
Concernant i, c'est un indice que l'on va utiliser pour se déplacer dans la chaine binaire. On va lui donner les valeurs 0,1,2 ... jusqu'à la longueur de la chaine, toi tu l'initialises par le contenu de la cahiane i = binaire[0], ce n'est pas correct, i démarre à zéro. i = 0
31 oct. 2022 à 13:44
tant que i est inférieur à la longueur de la chaine binaire
et tant que la position binaire[i] == "1"
ce qui me donne ça ?
while i<len(binaire) and binaire[i]==1 :
et pour la suite je suis censée faire comment ? désolé de demander mais je suis vraiment perdue
Modifié le 31 oct. 2022 à 14:30
oui c'est ça, à une toute petite limite ;-)
après c'est la ligne la plus difficile on comprendre, et plus que la programmation elle même, c'est la mécanique du décodage d'un binaire négatif telle que proposée par le programme cadre
on va chercher dans la chaine en démarrant par la gauche, le 1 le qui précède un zéro. Alors on calcule la puissance de 2 de la position du dernier 1 et on le passe en négatif
et dans un second temps, on va reprendre ce qui reste de la chaine, à partir du zéro le plus à gauche, convertir cette partie de la chaine en un nombre positif et additionner le résultat au nombre négatif calculé plus haut.
Modifié le 31 oct. 2022 à 14:32
d'accord merci beaucoup malheureusement je n'ai plus le temps de travailler dessus aujourd'hui mais je regarde cela demain, je ne sais pas si je pourrais avoir votre aide demain ?
Es-tu obligé d'avoir deux fonctions?
Je traiterais d'abord le premier digit qui me permettra d'avoir un "flag" pour pouvoir inverser.
On boucle ensuite à partir de l'indice 1
decimal = decimal * 2 + int(binaire[i])
À la fin:
if inverse == "1":
decimal = -decimal
31 oct. 2022 à 14:11
là le cadre est figé, tu as un cadre de code à compléter, on ne propose pas une autre façon de faire
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJ'ai fait l'exercice et j'ai trouvé ça plus compliqué que ma méthode ...
Un indice: compter les bits en partant de la droite plutôt que la gauche pour l'exposant.
Pour le slicing, on va jusqu'à la fin.
1 nov. 2022 à 09:54
Je t'accorde que la méthode m'a semblé bizarre. Mais relis la question, Lilou doit respecter le cadre et compléter le code de l'exercice, remplacer les (...). Pas utiliser une solution alternative.
En essayant de suivre votre consigne j'arrive à ce résultat :
def bin_to_dec_relatif(binaire): # on initialise relatif relatif=0 # si le 1er bit à gauche est un "0" alors c'est un positif et on utilise la fonction bin_to_dec() définie plus haut. if binaire[0]=="0": relatif = bin_to_dec(binaire) # sinon c'est un négatif else: # on pointe notre index sur le 1er bit à gauche (indice 0) i = 0 # tant que notre index pointe sur le binaire ET qu'il pointe un 1 while i<len(binaire) and binaire[i]==1 : # relatif est alors égal (en négatif) au poids de ce 1 à sa position en partant de la droite !!! relatif = -(2**(i)) # on bouge l'index d'un cran à droite i = 1 # on a trouvé le dernier 1, on est donc sorti de la boucle "tant que" # si à ce moment là, notre index n'est pas arrivé à la fin du binaire if i<len(binaire): # on doit ajouter en positif les poids des 1 qui se trouvent à droite du dernier 1 # on utilise la fonction bin_to_dec() définie plus haut sur cette partie du binaire relatif = relatif + bin_to_dec(binaire[i:len(binaire)]) return relatif # 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 bin_to_dec_relatif('1010') == -6 assert bin_to_dec_relatif('1111') == -1 assert bin_to_dec_relatif('0000') == 0 assert bin_to_dec_relatif('0011') == 3
J'ai le message d'erreur donc je me suis trompée mais j'ai déjà une idée d'une erreur c'est quand on me demande de compter à partir de la droite, je n'ai aucune idée de comment faire. Si vous voyez d'autres erreurs, n'hésitez pas à me dire.
Merci beaucoup
Modifié le 1 nov. 2022 à 13:20
Je vois 3 soucis,
- ligne 15, je t'avais signalé plus haut que ce n'était pas parfait
- ligne 20, tu vas toujours traiter la position 1 ! un indice on l'incrémente, pour traiter la position suivante.
- ligne 17, on veut récupérer la puissance de 2 par rapport à la valeur de i combiné à sa position en partant de la droite. Quand i vaut 0, on veut 3, pour 2**3 => 8, ....., quand i vaut 3, on veut 0, pour 2**0 => 1. il faut donc combiner la longueur de la chaine binaire et la valeur de i
1 nov. 2022 à 13:33
Pour la ligne 15, je ne vois pas du tout ce qui n'est pas juste.
Pour la ligne 20, je n'ai jamais vu l'incrémentation mais en regardant sur internet j'ai trouvé ceci :
i =+ 1
Pour la ligne 17, j'ai tenté de faire cela :
relatif = -(2**(i*len(binaire)))
Modifié le 1 nov. 2022 à 14:26
- ligne 15 : 1, n'est dans le cas présent pas un nombre mais une chaine de caractère
- ligne 20, l'incrémentation c'est i = i +1 il existe une syntaxe abrégée i += 1
- ligne 17, il te faut continuer à chercher, affiche la valeur que tu trouves pour l'exposant, et regarde les exemples que j'ai donné plus haut
Modifié le 1 nov. 2022 à 14:40
merci beaucoup mais je n'arrive pas à comprendre ce que vous dites en parlant de quand i vaut 0, on veut 3 je ne vois comment on arrive à trouver ceci, le seul truc que je pense comprendre c'est que en fonction de la position du chiffre on viendra le multiplier par 2 puissance et la position en partant de la gauche mais sinon je ne comprends pas le reste.
J'ai changé la ligne 17 et maintenant j'ai ce message d'erreur qui s'affiche :
def bin_to_dec_relatif(binaire): # on initialise relatif relatif=0 # si le 1er bit à gauche est un "0" alors c'est un positif et on utilise la fonction bin_to_dec() définie plus haut. if binaire[0]=="0": relatif = bin_to_dec(binaire) # sinon c'est un négatif else: # on pointe notre index sur le 1er bit à gauche (indice 0) i = 0 # tant que notre index pointe sur le binaire ET qu'il pointe un 1 while i<len(binaire) and binaire[i]=="1" : # relatif est alors égal (en négatif) au poids de ce 1 à sa position en partant de la droite !!! relatif = -(2**(i*(len(binaire)-1)) # on bouge l'index d'un cran à droite i = i+1 # on a trouvé le dernier 1, on est donc sorti de la boucle "tant que" # si à ce moment là, notre index n'est pas arrivé à la fin du binaire if i<len(binaire): # on doit ajouter en positif les poids des 1 qui se trouvent à droite du dernier 1 # on utilise la fonction bin_to_dec() définie plus haut sur cette partie du binaire relatif = relatif + bin_to_dec(binaire[i:len(binaire)]) return relatif # 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 bin_to_dec_relatif('1010') == -6 assert bin_to_dec_relatif('1111') == -1 assert bin_to_dec_relatif('0000') == 0 assert bin_to_dec_relatif('0011') == 3
File "<input>", line 20 i = i+1 ^ SyntaxError: invalid syntax
En y regardant de plus près, sa méthode est la même que la mienne. Il fait le complément à 2 et l'inversion dans la même étape. Mais c'est un peu tordu.
Ligne 15, on parle de caractères et non de nombres ...
On fait comment pour incrémenter?
Ce qui me donne cela pour la ligne 15 et 20 ?
def bin_to_dec_relatif(binaire): # on initialise relatif relatif=0 # si le 1er bit à gauche est un "0" alors c'est un positif et on utilise la fonction bin_to_dec() définie plus haut. if binaire[0]=="0": relatif = bin_to_dec(binaire) # sinon c'est un négatif else: # on pointe notre index sur le 1er bit à gauche (indice 0) i = 0 # tant que notre index pointe sur le binaire ET qu'il pointe un 1 while i<len(binaire) and binaire[i]=="1" : # relatif est alors égal (en négatif) au poids de ce 1 à sa position en partant de la droite !!! relatif = -(2**(i*len(binaire))) # on bouge l'index d'un cran à droite i += 1 # on a trouvé le dernier 1, on est donc sorti de la boucle "tant que" # si à ce moment là, notre index n'est pas arrivé à la fin du binaire if i<len(binaire): # on doit ajouter en positif les poids des 1 qui se trouvent à droite du dernier 1 # on utilise la fonction bin_to_dec() définie plus haut sur cette partie du binaire relatif = relatif + bin_to_dec(binaire[i:len(binaire)]) return relatif # 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 bin_to_dec_relatif('1010') == -6 assert bin_to_dec_relatif('1111') == -1 assert bin_to_dec_relatif('0000') == 0 assert bin_to_dec_relatif('0011') == 3
Pour la ligne 17 je ne comprends toujours pas ce qu'il faut faire.
1 nov. 2022 à 14:51
15 et 20 ce devrait être correct
tu as 2 valeurs i qui varie de 0 à 3 et len(binaire) qui vaut 4
quand i=0 il faut une formule avec len(binaire) pour trouver 3
quand i=1 cela doit donner 2
quand i=2 cela doit donner 1
quand i=3 cela doit donner 0
1 nov. 2022 à 15:10
j'avais pensé à len(binaire)(i-+1)
mais ce ne fonctionne pas après essai
i=0 --> 4-0+1=3
i=1 --> 4-1+1=4
i=2 --> 4-2+1=3
i=3 --> 4-3+1=0
en faisant avec len(binaire)(-i-1)
i=0 --> 4-0-1=3
i=1 --> 4-1-1=2
i=2 --> 4-2-1=1
i=3 --> 4-3-1=0
mais quand je mets ceci dans mon programme j'ai une erreur
def bin_to_dec_relatif(binaire): # on initialise relatif relatif=0 # si le 1er bit à gauche est un "0" alors c'est un positif et on utilise la fonction bin_to_dec() définie plus haut. if binaire[0]=="0": relatif = bin_to_dec(binaire) # sinon c'est un négatif else: # on pointe notre index sur le 1er bit à gauche (indice 0) i = 0 # tant que notre index pointe sur le binaire ET qu'il pointe un 1 while i<len(binaire) and binaire[i]=="1" : # relatif est alors égal (en négatif) au poids de ce 1 à sa position en partant de la droite !!! relatif = -(2**(i*(len(binaire)(-i-1)))) # on bouge l'index d'un cran à droite i += 1 # on a trouvé le dernier 1, on est donc sorti de la boucle "tant que" # si à ce moment là, notre index n'est pas arrivé à la fin du binaire if i<len(binaire): # on doit ajouter en positif les poids des 1 qui se trouvent à droite du dernier 1 # on utilise la fonction bin_to_dec() définie plus haut sur cette partie du binaire relatif = relatif + bin_to_dec(binaire[i:len(binaire)]) return relatif # 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 bin_to_dec_relatif('1010') == -6 assert bin_to_dec_relatif('1111') == -1 assert bin_to_dec_relatif('0000') == 0 assert bin_to_dec_relatif('0011') == 3
Traceback (most recent call last): File "<input>", line 36, in <module> File "<input>", line 17, in bin_to_dec_relatif TypeError: 'int' object is not callable
1 nov. 2022 à 15:15
len(binaire)(-i-1) est une syntaxe incorrecte, c'est tout simplement len(binaire)-i-1
1 nov. 2022 à 15:17
j'ai changé cela mais j'ai encore le message d'erreur, il reste encore quelque chose de faux dans mon programme ?
def bin_to_dec_relatif(binaire): # on initialise relatif relatif=0 # si le 1er bit à gauche est un "0" alors c'est un positif et on utilise la fonction bin_to_dec() définie plus haut. if binaire[0]=="0": relatif = bin_to_dec(binaire) # sinon c'est un négatif else: # on pointe notre index sur le 1er bit à gauche (indice 0) i = 0 # tant que notre index pointe sur le binaire ET qu'il pointe un 1 while i<len(binaire) and binaire[i]=="1" : # relatif est alors égal (en négatif) au poids de ce 1 à sa position en partant de la droite !!! relatif = -(2**(i*(len(binaire)-i-1))) # on bouge l'index d'un cran à droite i += 1 # on a trouvé le dernier 1, on est donc sorti de la boucle "tant que" # si à ce moment là, notre index n'est pas arrivé à la fin du binaire if i<len(binaire): # on doit ajouter en positif les poids des 1 qui se trouvent à droite du dernier 1 # on utilise la fonction bin_to_dec() définie plus haut sur cette partie du binaire relatif = relatif + bin_to_dec(binaire[i:len(binaire)]) return relatif # 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 bin_to_dec_relatif('1010') == -6 assert bin_to_dec_relatif('1111') == -1 assert bin_to_dec_relatif('0000') == 0 assert bin_to_dec_relatif('0011') == 3
j'ai encore un autre exercice à faire où comme celui-là je bloque mais avez-vous encore la patience de m'aider ?
Modifié le 1 nov. 2022 à 15:57
Il y a de grandes chances que tu ne serais pas arrivée au bout de l'exercice seule.
Il te faut travailler les indices, tu n'as manifestement pas la bonne vision de comment cela fonctionne, et de ce qui se passe. Coder quelque chose, ce n'est pas d'abord écrire le code, c'est avant être capable d'exposer ce qu'il va faire. Là il fallait définir comment effectuer l'opération de décodage binaire vers décimal à la main, après seulement on écrit le code. Je suis toujours surpris dans les sources transmis dans les demandes, de ne jamais voir d'affichage de valeurs en cours de route, de debug. Quand j'ai un soucis sur un code, je vais afficher les valeurs des différentes variables et calculs, parfois après chaque ligne de code importante.
Nous pouvons continuer à t'aider, en te donnant des indications, mais il serait bien que tu écrives la plus grande partie du code.
1 nov. 2022 à 16:00
D'accord merci beaucoup, je prendrai le temps aujourd'hui tranquillement de retravailler mon 3ème programme et je vous recontacte demain en ayant fait mon maximum, si cela vous convient.
Et pour l'histoire d'affichage des valeurs je n'ai pas vraiment l'habitude de travailler sur des fonctions ni sur le site où je dois faire ma programmation, j'ai essayé auparavant de repasser mon code sur Spyder (logiciel que j'utilise en temps normal en cours) mais je n'arrivai plus à afficher les valeurs.
31 oct. 2022 à 13:15
Alors j'ai écrit cette fonction dans un exercice auparavant
Et pour l'histoire du i je ne comprends le rapport avec le programme désolé
de ce que j'arrive à comprendre c'est qu'au départ on teste si notre premier bit est égal à 0 on le revoit à l'autre fonction mais que si c'est égal à 1 on vient faire cette fonction mais dans l'exécution de la fonction je suis un peu perdue car je vois comment faire ce changement à la main (binaire vers décimal) mais dans le programme je vois plus du tout.