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 :

Programme pour traduire un nombre en lettres


Sujet :

Python

  1. #1
    Candidat au Club
    Programme pour traduire un nombre en lettres
    Ce programme consiste à renvoyer l'écriture en lettres d'un nombre rentrer par un utilisateur.

    C'est un énonce le 4 question:
    ● Créer un dictionnaire NOMBRES_LETTRES ayant :
    •Pour clé les nombres de 0 à 16, les dizaines entre 20 et 60(inclus)
    •Pour valeur la correspondance en lettres
    Cette question est déjà faite.

    ●Crée une fonction "décomposition()" ayant en paramètre un nombre et donnant sa décomposition en puissance de 10 sous forme d'une file.
    Exemple: decomposition(4840) donnera 0 0 0 0 0 0 0 0 4 8 4 0
    Cette question est faite mais pas sous forme de file

    ●Crée une fonction "classe()" qui :
    •prend 3 chiffres en paramètre: le premier correspondant au centaines, le deuxième au dizaine et le troisième au unités.
    •retourne une chaîne de caractères avec l'écriture en lettres de ce nombre
    Je bloque a cette question

    ●Crée une fonction "traduction()" ayant en paramètre un nombre (de 12 chiffres maximum) et affichant son écriture en lettres
    Je pense qu'il faut la fonction "classe()" pour faire cette question

    Si vous pouvez m'aider pour cette exercice, et aussi me dire si l'on peut envoyer des photo de son programme ou alors de l'énoncé.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par TheFalqo Voir le message
    Si vous pouvez m'aider pour cette exercice, et aussi me dire si l'on peut envoyer des photo de son programme ou alors de l'énoncé.
    Lorsque vous éditez un message vous avez une 3 barres d'outils au dessus de la fenêtre de saisie.
    Si vous baladez le pointeur de la souris au dessus des symboles, ils vous indiquent ce qu'ils font.
    Pour insérer du code, c'est le #.

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

  3. #3
    Expert éminent sénior
    Bonjour
    Citation Envoyé par TheFalqo Voir le message
    ●Crée une fonction "classe()" qui :
    •prend 3 chiffres en paramètre: le premier correspondant au centaines, le deuxième au dizaine et le troisième au unités.
    •retourne une chaîne de caractères avec l'écriture en lettres de ce nombre
    Je bloque a cette question
    Tu prends chaque chiffre et tu l'analyse par rapport à tes possibilités. 892 c'est "huit cent" puis "quatre-vingt" puis "douze". Ok pour trouver "quatre-vingt" c'est pas évident mais c'est à toi de trouver et tester les cas particuliers par rapport à ton dictionnaire pour arriver à cette solution

    Citation Envoyé par TheFalqo Voir le message
    ●Crée une fonction "traduction()" ayant en paramètre un nombre (de 12 chiffres maximum) et affichant son écriture en lettres
    Je pense qu'il faut la fonction "classe()" pour faire cette question
    Evidemment. Dans ce genre de devoir, chaque étape est là pour aider à l'étape suivante. Le nombre (par exemple) 480 882 756 c'est "480" en lettres suivi de "millions" puis "882" suivi de "mille" puis "756" => il te suffit de découper le nombre en blocs de 3 et passer chaque bloc par la fonction "classe()".

    Citation Envoyé par TheFalqo Voir le message
    et aussi me dire si l'on peut envoyer des photo de son programme ou alors de l'énoncé.
    Tu peux mettre des photos de l'énoncé si tu veux mais bon, vu ce que tu en as décrit on a tous bien compris le truc et ça n'apportera aucune plus-value. Pour le code,
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Candidat au Club
    Citation Envoyé par TheFalqo Voir le message

    ●Crée une fonction "décomposition()" ayant en paramètre un nombre et donnant sa décomposition en puissance de 10 sous forme d'une file.
    Exemple: decomposition(4840) donnera 0 0 0 0 0 0 0 0 4 8 4 0
    Cette question est faite mais pas sous forme de file
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def decomposition(n):
        n=[int(i) for i in str(n)]
        L=[0,0,0,0,0,0,0,0,0,0,0,0]
        long=len(L)-1
        long2=len(n)-1
        for i in range(long2+1):
            L[long-i]=n[long2-i]
        for i in range(long+1):
            L[i]=str(L[i])
        L=' '.join(L)
        return (L)


    Pour la premier fonction j'ai fait ceci, je ne sais pas si il y a des chose a améliorer ou pas

  5. #5
    Candidat au Club
    Citation Envoyé par TheFalqo Voir le message

    ●Crée une fonction "classe()" qui :
    •prend 3 chiffres en paramètre: le premier correspondant au centaines, le deuxième au dizaine et le troisième au unités.
    •retourne une chaîne de caractères avec l'écriture en lettres de ce nombre
    Je bloque a cette question
    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
    def classe(n):
        T=[]
        n=[int(i) for i in str(n)]
        if len(n)==3 and n[1]==0 and n[2]==0:
            T.append((Nombres_Lettres.get(n[0]),"cents"))
            for i in range(len(T)):
                T[i]=str(T[i])
            T='-'.join(T)
        elif len(n)==3 and n[1]==8 and n[2]==0:
            T.append((Nombres_Lettres.get(n[0]),Nombres_Lettres.get(4),Nombres_Lettres.get(20)))
            for i in range(len(T)):
                T[i]=str(T[i])
            T='-'.join(T)
        elif len(n)==3 and n[1]==9:
            T.append((Nombres_Lettres.get(n[0]),Nombres_Lettres.get(4),Nombres_Lettres.get(20),Nombres_Lettres.get(n[2]+10)))
            for i in range(len(T)):
                T[i]=str(T[i])
            T='-'.join(T)


    Voici ce que j'ai testé pour cette fonction(je ne met pas tout car sinon trop long mais le reste est base sur ce que j'ai mis la) mais le résultat attendu n'est pas du tout bon, avec ce code j'obtient
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> classe(380)
    "('trois', 'quatre', 'vingt')"
    >>> classe(390)
    "('trois', 'quatre', 'vingt', 'dix')"

  6. #6
    Expert confirmé
    hello,
    Citation Envoyé par TheFalqo Voir le message
    Ce programme consiste à renvoyer l'écriture en lettres d'un nombre rentrer par un utilisateur.
    ●Crée une fonction "décomposition()" ayant en paramètre un nombre et donnant sa décomposition en puissance de 10 sous forme d'une file.
    Exemple: decomposition(4840) donnera 0 0 0 0 0 0 0 0 4 8 4 0
    Cette question est faite mais pas sous forme de file
    Si tu veux en savoir plus sur les files tu peux aller voir ici par exemple.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Candidat au Club
    Citation Envoyé par jurassic pork Voir le message
    hello,

    Si tu veux en savoir plus sur les files tu peux aller voir ici par exemple.
    j'ai essaye ça
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    n=[int(i) for i in str(n)]
        queue=[]
        for i in range(12):
            queue.append(0)
        for k in range(len(n)):
            queue.pop(0)
            queue.append(n[k])
        print(queue)

    Je trouve le code plus court mais il faudrait ajouter 1 ou 2 ligne pour obtenir le resultat attendu car avec ce code j'obtient
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> decomposition (4840)
    [0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 4, 0]


    Donc il faudrait reussir a enlever les [] et aussi les virgule

  8. #8
    Expert éminent sénior
    Citation Envoyé par TheFalqo Voir le message
    Voici ce que j'ai testé pour cette fonction(je ne met pas tout car sinon trop long mais le reste est base sur ce que j'ai mis la) mais le résultat attendu n'est pas du tout bon, avec ce code j'obtient
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> classe(380)
    "('trois', 'quatre', 'vingt')"
    >>> classe(390)
    "('trois', 'quatre', 'vingt', 'dix')"
    Mouais. Me semble que la fonction classe() devrait avoir un return quelque part pour renvoyer un truc à l'utilisateur (un affichage n'est pas synonyme d'une valeur retournée). Ensuite, si s=('trois', 'quatre', 'vingt', 'dix') (un tuple donc) et que je veux l'afficher sous forme de string, suffit d'écrire print(" ".join(s)).

    Citation Envoyé par TheFalqo Voir le message
    Je trouve le code plus court mais il faudrait ajouter 1 ou 2 ligne pour obtenir le resultat attendu car avec ce code j'obtient
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> decomposition (4840)
    [0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 4, 0]


    Donc il faudrait reussir a enlever les [] et aussi les virgule
    Ne te focalise pas sur ce qui est affiché, c'est du détail. Un affichage n'est qu'un enrobage particulier d'un résultat, or ce qui compte c'est le résultat. Si le résultat est bon, tu pourras toujours l'afficher comme tu en as envie => s=[0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 4, 0]; print(s); print("".join(str(x) for x in s)).

    Et par exemple pour s=('trois', 'quatre', 'vingt', 'dix'), si on veut l'afficher de façon littéralement correcte (pas de "s" à "cent" sauf si plusieurs centaines et pas de chiffre derrière): print("%s cent%s %s" % (s[0], "" if s[0] == "un" or any(s[1:]) else "s", " ".join(s[1:]))).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  9. #9
    Candidat au Club
    Citation Envoyé par Sve@r Voir le message


    Et par exemple pour s=('trois', 'quatre', 'vingt', 'dix'), si on veut l'afficher de façon littéralement correcte (pas de "s" à "cent" sauf si plusieurs centaines et pas de chiffre derrière): print("%s cent%s %s" % (s[0], "" if s[0] == "un" or any(s[1:]) else "s", " ".join(s[1:]))).
    Je n'ai pas trop compris comment fonctionne le programme, si c'est possible de m'expliquer ?

  10. #10
    Expert éminent sénior
    Citation Envoyé par TheFalqo Voir le message
    Je n'ai pas trop compris comment fonctionne le programme, si c'est possible de m'expliquer ?
    Ben il faut aussi lire des tutos sur les strings !!!

    J'affiche une string formatée. Chaque "%s" est remplacé ensuite par une expression placée après le "%" dans l'ordre.
    Donc le premier "%s" est alors remplacé par s[0] (ici "trois") ce qui donne "trois cent".
    Le second "%s" est remplacé par "" if s[0] == "un" or any(s[1:]) else "s" c'est à dire "rien si s[0] == un (parce que pas de "s" à "un cent") ou s'il y a (any) quelque chose après ; sinon il faut un "s" (exemple 200 donne "deux cents" mais 250 donne "deux cent cinquante" sans "s").
    Le 3° "%s" est remplacé par ce qui reste (ici "vingt dix"), ce qui donne donc "trois cent quatre vingt dix".
    Ceci dit, c'est pas ce qu'il y a de mieux car par exemple "un", "dix", "neuf" donnera "un cent dix neuf" alors que la bonne formulation est "cent dix-neuf" mais ça peut te donner des idées.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  11. #11
    Candidat au Club
    ok c'est plus clair maintenant, je vais refaire des test

  12. #12
    Expert confirmé
    hello,
    Citation Envoyé par TheFalqo Voir le message
    j'ai essaye ça
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    n=[int(i) for i in str(n)]
        queue=[]
        for i in range(12):
            queue.append(0)
        for k in range(len(n)):
            queue.pop(0)
            queue.append(n[k])
        print(queue)

    Pour simplifier l'initialisation de queue avec 12 zéros tu peux utiliser ce code :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    queue=[0]*12 # initialisation de la liste avec 12 zéros


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    Candidat au Club
    J'ai bien avancer dans le programme, le code n'est pas très beau mais fonctionnelle mais j'aurais une autre question.

    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
    elif len(n)==3:
            if n[0]==0 or n[0]==1:
                None
            else:
                T.append(Nombres_Lettres.get(n[0]))
            T.append("cent")
            if n[1]!=0 and n[2]!=0:
                if n[1]>6:
                    T.append(Nombres_Lettres.get(10))
                    T.append(Nombres_Lettres.get(n[1]))
                else:
                    T.append(Nombres_Lettres.get(n[1]+10))
            elif n[1]!=0 and n[2]==0:
                if n[1]>6:
                    T.append(Nombres_Lettres.get(10))
                    T.append(Nombres_Lettres.get(n[2]))
                else:
                    T.append(Nombres_Lettres.get(n[2]+10))
            else:
                T.append(Nombres_Lettres.get(n[2]))
            return(t.join(T))


    dans ce bout de code j'ai fait des test car quand je rentre classe(534) on me donne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> classe(534)
    'cinq-cent-treize'
    au lieu de
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    >>> classe(534)
    'cinq-cent-trente-quatre'


    je voudrais savoir comment faire pour résoudre ce problème

  14. #14
    Expert éminent sénior
    Citation Envoyé par TheFalqo Voir le message
    Code python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if n[0]==0 or n[0]==1:
                None
            else:
                T.append(Nombres_Lettres.get(n[0]))
    Déjà l'instruction neutre c'est pass et non None (mais c'est bien d'avoir compris qu'il fallait mettre quelque chose et d'avoir essayé ça). Toutefois il y a encore plus simple: if n[0] != 0 and n[0] != 1: T.append(Nombres_Lettres.get(n[0])) ou encore if n[0] not in (0, 1): T.append(Nombres_Lettres.get(n[0])).
    Ben oui, au lieu de faire "si j'ai ceci alors rien sinon cela" autant faire directement "si je n'ai pas ceci alors cela" !!!

    Citation Envoyé par TheFalqo Voir le message
    je voudrais savoir comment faire pour résoudre ce problème
    Comme tous les autres chaque fois qu'un résultat n'est pas bon: du print() de toutes les variables intermédiaires qui amènent à ce résultat avec à chaque valeur affichée une analyse de ta part pour vérifier si la valeur que tu obtiens est bien celle qui était attendue
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  15. #15
    Candidat au Club
    j'ai a peu près compris ce que tu ma dit avec les test du print mais mon erreur se produit ici:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if n[1]>6:
                    T.append(Nombres_Lettres.get(10))
                    T.append(Nombres_Lettres.get(n[1]))
                else:
                    T.append(Nombres_Lettres.get(n[1]+10))


    avec le n[1]+10

    et je voudrai par exemple quand n[1]==3 faire que le T.append ajoute 30

    exemple: n=[5,3,4]
    T.append(Nombres_Lettres.get(30) (Je ne sais pas comment obtenir le 30 avec le n[1])
    T.append(Nombres_Lettres.get(n[2])

  16. #16
    Expert éminent sénior
    Citation Envoyé par TheFalqo Voir le message
    T.append(Nombres_Lettres.get(30) (Je ne sais pas comment obtenir le 30 avec le n[1])
    Peut-être déjà revoir ce que fait la méthode dict.get() et si c'est comme ça qu'on s'en sert...

    Citation Envoyé par TheFalqo Voir le message
    et je voudrai par exemple quand n[1]==3 faire que le T.append ajoute 30
    Il y a une infinité de façons d'obtenir y=30 avec x=3 (exemple y=x+27 ou y=2x+24 ou y=-0.7x² + 36.3 ou ...) mais la solution la plus proportionnelle est de multiplier x par 10: T.append(n[1] * 10)

    Citation Envoyé par TheFalqo Voir le message
    exemple: n=[5,3,4]
    Je ne sais pas comment obtenir le 30 avec le n[1])
    Ben... n[1] * 10...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  17. #17
    Candidat au Club
    Merci pour votre aide, mon programme est fonctionnelle. je vous remercie pour toute cette aide que vous m'avez apporter

###raw>template_hook.ano_emploi###