Contributor: VARIOUS AUTHORS } From: BRIAN PAPE Subj: YEAR ( ROMAN ) This is from last semester's computer bowl. Only problem is that it converts from Roman to Arabic. :) LCCC Programming Team East Central College Computer Bowl 03-21-93 "Computer Killers" Brian Pape Brian Grammer Mike Lazar Christy Reed Matt Hayes Coach Steve Banjavcic Program #2-3 Time to Completion: 3:47 } program roman; USES PRINTER; const num = 'IVXLCDM'; value : array[1..7] of integer = (1,5,10,50,100,500,1000); var i : byte; s : string; sum : integer; begin assign(lst,'');rewrite(lst); writeln('Enter the Roman Numerals: '); readln(s); i := length(s); while (i>=1) do begin if i > 1 then begin if pos(s[i],num) <= (pos(s[i-1],num)) then begin sum := sum + value[pos(s[i],num)]; dec(i); end else begin sum := sum + value[pos(s[i],num)] - value[pos(s[i-1],num)]; dec(i,2); end; { else } end else begin sum := sum + value[pos(s[1],num)]; dec(i); end; { else } end; { while } WRITELN(LST); writeln(LST,'Roman numeral: ',s); writeln(LST,'Arabic value: ',sum); end. { } {* * * ROMAN.C - Converts integers to Roman numerals * * Written by: Jim Walsh * * Compiler : Microsoft QuickC v2.5 * * This Program Is Released To The Public Domain * * Additional Comments: * * Ported to TP v6.0 by Daniel Prosser. *} VAR Value, DValue, Error : INTEGER; Roman : STRING[80]; BEGIN Roman := ''; IF ParamCount = 2 THEN VAL(ParamStr(1), Value, Error) ELSE BEGIN Write ('Enter an integer value: '); ReadLn (Value); END; { ELSE } DValue := Value; WHILE Value >= 1000 DO BEGIN Roman := Roman + 'M'; Value := Value - 1000; END; { WHILE } IF Value >= 900 THEN BEGIN Roman := Roman + 'CM'; Value := Value - 900; END; { IF } WHILE Value >= 500 DO BEGIN Roman := Roman + 'D'; Value := Value - 500; END; { WHILE } IF Value >= 400 THEN BEGIN Roman := Roman + 'CD'; Value := Value - 400; END; { IF } WHILE Value >= 100 DO BEGIN Roman := Roman + 'C'; Value := Value - 100; END; { WHILE } IF Value >= 90 THEN BEGIN Roman := Roman + 'XC'; Value := Value - 90; END; { IF } WHILE Value >= 50 DO BEGIN Roman := Roman + 'L'; Value := Value - 50; END; { WHILE } IF Value >= 40 THEN BEGIN Roman := Roman + 'XL'; Value := Value - 40; END; { WHILE } WHILE Value >= 10 DO BEGIN Roman := Roman + 'X'; Value := Value - 10; END; { WHILE } IF Value >= 9 THEN BEGIN Roman := Roman + 'IX'; Value := Value - 9; END; { IF } WHILE Value >= 5 DO BEGIN Roman := Roman + 'V'; Value := Value - 5; END; { WHILE } IF Value >= 4 THEN BEGIN Roman := Roman + 'IV'; Value := Value - 4; END; { IF } WHILE Value > 0 DO BEGIN Roman := Roman + 'I'; DEC (Value); END; { WHILE } WriteLn (DValue,' = ', Roman); END. {--------------------- Begin of function -----------------------------} Function Roman (Number: Integer): String; { Converts Number to the Roman format. If (Number < 1) Or (Number > 3999), the returned string will be empty! } Var TempStr : String; { Temporary storage for the result string } Begin TempStr := ''; If (Number > 0) And (Number < 4000) Then Begin { One 'M' for every 1000 } TempStr := Copy ('MMM', 1, Number Div 1000); Number := Number MOD 1000; If Number >= 900 Then { Number >= 900, so append 'CM' } Begin TempStr := TempStr + 'CM'; Number := Number - 900; End Else { Number < 900 } Begin If Number >= 500 Then { Number >= 500, so append 'D' } Begin TempStr := TempStr + 'D'; Number := Number - 500; End Else If Number >= 400 Then { 400 <= Number < 500, so append 'CD' } Begin TempStr := TempStr + 'CD'; Number := Number - 400; End; { Now Number < 400!!! One 'C' for every 100 } TempStr := TempStr + Copy ('CCC', 1, Number Div 100); Number := Number Mod 100; End; If Number >= 90 Then { Number >= 90, so append 'XC' } Begin TempStr := TempStr + 'XC'; Number := Number - 90; End Else { Number < 90 } Begin If Number >= 50 Then { Number >= 50, so append 'L'} Begin TempStr := TempStr + 'L'; Number := Number - 50; End Else If Number >= 40 Then { 40 <= Number < 50, so append 'XL' } Begin TempStr := TempStr + 'XL'; Number := Number - 40; End; { Now Number < 40!!! One 'X' for every 10 } TempStr := TempStr + Copy ('XXX', 1, Number Div 10); Number := Number Mod 10; End; If Number = 9 Then { Number = 9, so append 'IX' } Begin TempStr := TempStr + 'IX'; End Else { Number < 9 } Begin If Number >= 5 Then { Number >= 5, so append 'V' } Begin TempStr := TempStr + 'V'; Number := Number - 5; End Else If Number = 4 Then { Number = 4, so append 'IV' } Begin TempStr := TempStr + 'IV'; Number := Number - 4; End; { Now Number < 4!!! One 'I' for every 1 } TempStr := TempStr + Copy ('III', 1, Number); End; End; Roman := TempStr; End;