/* *********************************************************************** * * * Convert Roman numerals to Arabic numerals or vice-versa. * * * * * *********************************************************************** */ address COMMAND parse arg in_number in_number = strip(in_number) say "===> Note: Since keyboards don't have the Roman symbols for" say " 5,000 and 10,000, the letters 'v' and 'x' (lowercase)" say " are substituted. The real symbols would look something" say " like this:" say " _ _" say " V for 5,000 and X for 10,000" say "" do forever if in_number = "" then do say "===> Please Enter a number in Arabic or Roman numerals, or", "Exit to leave." parse pull in_number end if translate(in_number) = "EXIT" then leave in_number = strip(in_number) arabic = datatype(in_number,"N") roman = verify(in_number,"IVXLCDMvx") Select When arabic Then call convert_to_roman When roman = 0 Then call convert_to_arabic When in_number = "?" Then call help Otherwise out_number = "===> Invalid number" in_number End say out_number in_number = "" end exit convert_to_arabic: out_number = 0 do while in_number <> "" parse var in_number first 2 second 3 rest Select When first = "M" & second = "x" Then do out_number = out_number + 9000 in_number = rest end When first = "M" & second = "v" Then do out_number = out_number + 4000 in_number = rest end When first = "C" & second = "M" Then do out_number = out_number + 900 in_number = rest end When first = "C" & second = "D" Then do out_number = out_number + 400 in_number = rest end When first = "X" & second = "C" Then do out_number = out_number + 90 in_number = rest end When first = "X" & second = "L" Then do out_number = out_number + 40 in_number = rest end When first = "I" & second = "X" Then do out_number = out_number + 9 in_number = rest end When first = "I" & second = "V" Then do out_number = out_number + 4 in_number = rest end When first = "x" Then do out_number = out_number + 10000 in_number = second || rest end When first = "v" Then do out_number = out_number + 5000 in_number = second || rest end When first = "M" Then do out_number = out_number + 1000 in_number = second || rest end When first = "D" Then do out_number = out_number + 500 in_number = second || rest end When first = "C" Then do out_number = out_number + 100 in_number = second || rest end When first = "L" Then do out_number = out_number + 50 in_number = second || rest end When first = "X" Then do out_number = out_number + 10 in_number = second || rest end When first = "V" Then do out_number = out_number + 5 in_number = second || rest end When first = "I" Then do out_number = out_number + 1 in_number = second || rest end Otherwise End end return convert_to_roman: out_number = "" do while in_number > 0 Select When in_number >= 10000 Then do out_number = out_number || "x" in_number = in_number - 10000 end When in_number >= 9000 Then do out_number = out_number || "Mx" in_number = in_number - 9000 end When in_number >= 5000 Then do out_number = out_number || "v" in_number = in_number - 5000 end When in_number >= 4000 Then do out_number = out_number || "Mv" in_number = in_number - 4000 end When in_number >= 1000 Then do out_number = out_number || "M" in_number = in_number - 1000 end When in_number >= 900 Then do out_number = out_number || "CM" in_number = in_number - 900 end When in_number >= 500 Then do out_number = out_number || "D" in_number = in_number - 500 end When in_number >= 400 Then do out_number = out_number || "CD" in_number = in_number - 400 end When in_number >= 100 Then do out_number = out_number || "C" in_number = in_number - 100 end When in_number >= 90 Then do out_number = out_number || "XC" in_number = in_number - 90 end When in_number >= 50 Then do out_number = out_number || "L" in_number = in_number - 50 end When in_number >= 40 Then do out_number = out_number || "XL" in_number = in_number - 40 end When in_number >= 10 Then do out_number = out_number || "X" in_number = in_number - 10 end When in_number >= 9 Then do out_number = out_number || "IX" in_number = in_number - 9 end When in_number >= 5 Then do out_number = out_number || "V" in_number = in_number - 5 end When in_number >= 4 Then do out_number = out_number || "IV" in_number = in_number - 4 end When in_number >= 1 Then do out_number = out_number || "I" in_number = in_number - 1 end Otherwise End end return help: say " Welcome to ROMAN EXEC." say "" say "ROMAN EXEC is a little programming toy to convert numbers from" say "Arabic numerals (123...) to Roman numerals (IVX...) and vice" say "versa." say "" say "The inspiration for this program was teaching my home-schooled" say "daughter Roman numerals, and wondering how difficult it would" say "be to write a program that would convert back and forth." say "It was not very difficult as it turns out." say "" say "Written by Peter Webb, January 6, 2005." out_number = "" return