Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice conversion entier vers binaire

Par soustractions successives

Sujet résolu
1 novembre 2014 à 19:48:18

Salut! Je suis débutante sur Python et je sèche complètement sur un exercice que j'ai à faire sur python qui consiste à créer un programme qui permette de convertir un nombre entier positif de décimal en binaire, en donnant les calculs intermédiaires de la méthode des soustractions successives. Je ne sais pas si j'ai été claire en résumant l'exercice, mais voici l'énoncé :

Enoncé:

On se propose d'écrire un programme en Python permettant de donner les calculs intermédiaires (méthodes des soustractions) pour convertir un nombre entier positif de décimal en binaire.
Il est possible d'utiliser le module
math mais en aucun cas, on ne pourra utiliser des fonctions comme bin().
1) Réaliser un programme qui permet à l'utilisateur d'entrer un nombre entier positif ou nul. Ce nombre sera alors étape par étape (
c’est-à-dire à chaque tour de boucle) converti en binaire et pour chaque étape, les soustractions effectuées seront indiquées.

Enfin, on affiche le résultat final.
Pour le confort de l'utilisateur, au cas où le nombre à traiter serait très grand, on indiquera par une phrase que l'on est arrivé à la fin du traitement (voir exemples ci-dessous).

Contraintes:
On veillera à obtenir un résultat le plus proche possible des exemples montrés.
On n'utilisera aucune fonction de conversions de Python, comme bin(), hex()...
Dans cette question, on n'utilisera aucun tableau (liste ou autres...) pour stocker les résultats.

Exemple:
Entrez un nombre entier: 125
125 -2** 6 = 61
61 -2** 5 = 29
29 -2** 4 = 13
13 -2** 3 = 5
5 -2** 2 = 1
1 -2** 0 = 0
fin du traitement
la valeur 125 vaut en binaire : 1111101

J'ai commencé en faisant ça, mais je ne vois pas comment afficher les soustractions
a=int(input("Entrez un nombre entier: "))
x=15
while a>0:
    while 2**x>a:
        x=x-1
    a=a-2**x
    print(a)

Et indépendamment, j'ai une très légère idée de comment afficher le nombre en binaire, mais je ne sais pas comment l'intégrer à la première partie :

while a>0:
    while 2**x>a:
        x=x-1  
        if 2**x>a:
            print("0",end="")
        else:
            print("1",end="")




Merci d'avance pour la réponse! 

-
Edité par BD5 2 novembre 2014 à 11:29:42

  • Partager sur Facebook
  • Partager sur Twitter
2 novembre 2014 à 22:36:53

Dans ton premier code, tu commences avec un chiffre arbitraire de 15 pour x. Mais on pourrait donner un chiffre plus grand que 2^15.

Alors la méthode est de trouver la plus grande puissance de 2 qui reste plus petite ou égale au chiffre à convertir. Ça te donnera ton x. Ensuite tu fais une boucle dans laquelle tu vérifies si 2^bit est plus petit ou égal à ce qui reste de ton nombre. Si c'est le cas, ce bit vaut 1, sinon c'est 0. Et on diminue la position du bit jusqu'à arriver au bit 0.

Pour imprimer les soustractions, tu peux utiliser la méthode format.

print('{0} -2** {1} = {2}'.format(125, 6, 61))
Bien entendu tu peux mettre des variables au lieu des chiffres comme dans mon exemple.

Pour l'affichage en binaire, c'est une bonne méthode que tu as trouvée, mais qui ne pourra pas s'appliquer à ce cas. On doit retenir le chiffre binaire pour l'afficher en sortie de la boucle. Moi je me suis dit que tu pourrais peut-être afficher le nombre binaire comme un simple chiffre. Pour afficher 1101, il te suffit de construire mille cent et un. En base de 10, pour faire glisser les chiffres vers la gauche il suffit de multiplier par 10. Et pour ajouter un '1', ben il faut faire + 1. :) Tu pourrais ainsi retenir dans une variable ton chiffre binaire en le multipliant par 10 à chaque tour de boucle et en ajoutant 1 quand nécessaire.

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 novembre 2014 à 22:40:07

Le code est vraiment degeulasse mais ca marche

#!/usr/bin/env python

number = int(input())
binary = list()

while (number > 0):
	bit = number % 2
	number = number / 2
	binary.append(bit)

binary.reverse()
print binary



  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
3 novembre 2014 à 10:51:33

@Bl4ckb0ne,

Tu ne respectes pas les consignes indiquées par le PO,

  • Tu n'utilises pas la méthode par soustraction, regarde son algorithme (exemple)
  • Tu utilises les tableaux (interdit dans son exercice)

Une grande croix dans la case tout faux...

  • Partager sur Facebook
  • Partager sur Twitter
3 novembre 2014 à 22:22:50

@oldProgrammer et @Bl4ckb0ne (même si ce n'était pas la consigne), merci beaucoup pour la réponse! Mais étant en manque de temps (je devais rendre cet exercice dimanche soir), j'ai finalement eu la réponse je pense, la voici :

a=int(input("Entrez un nombre entier: "))
b=""
s=a
x=0
while s-2**(x+1)>=0:
    x=x+1
while x>=0:
    if s-2**x>=0:
        s=s-2**x
        print(s+2**x,"-2**",x,"=",s)
        b=b+"1"
    else:
        b=b+"0"
    x=x-1
print("fin du traitement")
print("la valeur",a,"vaut en binaire:",b)

Bon, j'étais assez loin, j'espère qu'au prochain exercice je ferai mieux...

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2014 à 9:19:10

Pour ma part, si c'est la solution du professeur, je dirais qu'il n'a pas suivi ses consignes. ;)

Dans cette question, on n'utilisera aucun tableau (liste ou autres...) pour stocker les résultats.

Une chaîne de caractère est une forme de tableau. C'est une liste de lettres. Hors dans la solution proposée, il utilise b qui est une chaîne de caractère.

Sinon je trouve le code relativement illisible. Pourquoi utiliser des variables avec des noms aussi peu parlant? Voici la solution que j'aurais proposée.

number = int(input("Entrez un number entier: "))

bit = 0

while 2**(bit + 1) <= number:
    bit += 1

binary = 0
remainder = number

while bit >= 0:
    binary *= 10
    if 2**bit <= remainder:
        print('{0} -2** {1} = {2}'.format(remainder, bit, remainder - 2**bit))
        binary += 1
        remainder -= 2**bit
        
    bit -= 1
    
print('Fin du traitement')
print('la valeur {0} vaut en binaire : {1}'.format(number, binary))
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 novembre 2014 à 11:27:26

Une chaîne de caractère est une forme de tableau.

Je ne suis pas d'accord avec cette affirmation, car dans le cas d'un tableau tu pourrais modifier chaque élément de celui-ci. Ce n'est pas le cas en python concernant une chaîne de caractères, mais le cas en C, sauf si évidemment on déclarerait ce tableau comme une constante.

Bon on peut en discuter longtemps, mais je pense que tous les élèves avaient bien compris que quand le professeur parle de tableau, il veut dire listes car c'est sans doute un des seuls objets qu'ils ont appris en cours.

J'ai quasiment la même solution de mon côté que le PO ou son professeur dirons-nous.

value = int(input("Entrer une valeur positive: "))
if value < 0: # value ne doit pas être une valeur négative
    exit(-1)
 
# valeur de la puissance maximale pour utiliser la méthode soustraction
x = 0
while 2**x < value:
    x += 1
 
maxi = x # valeur de la puissance maximale
s = '' # résultat se fera sous forme de chaîne de caractères
 
while maxi != -1: # On soustrait et on vérifie que value vaut 0, sinon on continue
    v = 2**maxi # valeur à soustraire
     
    if v > value: # Dans ce cas on ne soustrait rien, v=0, bit=0
        v = 0
        s += '0'
     
    else:
        s += '1' # Sinon bit=1
    
    value -= v # soustraction, v vaut 0 dans le 1er cas, sinon 2**maxi dans l'autre
    maxi -= 1 # on soustrait la puissance
 
print(s)

Bon la différence, c'est que pour des noms de variables courts, j'ai mis des commentaires.

-
Edité par Anonyme 4 novembre 2014 à 19:47:28

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2014 à 13:07:47

T'as raison OldProgrammer. C'est juste un itérable. Il faut dire que tableau n'est pas à ma connaissance défini dans Python. Pour ma part, j'avais sincèrement cru que les chaînes de caractère n'étaient pas autorisées. Content de constater qu'en fait ça l'était. Ca rend la chose un peu moins artificiel.

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
4 novembre 2014 à 14:34:25

Il faut dire que tableau n'est pas à ma connaissance défini dans Python.

Ça ne l'est pas, en fait j'ai compris tableau comme l'objet liste, car évidemment le professeur essaye sans doute d'éliminer les solutions un peu trop évidente pour que ça reste un exercice plus en terme d'algorithmique que de syntaxe du langage.

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2014 à 16:27:20

N'étant pas trop à l'aise avec le binaire, je me suis amusé à le faire, voici ma solution:

a, c = 125, 125
b = ""

while c:
    b = "{}".format(c%2) + b
    c = c//2

print("fin du traitement")
print("{} vaut en binaire: {}".format(a, b))
  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
Anonyme
4 novembre 2014 à 18:04:13

Oui il y a plein de méthodes pour faire ce genre de chose, seulement ta méthode n'utilise pas la méthode par soustraction, mais par divisions euclidiennes.

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2014 à 18:43:51

Ok. Je connaissais pas. Comme je comprenais pas sa technique, je suis allé sur le net pour comprendre, et c'est celle-ci que j'ai trouvée.

Par contre ton code ne donne pas le résultat escompté pour 10 et 20 par exemple.

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
Anonyme
4 novembre 2014 à 19:46:56

Merci je modifie ça...

  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2014 à 22:42:56

La réponse n'est pas celle du professeur, l'exercice étant noté, j'ai demandé à quelqu'un de ma classe. 

Je tiens à préciser que quand je dis débutante, c'est que ça ne fait même pas un mois que j'ai "découvert" Python, donc en ce qui concerne la lisibilité, c'était un peu le moindre de mes soucis... Je ferai gaffe la prochaine fois :)

Et merci @Dan737, je n'avais pas vu ta réponse la dernière fois

  • Partager sur Facebook
  • Partager sur Twitter
8 février 2024 à 12:57:55

bonjour Jai cet exo a résoudre et je n'arrive pas a le faire en python vu que je suis débutante

Ecrire la fonction  bin2dec(chaine) qui prend en argument une chaıne de caractères repressentant un entier en base 2 et retourne un entier naturel (de type int) . Exemple : l’appel bin2dec("10010100") retourne 148.

  • Partager sur Facebook
  • Partager sur Twitter
8 février 2024 à 13:06:07

Bonjour,

C'est un déterrage d'un sujet ancien

Tu devrais plutôt créer un nouveau post 

  • Partager sur Facebook
  • Partager sur Twitter
8 février 2024 à 13:43:36

En plus, ce n'est pas le même exercice, c'est une conversion dans l'autre sens. 

Conseil: si votre prof vous donne un exercice dans le cadre d'un cours, c'est pour y réfléchir et appliquer ce qui a été vu en cours. Essayer des trucs, jusqu'a trouver. La solution est a votre portée.

Dire "j'y arrive pas" et essayer de récupérer une solution deja faite, ça ne vous mènera à rien. Même si vous avez l'impression de comprendre plus ou moins. L'important c'est de s'entrainer à CHERCHER vous-même.

-
Edité par michelbillaud 8 février 2024 à 13:51:47

  • Partager sur Facebook
  • Partager sur Twitter
8 février 2024 à 13:58:47

@ARIS-mohamed Bonjour, merci de ne pas déterrer d'ancien sujet résolu, créer votre propre sujet en nous fournissant le code que vous avez écrit (inséré sur le forum avec le bouton d'insertion de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter