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 :

Problèmes de codage de convertisseurs de bases, débutant (binaire, décimale et héxadécimale)


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Problèmes de codage de convertisseurs de bases, débutant (binaire, décimale et héxadécimale)
    Bonsoir,
    Avec un camarade nous devons coder un programme permettant de convertir plusieurs bases entre elles : décimale vers binaire ; binaire vers décimale ; hexadécimale vers binaire et enfin binaire vers hexadécimale cependant nous sommes débutants et nous avons les connaissances basiques du langage Python, mais nous sommes motivés à finir ces programmes.
    Nous avons réussi le code "décimal vers binaire" cependant nous sommes réellement bloqués pour les codes suivants. Nous n'arrivons pas à retranscrire les étapes de chaque conversions en langage python. Actuellement nous sommes en cours de codage du code "binaire vers décimal".
    S'il serait possible que quelqu'un puisse nous éclairer dans ces 3 codes ça serait sympa ^^ ou même nous indiquer un programme où nous pourrons nous appuyer.
    Merci d'avance et bonne fin de soirée.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si vous ne postez pas un peu de code pour montrer où vous en êtes, pas facile de vous aider.
    Normalement, pour faire çà, nous utilisons des fonctions Python comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> n = 1234
    >>> b = bin(n)
    >>> b
    '0b10011010010'
    >>> z = int(b[2:], 2)
    >>> z
    1234
    vous, vous devez les ré-inventer histoire d'apprendre à programmer.

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui désolé, nous n'y avons pas pensé.

    Pour être plus précis, nous devons créer un code permettant à un utilisateur quelconque de rentrer un nombre binaire pour lui permettre de le convertir dans une autre base. Notre consigne est de le faire selon les bases :
    Binaire <--> Décimal
    Binaire <--> Hexadécimal
    Nous avons réussi tout de même à faire la conversion décimal --> binaire.
    Actuellement nous sommes bloqués sur la conversion binaire --> décimal.

    Voici où nous en sommes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Fonction Binaire vers Decimal
     
    def binaire_vers_decimal():
        nbr_binaire = str(input("Entrez le nombre binaire à convertir :"))
        nbr_decimal = 0
        indice = 0
        nbr_binaire = nbr_binaire[::-1] # Retourne le nombre binaire
        print(nbr_binaire) # A enlever
        print(len(nbr_binaire)) # Affiche le nbr de caractères de la chaine, a enlever
        for i in nbr_binaire :
            nbr_decimal += int(nbr_binaire(len(nbr_binaire)-(i+1))*(2**i))
    Sauf que la, cette erreur s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        nbr_decimal += int(nbr_binaire(len(nbr_binaire)-(i+1))*(2**i))
    TypeError: Can't convert 'int' object to str implicitly

    Ne comprenant pas, nous avons décidé de faire appel à vos connaissances pour nous éclairer

    Merci d'avance

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> b = '0101'
    >>> for i in b:
    ...    print(i, type(i))
    ...
    0 <class 'str'>
    1 <class 'str'>
    0 <class 'str'>
    1 <class 'str'>
    >>>
    La boucle "for" va itérer sur les caractères de la chaîne "b".
    Vous obtenez des chaînes de caractères de longueur 1.
    Le soucis est quand vous allez faire "+1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> b[1] + 1
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Can't convert 'int' object to str implicitly
    >>>
    Python est gentil mais, il y a des limites!

    Un nombre en base 2 s'écrit: n = c0*2^0 + c1*2^1 + c2*2^2 + ... où les "ci" sont les 0 et 1 de la représentation binaire.
    Votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        nbr_decimal += int(nbr_binaire(len(nbr_binaire)-(i+1))*(2**i))
    est illisible et donc probablement faux.
    Partons de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> b
    '1010'
    >>> nd = 0 # le résultat à l'étape n-1
    "nd" est la valeur calculée jusqu'au(n-1)ième digit de la représentation (inversée).

    *note* vous pourriez partir des digits de poids fort, mais comme vous avez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        indice = 0
        nbr_binaire = nbr_binaire[::-1] # Retourne le nombre binaire
    Je suppose que vous partez des digits de poids faible.

    Pour calculer l'itération "n", on part de n, la position et c le digit en cette position, d'où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>>    nd += int(c) * 2**n
    Il vous reste à mettre cela en forme.

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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    merci beaucoup pour votre aide, seulement nous n'arrivons toujours pas à formuler correctement ce que nous pensons en python. Voilà ce que nous avons fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def binaire_vers_decimal():
        nbr_binaire = str(input("Entrez le nombre binaire à convertir :"))
        nbr_decimal = 0
        indice = 0
        nd = 0
        c = 1 or 0
        nbr_binaire = nbr_binaire[::-1] # Retourne le nombre binaire
        print(nbr_binaire) # A enlever
        print(len(nbr_binaire)) # Afficher le nbr de caractères de la chaine, a enlever
        for n in len(nbr_binaire):
            nd += int(c) * 2**n
    Ici, cette erreur s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for n in len(nbr_binaire):
    TypeError: 'int' object is not iterable
    Est ce un problème de compréhension de notre part ? De logique ?
    Nous ne comprenons pas ce qui pose problème..

    Merci d'avance

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par azert07 Voir le message
    Est ce un problème de compréhension de notre part ? De logique ?
    Nous ne comprenons pas ce qui pose problème..
    Les 2
    Vous écrivez: "for n in len(nbr_binaire):" en espérant que cela construise la suite 0, 1, 2, ... len(nbr_binaire)-1.
    Python n'est pas d'accord et le dit: 'int' object is not iterable
    Il faut écrire: "for n in range(len(nbr_binaire)):"

    L'instruction suivante étant: "nd += int(c) * 2**n", çà ne va pas le faire!
    Car "c" ne reflète pas le digit en position n, il vaut toujours "1" (à cause du "c = 1 or 0" qui traîne plus haut).
    note: Si B est une chaîne de caractères (ex: '1010'), pour récupérer le n-ième octet, il faut considérer B comme un tableau et écrire B[n].

    Si vous arrivez à corriger cela, vous aurez un code dégueu... mais çà devrait fonctionner.
    Encore un effort.

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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Étant une nouvelle fois bloqués, nous faisons une nouvelle fois appel à vous :
    en fait, nous n'arrivons tout simplement pas à corriger nos erreurs que vous avez souligné avant (excepté le """ for n in range(len(nbr_binaire)) """ qui était une inattention de notre part).
    Nous aimerions savoir comment définir le "c", nous avons essayé plusieurs solutions (toutes plus inutiles les unes que les autres ) et maintenant nous (re)faisons appel à vous.

    Nous n'avons pas compris non plus l'histoire de tableau avec """ B[n] """ ?

    Désolé encore, mais nous sommes débutants et la logique de codage n'est pas encore rentrée
    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Si la logique n'est pas rentrée, prend une feuille et un papier et essaye de voir "comment" tu répond à ton problème à la main !
    Ici, tu veux passer du binaire au décimal (qui je trouve est presque plus simple que l'inverse !).
    Tu as N = 101001 en binaire
    en décimal il vaudra 1*1 + 0*2 + 0*4 + 1*8 + 0*16 + 1*32 = 41
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    N = 101001
    N_dec = 0
    for i in str(N)[::-1]:
        N_dec += ...
    Je te laisse finir.. et attention a vérifier que ta variable est un entier et non une chaine

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Et pour binaire <-> hexa n'oublie pas que 16 = 2^4 donc tu peux faire par 'paquet de 4' directement ! Sinon tu repasses en decimal mais c'est moins joli ! Bon courage

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par azert07 Voir le message
    Nous n'avons pas compris non plus l'histoire de tableau avec """ B[n] """ ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> b = '0101'
    >>> b[0]
    '0'
    >>> b[1]
    '1'
    >>> b[2]
    '0'
    >>> b[3]
    '1'
    >>>
    Pour le texte, voir le chapitre Accès aux caractères individuels d'une chaîne.

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

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bon, premièrement, merci pour vos conseils

    Maintenant, nous sommes complètement bloqués .. Pourquoi, nous ne savons pas, car à l'écrit nous arrivons parfaitement à résoudre un problème de ce type, mais en python nous perdons toute logique..
    L'échéance approchant, nous perdons peu à peu espoir de finir dans les temps..

    Voici encore une fois notre programme pour que vous voyez où nous en sommes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def binaire_vers_decimal():
        nbr_binaire = str(input("Entrez le nombre binaire à convertir :"))
        nbr_decimal = 0
        n = nbr_binaire[]
        c = int[n]
        nbr_binaire = nbr_binaire[::-1] # Retourne le nombre binaire
        print(nbr_binaire) # A enlever
        print(len(nbr_binaire)) # Afficher le nbr de caractères de la chaine, a enlever
        for n in range(len(nbr_binaire)):
            nbr_decimal += int(c) * 2**n
    Oui, il y a peu de nouveautés, car chaque tentative est un nouvel échec ..

    Bonne soirée à vous

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par azert07 Voir le message
    Oui, il y a peu de nouveautés, car chaque tentative est un nouvel échec ..
    Le code que vous postez n'est pas du Python.
    D'ailleurs, l'interpréteur devrait râler lorsqu'il rencontre "n = nbr_binaire[]" et "c = int[n]"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> n = nbr_binaire[]
      File "<stdin>", line 1
        n = nbr_binaire[]
                        ^
    SyntaxError: invalid syntax
    >>> c = int[n]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'type' object is not subscriptable
    >>>
    Relisez ce que j'ai posté ici (et surtout le chapitre du tuto).
    Prenez le temps de comprendre ce que vous faites plutôt qu'espérer que çà va le faire en tapant n'importe quoi.

    Citation Envoyé par azert07 Voir le message
    L'échéance approchant, nous perdons peu à peu espoir de finir dans les temps..
    Bah... ben vous aurez une mauvaise note... Il n'y a pas mort d'homme quand même.
    Et puis si vous n’êtes pas encore au point avec les chaînes de caractères Python, il faut assumer.

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

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonsoir ,

    Nous avons finalement réussi à coder notre programme, et il marche parfaitement !!
    Voici le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def binaire_vers_decimal():
        nbr_binaire = str(input("Entrez le nombre binaire à convertir :"))
        nbr_decimal = 0 
        nbr_binaire = nbr_binaire[::-1] # Retourne le nombre binaire
        print(len(nbr_binaire)) # Afficher le nbr de caractères de la chaine, a enlever
        for i in range(len(nbr_binaire)):
            c = nbr_binaire[i]
            nbr_decimal += int(c)* 2**i
        print(nbr_binaire," en base 2 donne", nbr_decimal, "en base 10")
    Merci encore pour votre aide, vous nous avez bien guidés !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Je suis sûr que vous êtes encore plus fiers d'avoir codé çà vous mêmes que si je vous avais donné la solution.

    Cette portion de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for i in range(len(nbr_binaire)):
            c = nbr_binaire[i]
            nbr_decimal += int(c)* 2**i
    est un peu ch...
    Dans votre code initial, vous aviez: "for i in nbr_binaire:".

    Quelque part, soit vous balayez 'la chose' via les indices soit via ses éléments.

    Python a une instruction spéciale pour faire les 2 à la fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for i, c in enumerate(nbr_binaire):
            nbr_decimal += int(c)* 2**i
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Bravo !

    Si je peux me permettre, je pense que la fonction n'est pas parfaite : en fait c'est une procédure qui affiche qqchose.
    L'idéal, ce serait qu'elle "retourne" un résultat avec l'instruction "return".
    Dans ce cas, le "input" serait à l'extérieur de la fonction.

    [Edit] Vous êtes certain que cela fonctionne ?
    Pas d'aide par mp.

Discussions similaires

  1. [MySQL-5.5] Problème de codage de base
    Par pereplex dans le forum Administration
    Réponses: 1
    Dernier message: 26/08/2013, 14h39
  2. Réponses: 2
    Dernier message: 20/08/2004, 17h10
  3. Problème Lors d'un copie de base
    Par 79Charles dans le forum Administration
    Réponses: 17
    Dernier message: 19/08/2004, 15h13
  4. MYSQL 5 alpha Win - pbm création base - Débutant
    Par nerick dans le forum Débuter
    Réponses: 8
    Dernier message: 13/04/2004, 14h56
  5. [Accents - XML] Problème de codage non supporté !!
    Par Smortex dans le forum Composants VCL
    Réponses: 6
    Dernier message: 24/11/2002, 11h00

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