Se connecter / S'enregistrer
Votre question

Aide 'Delphi' Chiffre romain convertisseur

Tags :
  • string
  • Programmation
Dernière réponse : dans Programmation
Anonyme
25 Novembre 2010 08:54:47

Bonjour,
je cherche a codé un convertisseur de chiffre romain en chiffre arable.
J'ai dejà essayer de le coder mais je bloc... un avis ? :) 

Merci d'avance.

Citation :
program Chiffre_romain_En_arabe;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
TabRom : array [1..31] of string = ('MMMM', 'MMM', 'MM', 'M', 'CM',
'DCCC', 'DCC', 'DC', 'D', 'CD', 'CCC', 'CC', 'C', 'XC', 'LXXX',
'LXX', 'LX', 'L', 'XL', 'XXX', 'XX', 'X', 'IX', 'VIII', 'VII', 'VI',
'V', 'IV', 'III', 'II', 'I');
TabArab : array [1..31] of integer =(4000,3000,2000,1000,900,800,700,600,
500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1);

ChaineValue : string;
i,res : integer;

begin

{Entrer value}
writeln('Entrer un chiffre romain : ');
readln(ChaineValue);

res:=0;

{ comparer la chaine string aux elements du tableau. Faire correspondre
au chiffre romain. A chaque comparaison correcte, on inplemente.}


for i := 1 to length(ChaineValue) do
begin

If (ChaineValue=TabRom) then res:= res + TabArab;

end;

{Sortir le resultat}
write('La solution est : ', res );

readln;
end.

Autres pages sur : aide delphi chiffre romain convertisseur

25 Novembre 2010 15:07:19

Bonjour,

Je me suis intéressé à ton idée de convertisseur, mais ton code est assez vide, alors j'ai réalisé une petite class (unit) :

  1. Unit uRomanNumber;
  2.  
  3. Interface
  4.  
  5. Uses System, SysUtils;
  6.  
  7. const
  8. BASIC_ROMAN : array[1..13] of String = ( 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I' ) ;
  9. BASIC_VALUES : array[1..13] of Integer = ( 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 );
  10.  
  11. type
  12. TRomanNumber = Class(TObject)
  13. // This Class represents a Roman numeral, it includes a conversion algorithm for Arabic characters
  14. private
  15. stValue : Integer;
  16. stRoman : String;
  17. procedure intToRoman;
  18. procedure romanToInt;
  19. public
  20. procedure setRoman(Val : String);
  21. function getRoman : String;
  22. procedure setValue(Val : Integer);
  23. function getValue : Integer;
  24. published
  25. constructor Create;
  26. constructor Create(Val : Integer);
  27. constructor Create(Val : String);
  28.  
  29. property ROMAN : String read getRoman write setRoman;
  30. property VALUE : Integer read getValue write setValue;
  31. end;
  32.  
  33. Implementation
  34.  
  35. Uses System, SysUtils;
  36.  
  37. constructor TRomanNumber.Create;
  38. begin
  39. end;
  40.  
  41. constructor TRomanNumber.Create(Val : Integer);
  42. begin
  43. stValue := Val;
  44. end;
  45.  
  46. constructor TRomanNumber.Create(Val : String);
  47. begin
  48. stRoman := Val;
  49. end;
  50.  
  51. procedure TRomanNumber.intToRoman;
  52. var
  53. remainder, i : Integer;
  54. begin
  55. If stRoman = nil Then
  56. begin
  57. stRoman := '';
  58. If stValue > 0 and stValue < 4000 Then
  59. begin
  60. remainder := setValue;
  61. For i := 1 to 13 do
  62. begin
  63. while remainder >= BASIC_VALUES[i] do
  64. begin
  65. stRoman = stRoman + BASIC_ROMAN[i];
  66. remainder = remainder - BASIC_VALUES[i];
  67. end;
  68. end;
  69. end;
  70. end;
  71. end;
  72.  
  73. procedure TRomanNumber.romanToInt;
  74. var
  75. r : String;
  76. index, i : Integer;
  77. begin
  78. r := AnsiUpperCase(stRoman);
  79. stValue := 0;
  80. index := 1;
  81. For i := 1 to 13 do
  82. begin
  83. While AnsiPos(BASIC_ROMAN[i], r) = index do
  84. begin
  85. stValue := stValue + BASIC_VALUES[i];
  86. index := index + Length(BASIC_ROMAN[i]);
  87. end;
  88. end;
  89. stRoman := r;
  90. end;
  91.  
  92. procedure TRomanNumber.setRoman(Val : String);
  93. begin
  94. stRoman := Val;
  95. end;
  96.  
  97. function TRomanNumber.getRoman : String;
  98. begin
  99. intToRoman;
  100. Result := stRoman;
  101. end;
  102.  
  103. procedure TRomanNumber.setValue(Val : Integer);
  104. begin
  105. stValue := Val;
  106. end;
  107.  
  108. function TRomanNumber.getValue : Integer;
  109. begin
  110. romanToInt;
  111. Result := stValue;
  112. end;
  113.  
  114. end.


Donc c'est une class (objet) pour Delphi, comment l'utiliser en "roman -> arabe" :

  1. Program pRomanTest;
  2. {$APPTYPE CONSOLE}
  3.  
  4. Uses SysUtils, uRomanNumber;
  5.  
  6. var
  7. roman : String;
  8. value : Integer;
  9. conve : TRomanNumber;
  10.  
  11. begin
  12. writeln('Entrer un chiffre romain : ');
  13. readln(roman);
  14.  
  15. conve := TRomanNumber.Create(roman)
  16. res := conve.VALUE;
  17.  
  18. write('La solution est : ', res );
  19. readln;
  20. end.


Voila, j'ai pas vérifié le fonctionnement, à toi de t'en inspirer.

Bonne journée
m
0
l
Anonyme
26 Novembre 2010 08:40:06

Merci bcp pour ton aide :D 
m
0
l
Contenus similaires
26 Novembre 2010 11:12:53

Ah parce que ça marche ?

(je suis trop fort ... j'ai aucun moyen de tester, et ça fonctionne ...)
m
0
l
Anonyme
26 Novembre 2010 11:22:17

ah non :D 

il ne fonctionne pas, mais j'ai appris pas mal de petit truc :) 

je continue d'y travailler ;)  j'avance :p 

je posterai la réponse une fois terminer ;) 
m
0
l
26 Novembre 2010 11:56:40

Je me disais aussi ... Ce serait trop beau qu'il fonctionne de suite.

Si t'as besoin de comprendre les méthodes utilisées etc. vas sur DelphiBasics (< clic).
m
0
l
Anonyme
3 Décembre 2010 09:34:40

Voila la solution ;) 
Citation :
program chiffre_romain_revert;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
insert : string; //nombre Romain
output : integer; //nombre arabe
car_run : integer; //caractère traité
cpt,cptfor : integer; //compteur
{tab_rom : array[0..12] of string =('M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I');}
{tab_val : array[0..12] of integer =(1000,900,500,400,100,90,50,40,10,9,5,4,1); }
nbr_rom : array [0..2,0..9] of string = (('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'),
('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'),
('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'));
exp : array [0..2] of integer = (1,10,100);

begin
try
Write('Quelle valeur transformer ? ');
Readln(insert);
insert:=uppercase(insert);

output:=0;
car_run:=1;
cpt:=9;

//1000
while insert[car_run]='M' do
begin
output:=output+1000;
car_run:=car_run+1;
end;


for cptfor := 2 downto 0 do
begin
writeln(cptfor);
while (cpt>=0) and (Copy(insert,car_run,Length(nbr_rom[cptfor,cpt])) <> nbr_rom[cptfor,cpt]) do
begin
dec(cpt);
end;
output:=output+(cpt*exp[cptfor]);
car_run:=car_run+length(nbr_rom[cptfor,cpt]);
cpt:=9;
end;

if (car_run>length(insert)) then
writeln(output)
else
writeln('Ce n est pas un chiffre romain');


except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
m
0
l
Contenus similaires
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS