如何将 Python 整数转换为罗马数字,反之亦然?
How to convert Python Integer to Roman Numeral and vice-versa?
我正在尝试编写一个 Python 程序,它接受整数作为输入并显示等效的罗马数字,反之亦然。该程序应该用 OOP 编写。我现在有 class 的结构及其方法,但我无法执行转换,有人知道使用 OOP 解决我的问题的好方法吗?这是我在 Python 学习科学计算的过程中布置的作业。我对您可能拥有的其他好的方法持开放态度,只要它在 OOP 中,就可以遵循并满足下面给定的测试用例。
重要要求:
MAX VALUE IS 5000,应该只接受整数值。提供
必要的错误处理。
转换应该接受大写和小写输入。
输出后,程序应该return到菜单选项。
见
Roman Numerals Table
import sys
class Convert:
"""Accepts integer as input and display
the equivalent roman numeral and vice-versa.
"""
def __int__(self, user_input):
"""Initialize attributes."""
self.user_input = user_input
def int_to_roman(self):
"""Convert integer input to roman."""
pass
def roman_to_int(self):
"""Convert roman input to integer."""
pass
# Main Menu
def main():
print("\nMENU")
print("[1] Convert an Integer to a Roman Numeral")
print("[2] convert a Roman Numeral to an Integer")
print("[3] exit")
while True:
main()
choice = eval(input("\nEnter your choice: "))
if choice == 1:
# call int_to_roman() method
# after output, return to main()
pass
elif choice == 2:
# call roman_to_int() method
# after output, return to main()
pass
elif choice == 3:
sys.exit()
**TEST CASE 1**
MENU
[1] Convert an Integer to a Roman Numeral
[2] Convert a Roman Numeral to an Integer
[3] exit
Enter your choice: 1
Enter Integer: 1
Output in Roman Numeral is: I
Enter Integer: 3000
Output in Roman Numeral is: MMM
------------------------------------
**TEST CASE 2**
Enter your choice: 2
Enter Roman Numeral: MMM
Output in Integer is: 3000
Enter Roman Numeral: I
Output in Integer is: 1
这是我对此的 OOP 方法的看法。
我们有一个 class 数字,可以用 3 种方式之一构造。使用普通 int、int 的字符串表示或罗马数字。
值的内部表示被转换为普通 int。
用户可以使用 class 的 asInteger() 和 asRoman() 函数将 class 的值检索为 int 或罗马数字。这些方法不受 class 构造方式的影响。
用户可以使用普通 int 或数字的其他实例执行加法或减法 class。
使用示例如下代码:
class Number:
control = [
(1000, 'M', 1),
(900, 'CM', 2),
(500, 'D', 1),
(400, 'CD', 2),
(100, 'C', 1),
(90, 'XC', 2),
(50, 'L', 1),
(40, 'XL', 2),
(10, 'X', 1),
(9, 'IX', 2),
(5, 'V', 1),
(4, 'IV', 2),
(1, 'I', 1)]
def __init__(self, value):
if isinstance(value, int):
self.value = value
elif value.isdigit():
self.value = int(value)
else:
self.value = self._toInteger(value)
if value != self.toRoman(self.value):
raise ValueError('Not a valid Roman numeral')
def asInteger(self):
return self.value
def asRoman(self):
return self.toRoman(self.value)
def toRoman(self, num):
if num == 0:
return ''
for v, c, _ in Number.control:
if num >= v:
return c + self.toRoman(num-v)
def _toInteger(self, num):
result, offset = 0, 0
for c, r, l in Number.control:
while num[offset:].startswith(r):
result += c
offset += l
return result
def __add__(self, o):
if isinstance(o, Number):
self.value += o.value
elif isinstance(o, int):
self.value += o
else:
raise ValueError
return self
def __sub__(self, o):
if isinstance(o, Number):
self.value -= o.value
elif isinstance(o, int):
self.value -= o
else:
raise ValueError
return self
n = Number('MCMI')
m = Number(5)
print(n.asRoman())
n += m
print(n.asRoman())
m = 4
n -= m
print(n.asRoman())
输出:
MCMI
MCMVI
MCMII
我正在尝试编写一个 Python 程序,它接受整数作为输入并显示等效的罗马数字,反之亦然。该程序应该用 OOP 编写。我现在有 class 的结构及其方法,但我无法执行转换,有人知道使用 OOP 解决我的问题的好方法吗?这是我在 Python 学习科学计算的过程中布置的作业。我对您可能拥有的其他好的方法持开放态度,只要它在 OOP 中,就可以遵循并满足下面给定的测试用例。
重要要求:
MAX VALUE IS 5000,应该只接受整数值。提供 必要的错误处理。
转换应该接受大写和小写输入。
输出后,程序应该return到菜单选项。
见 Roman Numerals Table
import sys
class Convert:
"""Accepts integer as input and display
the equivalent roman numeral and vice-versa.
"""
def __int__(self, user_input):
"""Initialize attributes."""
self.user_input = user_input
def int_to_roman(self):
"""Convert integer input to roman."""
pass
def roman_to_int(self):
"""Convert roman input to integer."""
pass
# Main Menu
def main():
print("\nMENU")
print("[1] Convert an Integer to a Roman Numeral")
print("[2] convert a Roman Numeral to an Integer")
print("[3] exit")
while True:
main()
choice = eval(input("\nEnter your choice: "))
if choice == 1:
# call int_to_roman() method
# after output, return to main()
pass
elif choice == 2:
# call roman_to_int() method
# after output, return to main()
pass
elif choice == 3:
sys.exit()
**TEST CASE 1**
MENU
[1] Convert an Integer to a Roman Numeral
[2] Convert a Roman Numeral to an Integer
[3] exit
Enter your choice: 1
Enter Integer: 1
Output in Roman Numeral is: I
Enter Integer: 3000
Output in Roman Numeral is: MMM
------------------------------------
**TEST CASE 2**
Enter your choice: 2
Enter Roman Numeral: MMM
Output in Integer is: 3000
Enter Roman Numeral: I
Output in Integer is: 1
这是我对此的 OOP 方法的看法。
我们有一个 class 数字,可以用 3 种方式之一构造。使用普通 int、int 的字符串表示或罗马数字。
值的内部表示被转换为普通 int。
用户可以使用 class 的 asInteger() 和 asRoman() 函数将 class 的值检索为 int 或罗马数字。这些方法不受 class 构造方式的影响。
用户可以使用普通 int 或数字的其他实例执行加法或减法 class。
使用示例如下代码:
class Number:
control = [
(1000, 'M', 1),
(900, 'CM', 2),
(500, 'D', 1),
(400, 'CD', 2),
(100, 'C', 1),
(90, 'XC', 2),
(50, 'L', 1),
(40, 'XL', 2),
(10, 'X', 1),
(9, 'IX', 2),
(5, 'V', 1),
(4, 'IV', 2),
(1, 'I', 1)]
def __init__(self, value):
if isinstance(value, int):
self.value = value
elif value.isdigit():
self.value = int(value)
else:
self.value = self._toInteger(value)
if value != self.toRoman(self.value):
raise ValueError('Not a valid Roman numeral')
def asInteger(self):
return self.value
def asRoman(self):
return self.toRoman(self.value)
def toRoman(self, num):
if num == 0:
return ''
for v, c, _ in Number.control:
if num >= v:
return c + self.toRoman(num-v)
def _toInteger(self, num):
result, offset = 0, 0
for c, r, l in Number.control:
while num[offset:].startswith(r):
result += c
offset += l
return result
def __add__(self, o):
if isinstance(o, Number):
self.value += o.value
elif isinstance(o, int):
self.value += o
else:
raise ValueError
return self
def __sub__(self, o):
if isinstance(o, Number):
self.value -= o.value
elif isinstance(o, int):
self.value -= o
else:
raise ValueError
return self
n = Number('MCMI')
m = Number(5)
print(n.asRoman())
n += m
print(n.asRoman())
m = 4
n -= m
print(n.asRoman())
输出:
MCMI
MCMVI
MCMII