Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2872 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Validation d'un chiffre romain

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Validation d'un chiffre romain

n°699517
KamisamaHi
Posté le 14-04-2004 à 18:34:51  profilanswer
 

Je suis dans la conception d'un programme qui permet de jouer avec les chiffres romains et les chiffres arabes. Or, si quelqu'un entre un chiffre romain dans le programme, je dois valider que c'est un bon chiffre romain, pas juste un paquet de lettres...
 
Je suis bloqué en ce moment, car je ne vois pas comment je pourrais faire pour valider que les lettres entrées soient dans le bon ordre. Exemple, si on entre "CCXXI", c'est bon, ça donne 221, mais si on entre "CCXIX", se sont les mêmes lettres mais pas dans le bon ordre, donc c'est pas bon.
 
Voici ce que j'ai fait jusqu'à présent dans Visual Studio.NET 2003 en ce qui concerne la fonction de validation :
 
bool CRomain::IsValide(const CRomain &oRomain)
{
 bool bOk=true;
 int iNbM=0;
 int iNbD=0;
 int iNbC=0;
 int iNbL=0;
 int iNbX=0;
 int iNbV=0;
 int iNbI=0;
 
 for (int i=0; i < strlen(*this); i++)
 {
  (*this)[i]= toupper[i];
 }
 
 for (int i=0; i < strlen(*this[i]); i++)
 {
  if ((*this)[i] != 'M'||'D'||'C'||'L'||'X'||'V'||'I')
  {
   bOk=false;
  }
 }
 
 if (bOk)
 {
  for (int i=0; i < length(); i++)
  {
   if ((*this)[i] == 'M')
   {
    iNbM++;
   }
 
   if ((*this)[i] == 'D')
   {
    iNbD++;
   }
 
   if ((*this)[i] == 'C')
   {
    iNbC++;
   }
 
   if ((*this)[i] == 'L')
   {
    iNbL++;
   }
 
   if ((*this)[i] == 'X')
   {
    iNbX++;
   }
 
   if ((*this)[i] == 'V')
   {
    iNbV++;
   }
 
   if ((*this)[i] == 'I')
   {
    iNbI++;
   }
  }
 
  if (iNbM > 4 || iNbD > 1 || iNbC > 4 || iNbL > 1 || iNbX > 3 || iNbV > 1 || iNbI > 3)
  {
   bOk = false;
  }
 
 }
}
 
J'ai vérifié jusqu'à maintenant que les lettres ne se répètent pas plus du nombre maximal qu'elles le peuvent. Mon "toupper" n'est surement pas bon non plus parce qu'il me retourne une erreur, et mon strlen() non plus est pas bon. Bref, ça va pas très bien....

mood
Publicité
Posté le 14-04-2004 à 18:34:51  profilanswer
 

n°699526
pascal_
Posté le 14-04-2004 à 18:47:08  profilanswer
 

KamisamaHi a écrit :


Je suis bloqué en ce moment, car je ne vois pas comment je pourrais faire pour valider que les lettres entrées soient dans le bon ordre. Exemple, si on entre "CCXXI", c'est bon, ça donne 221, mais si on entre "CCXIX", se sont les mêmes lettres mais pas dans le bon ordre, donc c'est pas bon.


 
"CCXIX" c'est un chiffre valide non (219)?  
 
Quel est ton problème exactement. Tu créé un jeu ou il faut donner le chiffre romain à partir d'un décimal, tu voudrais valider le nombre rentré ?
 
Un peu comme ça :
http://www.chez.com/clio/rome/civil/numero.htm
http://www.chez.com/cvos/chiffresromains.htm

n°699528
KamisamaHi
Posté le 14-04-2004 à 18:53:58  profilanswer
 

Premièrement, excuse-moi d'avoir fourvoyer tout le monde avec mon exemple bidon.... CCXIX EST valide... Un meilleur exemple serait CCIXX où là il n'est pas valide, mais c'est les mêmes chiffres.
 
Deuxièmement, oui mon programme ressemble beaucoup à ce que tu viens de me montrer, mais dans le mien, on va pouvoir additionner ou soustraire des chiffres romains à d'autres chiffres romains...
 
Donc mon problème plus précisément est que je ne dois pas accepter "CCIXX" comme chiffre romain (parce qu'il n'est pas valide) mais je ne sais pas comment faire la vérification...
 
L'utilisateur doit pouvoir entrer OU un nombre entier OU un nombre romain et je fais les conversions nécessaires... Exemple il entre 2 nombres romains comme "XI" et "CXIX" et il veut les additionner. Je dois prendre "XI", le transformer en "11", puis "CXIX" et le transformer en "119", les additionner pour faire "130" et le retransformer pour faire "CXXX"....


Message édité par KamisamaHi le 14-04-2004 à 18:58:13
n°699547
pascal_
Posté le 14-04-2004 à 19:23:10  profilanswer
 

En fait il faudrait connaître la grammaire des chiffres romains.
 
En plus les deux sites que je t'ai donné ne donne pas les mêmes choses. Par exemple pour 48, l'un donne VLIII (50-5+3) et l'autre XLVIII (50-10+8) [:w3c compliant]  
 
Quel est le bon ? Je n'en sais rien. Moi j'aurais dis IIV  :whistle:  
 

n°699548
pascal_
Posté le 14-04-2004 à 19:25:55  profilanswer
 

Sur le premier site, il y a quand même une chose intéressante :
La numérotation romaine a été normalisée dans l'usage actuel et repose sur deux principes:
1) Toute lettre placée à la droite d'une autre figurant une valeur supérieure ou égale à la sienne s'ajoute à celle-ci.
2) Toute lettre placée à la gauche d'une autre lettre plus forte qu'elle, indique que le nombre qui lui correspond doit être retranché du nombre relatif à la seconde.
 

n°699551
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-04-2004 à 19:29:22  profilanswer
 

Finallement le binaire c'est pas si terrible quand on cherche bien ;)


---------------
Cordialement, Xterm-in'Hate...
n°699553
KamisamaHi
Posté le 14-04-2004 à 19:32:11  profilanswer
 

ok.. voici la vrai méthode :
 
1=I, 5=V, 10=X, 50=L, 100=C, 500=D et 1000=M (je ne vais pas plus haut que 3999)
 
Voici les règles :
1. Lorsque les symboles sont en ordre de poids, on ajoute la valeur des symboles afin d'obtenir l'équivalent en chiffre arable
Exemple : LXXXVI = 86 // DLVI = 556
 
2. Un symbole ne peut se répéter plus de 3 fois
Exemple : CLXIII = 163 // IIII = PAS BON
 
3. Seuls les symboles d'unités peuvent être répétés plusieurs fois (le I, X, C, M)
 
4. Quand un symbole de plus petit poids précède un symbole de plus grand poids, le premier se soustrait du 2e. Il ne peut y avoir qu'un seul symbole de plus petit poids devant un autre de poids plus grand. Seuls les symboles I,X,C peuvent précéder un symbole de poids plus grand
Exemples : LIV = 54 // XLII = 42 // IIX = PAS BON // VC = PAS BON
 
5. L'écart de poids ne peut être que de 1 ou 2 degrés
Exemples : CD = 400 // CM = 900 // IM ou ID = PAS DE SENS
 
Comme dit précédemment, je ne dépasse pas 3999, soit MMMCMXCIX (3000 = MMM, 900 = CM, 90 = XC, 9 = IX)...
 
Et donc 48 serait 40 (XL) + 8 (VIII), soit XLVIII...


Message édité par KamisamaHi le 14-04-2004 à 19:34:09
n°699619
pascal_
Posté le 14-04-2004 à 21:06:27  profilanswer
 

xterminhate a écrit :

Finallement le binaire c'est pas si terrible quand on cherche bien ;)


 
ouais, ils sont fous ces romains !
http://www.asterix-obelix.nl/images/home/intro-obelix.gif
 

n°701543
KamisamaHi
Posté le 17-04-2004 à 05:27:16  profilanswer
 

Bon et bien il s'est avéré que j'ai demandé à quelqu'un qui savait ce qu'il faisait de m'aider et il a répondu à mes questions... Mais merci quand même de m'avoir presque aidé !!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Validation d'un chiffre romain

 

Sujets relatifs
convertir chiffre en lettre Excel[XHTML] problème de validation d'un XHTML strict
Validation W3C avec "marginwidth="0"" dans <body>non validation d'un enregistrement (vb6)
validation de formulaire avec JSValidation d'un formulaire par un menu déroulant .[Help]
Validation d'un formulaire , a l'aide ![HTML/JS] Problème avec déplacement d'images et validation de position
validation[PHP] validation formulaire
Plus de sujets relatifs à : Validation d'un chiffre romain


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR