Validation d'un chiffre romain

Validation d'un chiffre romain - C++ - Programmation

Marsh Posté le 14-04-2004 à 18:34:51    

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....

Reply

Marsh Posté le 14-04-2004 à 18:34:51   

Reply

Marsh Posté le 14-04-2004 à 18:47:08    

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

Reply

Marsh Posté le 14-04-2004 à 18:53:58    

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
Reply

Marsh Posté le 14-04-2004 à 19:23:10    

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:  
 

Reply

Marsh Posté le 14-04-2004 à 19:25:55    

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.
 

Reply

Marsh Posté le 14-04-2004 à 19:29:22    

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


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 14-04-2004 à 19:32:11    

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
Reply

Marsh Posté le 14-04-2004 à 21:06:27    

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
 

Reply

Marsh Posté le 17-04-2004 à 05:27:16    

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é !!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed