[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
{
ú Subject: Word to Roman Numeral
OK, here is my second attempt, With error checking and all. Thanks to
Terry Moore <T.Moore@massey.ac.nz> For encouraging me. The last Function
also contained a couple of errors. This one is errorchecked.
}
Function RomantoArabic(Roman : String) : Integer;
{ Converts a Roman number to its Integer representation }
{ Returns -1 if anything is wrong }
Function Valueof(ch : Char) : Integer;
begin
Case ch of
'I' : Valueof:=1;
'V' : Valueof:=5;
'X' : Valueof:=10;
'L' : Valueof:=50;
'C' : Valueof:=100;
'D' : Valueof:=500;
'M' : Valueof:=1000;
else Valueof:=-1;
end;
end; { Valueof }
Function AFive(ch : Char) : Boolean; { Returns True if ch = 5,50,500 }
begin
AFive:=ch in ['V','L','D'];
end; { AFive }
Var
Position : Byte;
TheValue, CurrentValue : Integer;
HighestPreviousValue : Integer;
begin
Position:=Length(Roman); { Initialize all Variables }
TheValue:=0;
HighestPreviousValue:=Valueof(Roman [Position]);
While Position > 0 do
begin
CurrentValue:=Valueof(Roman [Position]);
if CurrentValue<0 then
begin
RomantoArabic:=-1;
Exit;
end;
if CurrentValue >= HighestPreviousValue then
begin
TheValue:=TheValue+CurrentValue;
HighestPreviousValue:=CurrentValue;
end
else
begin { if the digit precedes something larger }
if AFive(Roman [Position]) then
begin
RomantoArabic:=-1; { A five digit can't precede anything }
Exit;
end;
if HighestPreviousValue div CurrentValue > 10 then
begin
RomantoArabic:=-1; { e.g. 'XM', 'IC', 'XD'... }
Exit;
end;
TheValue:=TheValue-CurrentValue;
end;
Dec(Position);
end;
RomantoArabic:=TheValue;
end; { RomantoArabic }
begin
Writeln('XXIV = ', RomantoArabic('XXIV'));
Writeln('DXIV = ', RomantoArabic('DXIV'));
Writeln('CXIV = ', RomantoArabic('CXIV'));
Writeln('MIXC = ', RomantoArabic('MIXC'));
Writeln('MXCIX = ', RomantoArabic('MXCIX'));
Writeln('LXVIII = ', RomantoArabic('LXVIII'));
Writeln('MCCXXIV = ', RomantoArabic('MCCXXIV'));
Writeln('MMCXLVI = ', RomantoArabic('MMCXLVI'));
Readln;
end.
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]