IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Besoin d'un petit coup de main pour du Algo->Python [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Besoin d'un petit coup de main pour du Algo->Python
    Bonjour!

    Je suis Lycéen en ISN, et on a eu un exercice où il faut traduire un algorithme transformant les nombres décimaux en nombre binaire.
    Je suis un petit peu coincé.. c'est pour ça que je me permets de vous demander un petit coup de pouce
    Voici l'algorithme :
    Nom : téléchargement.png
Affichages : 430
Taille : 46,3 Ko

    Et voici ce que j'ai fais :

    On doit traduire ici le nombre 135
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    binaire = []
    dec=float(input("nombre decimal à traduire en binaire = "))
    while dec > 0:
    	#Si le reste de la division =0, ajouter 0 ; si le reste = 1, ajouter 1 à la liste
    	if (dec%2) == 0:
    		binaire.append(0)
    	else:
    		binaire.append(1)
    	dec=(dec/2)
            print(dec)
    #ici je remets la suite des chiffres dans le sens inverse car il ajoutaient les nombre à droite et non à gauche
    binaire.reverse() 
    print(binaire)
    Et voici ma sortie (qui je pense ne correspond pas à la traduction binaire de 135)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nombre decimal à traduire en binaire = 135
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
     
     
    ------------------
    Je n'arrive pas à comprendre pourquoi il me sort autant de 1, Et pourquoi il y a les variables "r" et "i" dans l'algorithme qui ne sont utilisés nulle part

    Il existe des versions plus améliorés de ce code (juste avec la fonction bin() par exemple mais je pense qu'il faut traduire littéralement l’algorithme et non l'optimiser au maximum)

    Auriez-vous une idée ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Pierre_Euh Voir le message
    Je n'arrive pas à comprendre pourquoi il me sort autant de 1,
    Dans votre boucle, ajoutez un "print(dec)" pour voir comment çà bouge.
    Normalement, vous devriez voir le problème...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Dans votre boucle, ajoutez un "print(dec)" pour voir comment çà bouge.
    Normalement, vous devriez voir le problème...

    - W
    Merci pour ton aide, Mais je comprends encore moins,
    Il me met comme sorti la valeur de dec, comme tu me l'as dis,Mais, il ne sort pas de la boucle while quand il est strictement inférieur à 0
    Je ne suis qu'un débutant, mais pour moi logiquement il était sensé sortir de la boucle non ?
    J'ai modifié le code du premier message pour que tu puisses voir où j'ai placé le print(dec)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #Input : 135
    67.5
    33.75
    16.875
    8.4375
    4.21875
    2.109375
    1.0546875
    0.52734375
    0.263671875
    0.1318359375
    0.06591796875
    0.032958984375
    0.0164794921875
    0.00823974609375
    #Et il continue jusqu'à ..
    8.4e-323
    4e-323
    2e-323
    1e-323
    5e-324
    0.0
    #Puis il affiche la suite

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Pierre_Euh Voir le message
    Merci pour ton aide, Mais je comprends encore moins
    Ben... çà ne devrait afficher que des entiers car votre algo. écrit juste de façon compliquée: n = 2*q + r, stocke r dans la liste et lance l'itération suivante avec q entier.
    Donc il ne faut pas diviser avec la division normale ('/') mais avec la division entière ('//') (et aussi corriger float(input(...))).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ça marche, Merci beaucoup ! :100:

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Ici, tu as des difficultés parce que tu as des lacunes en maths, ... et pas parce que tu as des lacunes en Python.

    Je reprends l'algorithme initial, en le reformulant un peu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tant que dec >0
       si dec est pair alors 
           ajouter 0 au début du tableau
       sinon
           ajouter 1 au début du tableau
       fin si
       diviser dec par 2
    fin
    On teste si dec est pair ou impair. Donc, on ne veut que des entiers dans notre histoire, pas de nombres décimaux. Ensuite, quelle est la bonne syntaxe pour faire une division entière (135/2 donne 67 et pas 67.5), c'est de la cuisine. Mais il faut déjà se rendre compte qu'on ne veut que des divisions entières.

    Une bonne pratique, c'est de dérouler l'algorithme à la main :
    dec vaut 135
    135 est impair donc on met un 1 au début de notre chaine (1) et On divise dec par 2 : dec = 135/2 = 67
    67 est impair donc on met un 1 au début de notre chaine (11) et on divise dec par 2 : dec = 67/2= 33
    33 est impair donc on met un 1 au début de notre chaine (111) et on divise dec par 2 : dec = 33/2= 16
    16 est pair donc on met un 0 au début de notre chaine (0111) et on divise dec par 2 : dec = 16/2= 8
    8 est pair donc on met un 0 au début de notre chaine (00111) et on divise dec par 2 : dec = 8/2= 4
    4 est pair donc on met un 0 au début de notre chaine (000111) et on divise dec par 2 : dec = 4/2= 2
    2 est pair donc on met un 0 au début de notre chaine (0000111) et on divise dec par 2 : dec = 2/2= 1
    1 est impair donc on met un 1 au début de notre chaine (10000111) et on divise dec par 2 : dec = 1/2= 0
    dec vaut 0 ; fin du traitement.
    Résultat = 10000111
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Bonjour,

    Parce que j'aime bien pinailler :
    • L'algo se contente de dire que dec est un entier alors qu'il devrait dire que dec est un entier naturel (c.-à-d. positif).
    • D'ailleurs, l'algo est faux dans le cas où dec == 0, car bin reste une chaîne vide au lieu de valoir '0'.
    • Les variables r et i ne sont pas utilisées. Elles étaient probablement utilisées dans une précédente version de l'algo, puis l'auteur a oublié d'enlever leurs déclarations.

    À part ça, la consigne indique que bin est une chaîne de caractères, pas une liste d'entiers.

    Voici ma correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    dec = int(input('Entrez un entier naturel en écriture décimale : '))
    if dec < 0:
    	raise RuntimeError(f'Entier strictement négatif ({dec}).')
    if dec == 0:
    	bin = '0'
    else:
    	bin = ''
    	while dec > 0:
    		if dec % 2 == 0:
    			bin = '0' + bin
    		else:
    			bin = '1' + bin
    		dec = dec // 2
    print(bin)

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Juste une question, à quoi sert le if-else ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bin = ''
    while dec > 0:
        bin = str(dec % 2) + bin
        dec = dec // 2
    non ?

  9. #9
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Oui, ça marche aussi.

    Du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dec = int(input('Entrez un entier naturel en écriture décimale : '))
    if dec < 0:
    	raise RuntimeError(f'Entier strictement négatif ({dec}).')
    if dec == 0:
    	bin = '0'
    else:
    	bin = ''
    	while dec > 0:
    		bin = str(dec % 2) + bin
    		dec = dec // 2
    print(bin)

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Autre solution pour le fun,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> value = 50
    >>> bin = ''
    >>> while value > 0:
    ...     n = '0' if value%2 == 0 else '1'
    ...     bin += n
    ...     value //= 2
    ... 
    >>> bin[::-1]
    '110010'
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Lister les CharSets d'une font
    Par Jipété dans le forum Lazarus
    Réponses: 28
    Dernier message: 24/07/2023, 13h57
  2. Réponses: 1
    Dernier message: 12/03/2014, 22h58
  3. Réponses: 4
    Dernier message: 06/09/2013, 17h22
  4. [DEBUTANT] Besoin d'un petit coup de main
    Par rantanplan08 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/04/2006, 12h09
  5. UPDATE trop compliqué, besoin d'un petit coup de main ;)
    Par pwangen dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/02/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo