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

Algorithmes et structures de données Discussion :

nombre: de lettres aux chiffres


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut nombre: de lettres aux chiffres
    salut
    voila je doi creer une fonction qui reçoi en parametre une chaine de caracteres
    (un nombre ecrit en lettres) et qui doit retourner un entier (le nombre equivalent) g deja fai la fonction qui fai linverse.
    mai la javou k je suis depassé.
    mon probleme est surtt algorithmique
    comment aborder cela?
    connaissez vous des exemples des referencdes ou des liens parlant du sujet?
    avez vous une idées qui peu m'etre utile?


    merci pour votre pressieuse aide

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nsanabi
    voila je doi creer une fonction qui reçoi en parametre une chaine de caracteres
    (un nombre ecrit en lettres) et qui doit retourner un entier
    Quel est le format d'entrée ?

    "123" ou "Cent vingt trois" ?

  3. #3
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    non avec "123" c facil.
    le format d'entré est "deux cents cinqaunte huit" par exemple
    sans atteindre le million.
    je sai k je peu utiliser cent et mille comme une sorte d'operateur
    dans "trois cents mille" par ex je multipli 3 par cent puis par mille

    mai je sai pa. ça reste tres vague dans ma tete

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nsanabi
    non avec "123" c facil.
    le format d'entré est "deux cents cinqaunte huit" par exemple
    sans atteindre le million.
    je sai k je peu utiliser cent et mille comme une sorte d'operateur
    dans "trois cents mille" par ex je multipli 3 par cent puis par mille

    mai je sai pa. ça reste tres vague dans ma tete
    Il faut donc faire un analyseur syntaxique qui sait reconnaitre les mots dans un certain ordre et déterminer le chiffre et le coefficient multiplicateur correspondant... C'est assez complexe, mais c'est faisable.

    Bien sûr, il doit savoir signaler ce genre d'erreur : 'cinqaunte'

    Quand tu dis 'sans atteindre le million, tu veux dire des nombres entiers de 0 à 999999 ? Ca va être chaud, surtout que les règles de grammaire sont assez compliquées. Est-ce qu'il faut être rigoureux là dessus, ou est-ce qu'on tolère certaines erreurs 'du moment que c'est sans ambiguité'...

    As-tu étudié les automates finis et les outils comme lex et yacc ?

    C'est un projet scolaire, professionnel ? quel délai ?

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il faut donc faire un analyseur syntaxique qui sait reonnaitre les mots dans un certain ordre et déterminer le chiffre et le coefficient multiplicateur correspondand... C'est assez complexe, mais c'est faisable.
    Complexe, pas forcément, il faut seulement faire attention aux cas particuliers : trente et un.

    Il faudrait découper l'analyse en deux passes (classiquement) : analyse lexicale puis syntaxique.

    Pour la lexicale, le tout est de reconnaitre les tokens (tous les nombres et autres subtilités).

    Ensuite, pour analyser tes nombres, le tout est de produire une grammaire adequate.

    Comme l'a suggéré Emmanuel, si tu as accès à un couple du genre flex/bison ou lex/yacc, ça peut être faisable rapidement.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    si on admet quelques fautes d'orthographes, la syntaxe admise ressemblerait à :
    • <chiffre2à9>='deux'|...|'neuf'
    • <chiffre2à9ourien>=''|<chiffre2à9>
    • <Basic1à100>='un'|'deux'|...|'quatrevingt dixneuf'
    • <UnitéCentaines>='cent'|'cents'
    • <UnitéMilliers>='mille'
    • <nombre0à999>=<basic1à00>|<chiffre2à9ourien><Unitécentaines>|<chiffre2à9ourien><Unitécentaines><Basic1a100>
    • <nombre0à999ourien>=''|<nombre0à999>
    • <nombre0à999999>=<nombre0à999>|<nombre0à999ourien><UnitéMilliers><nombre0à999ourien>

    Pour faire simple sans passer par l'analyse de la syntaxe formelle , on pourra faire les sous-programmes suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TraiteNombre0à100(s:string,valeur_chaine_vide:integer) ==> int;
    Trt_chaine_Milliers(s:string)==>s1,s2 : string ; coeffM : int (1000 ou 0) 
             si pas de mention de milliers : s1='' et coeffM=0 ;
    Trt_chaine_Centaines(s:string)==>s1,s2 : string ;CoeffC : int (0 or 100), 
              si pas de mention de centaines : s1='' et coeffC=0 ;
    Le code du Traitement global sera qqchose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Trt_ChaineMilliers(s,sA,sB,coeffM) ;
    Trt_Chainecentaines(sA,sA1,sA2CoeffCA) ;
    Trt_Chainecentaines(sA,sB1,sB2,CoeffCB) ;
    result=coeffM*(coeffCA*traitenombre0à100(sA1,1)+traitenombre0à100(sA2,0))
           +(coeffCB*traitenombre0à100(sB1,1)+traitenombre0à100(sB2,0))

  7. #7
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    dabord merci pour les reponses

    pour ma recherche je ne v pas traiter les erreurs de syntaxe pour simplifier.
    je suppose kon va entrer un nombre en lettres valide et correct syntaxiqument.

    reste k l'objectif principal: comprendre la chaine et la convertir en nombre.

    javoue ne pas savoir de koi vous parliez qd vous avez mentionner flex/bison ou lex/yacc. je travail sur un langage de programmation structurel et comme vous le savez tres basique qui est le langage C

    voila, g fait klk effort pour commencer:
    g spliter ma chaine de caractere en la decomposant en plusieurs mots dans un tableau (je me suis basé sur la presence de l'espace et du caractere '-', ya un cas particulier trente et un mais c facil a traiter par un simple test).


    g cree aussi des tableaux qui contiennent les mots possibles pour ecrire un nombre en français (cent trois six ...). cent peut prendre un s a la fin mai je considere aussi k un simple test suffit pour ce cas.

    la difficulté pour moi est surtt comment proceder pour calculer le nombre equivalent a la chaine (je v ignorer les erreurs de syntaxe comme g di afin de m concentrer sur la solution)

    g bcp reflechi mai c encore peu clair.

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    [MESSAGE DE MODERATION]

    voila, g fait klk effort pour commencer:
    Essaie de faire des efforts de français parce que j'avoue avoir du mal à te relire merci.

  9. #9
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    Je m'excuse pour ma façon d'écrire, je reformule :

    Je souhaite créer une fonction en langage C qui lit une chaîne de caractères (ex: "douze mille trois cent cinquante-six ") et qui retourne le nombre équivalent (12356).

    je suis coincé surtout au niveau de l’algorithme qui permettra la conversion, pour simplifier les choses :
    je n'intègre pas la gestion des erreurs syntaxique supposant que la chaîne en entrée sera une écriture en lettre correcte d'un nombre.

    le travail que j'ai fait:

    1- j'ai pu fragmenter ma chaîne en plusieurs mots (que je stuque dans un tableau Mots) qui constituent comme vous les avez appelé des noeuds (ex: "cent", "six", "et un","quatre-vingt" ...)

    2- j'ai dresser une liste de tout les mots possibles pour écrire un nombre en lettres, voici le code en langage C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        char NomPart[7][10]={"dix","onze","douze","treize","quatorze","quinze","seize"}; 
        char NomUnite[9][10]={"un","deux","trois","quatre","cinq","six","sept","huit","neuf"}; 
        char NomDizaine[7][17]={"vingt","trente","quarante","cinquante","soixante","soixante-dix","quatre-vingt"}; 
        char NomSpe[3][7]={"cent","et un","mille"};
    je sais que je vais parcourir mon tableau Mots pour détecter la valeur de chaque mot,
    Mais comment faire pour calculer le nombre? j'avoue n'avoir aucune idée pour le moment.

  10. #10
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Le but est avant tout de comprendre comment est construit un chiffre.
    Prennons en un au hasard.... mettons 5342 (je ne tiens pas compte des cent/cents ou mille/milles)
    'Cinq' - *mille* - 'trois' - *cent* - 'quarante deux'

    Un autre, 595442 :
    'Cinq' - *cent* - 'quatre vingt quinze' - *mille* - 'quatre' - *cent* - 'quarante deux'.

    Et un ptit dernier 100001 :
    *Cent* - *mille* - 'un'

    On voit bien deux éléments distinct, ceux entre '', qui sont des nombres de 0 a 100, et ceux qui sont entre *, a savoir mille et cent.

    On voit également qu'ils se succedent. Sauf dans le dernier exemple me diras-tu, mais la aussi ils se succedent, simplement certains sont "muet" parce qu'égaux a 0.

    Bref, tu as ton schéma déjà écrit :
    x cent yy mille x cent yy

    Chacun de ces éléments peut valoir 0 et donc être muet. Tu vois ou je veux en venir ?
    Il faut d'abord que tu apprenent a séparer les blocs, comme j'ai fait avec mes '' et mes *.
    Les mot cent/mille sont des séparateur, et il faut faire attention au séparateur 'muet'. Mais commence avec un chiffre qui contient les séparateur.
    Tu te fait un tableau avec les bonnes valeur pour "x cent yy mille x cent yy"
    Tu remplace un a un, et a la fin, a partir de ton tableau, tu pourra facilement reconstruire ton chiffre avec un truc du genre :
    ((x*100 + yy) * 1000) + (x*100)+yy
    Bon, en vrai, ce sera un tout petit peu plus compliqué dans la mesure ou si x vaut zéro, mais le cent existe bien, il faut mettre 100 et pas 0, mais bon, c'est juste pour te faire sentir l'idée.

    Relis ce qu'a dit Graffito, ma décomposition n'est qu'une version simplifiée (et incomplete) de la sienne. Identifie tes éléments pour ce qu'il sont, c'est là la clef.

    --
    Rakken

  11. #11
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    Merci cher Rakken
    j'ai tres bien compris ton raisonements qui est tres raisonable.

    je vais travailler dans ce sens.

    merci à tous.

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

Discussions similaires

  1. Fonction de conversion de nombre en lettres
    Par david_chardonnet dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2021, 17h51
  2. Réponses: 6
    Dernier message: 24/12/2014, 20h45
  3. Réponses: 1
    Dernier message: 02/09/2014, 14h53
  4. écrire un nombre en lettre
    Par dibak dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 19/05/2004, 11h27
  5. Comment compter le nombre de lettre identique ?
    Par divableue dans le forum ASP
    Réponses: 3
    Dernier message: 07/11/2003, 15h01

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