我正在研究罗马数字转换器+罗马数字计算器项目。
我现在被困在计算器部分,因为我无法获得函数来返回我需要继续的值。
我这样做的方法是我定义了一堆函数。这是我称之为的顺序。
romanCalculator(number,operator)
此函数接受输入数字,例如x + v。将它们分为2个romen数,num1 = x,num2 = v。
然后将这些数字分别发送到romanValidation(num1)
此函数检查输入的罗马数字是否为真正的罗马数字,然后将它们发送给第三个函数romanTOarab(num1)
。这是问题开始的地方。
romanTOarab(num1)
将罗马数字转换为阿拉伯数字,因此num1 = x将变为10.我希望romanTOarab(num1)
将num1和num2的值返回到函数romanCalculator(number,operator)
所以我在romanCalculator(number,operator)
内可以写出如下内容:
num1Trans = romanValidation(num1)
num2Trans = romanValidation(num2)
并且应该使num1Trans = 10和num2Trans = 5的值。但是当我运行我的代码并打印num1Trans或num2Trans时,我得到的是无。
我该如何解决这个问题?
另外,你必须原谅我的英语! :) 这是我为所有提到的函数编写的代码。
def romanCalculator(number,operator):
number = number.replace(" ", "")
num1,num2 = number.split(operator)
num1Trans = romanValidation(num1)
num2Trans = romanValidation(num2)
print(num1, ":" ,num1Trans)
print(num2, ":" ,num2Trans)
print(operator)
def romanValidation(number):
i = 0
while i < len(number):
s = number[i]
if i < (len(number)-1): # Kollar så att det är fler än en bokstav.
if letterMap[s] < letterMap[number[i+1]]: # Kollar ifall bokstaven som ska analyseras är mindre än den efter.
temp = letterMap[number[i+1]] - letterMap[s] # Tar ut skillnaden mellan dem i värde.
control = temp / 10**(len(str(temp))-1) # Gör om skillnaden så att den alltid blir i storleksordning 10^0.
if control == 9.0 or control == 4.0: # Om kontrollen är ==9 eller ==4 så kommer bokstäverna i en giltig följd.
try:
temp = letterMap[number[i+2]] # Testar om det finns en tredje boskav efter den andra.
print(temp)
if letterMap[s] <= temp: # Testar om denna tredje boskatav är störren än den första,
print(SPACE,number,WRONG) # Om så är fallet är det inget giltigt tal.
print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
main()
except: # Om allt är som det ska hoppar vi över den andra bosktaven eftersom den nu också är analyserad.
pass
#i += 1
else:
print(SPACE,number,WRONG)
print("Skilladen mellan mellan en mindra siffra och en större siffrar får endast vara 4*10^x eller 9*10^x.")
main()
elif letterMap[s] == letterMap[number[i+1]]: # Testar om följaden bosktav är av samma storlek som den som analyseras.
i += 1 # Hoppar en boskatav fram i talet.
temp = letterMap[s]
if temp == 5 or temp == 50 or temp == 500:
print(SPACE,number,WRONG)
print("Romerska tecknena V, L och D får inte komma som 2 likada i följd. (ex: VV eller DD.)")
main()
try:
temp = letterMap[number[i+1]] # Testar om det är 3 likadan bokstäver i följd.
if letterMap[s] == letterMap[number[i+1]]:
i += 1
elif letterMap[s] < temp: # Testar om denna tredje boskatav är störren än den första,
print(SPACE,number,WRONG) # Om så är fallet är det inget giltigt tal.
print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
main()
except:
pass
try:
temp = letterMap[number[i+1]] # Testar om det kommer 4 likadana boksträver i följd.
if letterMap[s] == letterMap[number[i+1]]:
print(SPACE,number,WRONG)
print("Ett romerskt tal kan max innehålla samma tecken 3 gånger på rad.")
main()
elif letterMap[s] < temp: # Testar om denna tredje boskatav är störren än den första,
print(SPACE,number,WRONG) # Om så är fallet är det inget giltigt tal.
print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
main()
except:
pass
i += 1
romanTOarab(number)
def romanTOarab(number):
total = 0
i = 0
while i < len(number):
s = number[i]
if i < (len(number)-1): # För att kunna köra tal som bara innehåller ett tecken.
if letterMap[s] < letterMap[number[i+1]]: # Kollar när ett mindre tal är följt av ett större (IV = 5-1 = 4)
total += (letterMap[number[i+1]] - letterMap[s])
i += 1 # Eftersom att denna sats kollar 2 tecken på samma gång så hopper vi över det andra.
else:
total += letterMap[s] # Alla andra tecken är bara att rakt översätta och lägga på totalen.
else:
total += letterMap[s] # När det bara är ett tal som ska översättas.
i += 1
print("Resultat:",total)
return total
答案 0 :(得分:2)
非常简单的修复,您刚刚遗漏了return
中的romanValidation
。应该从
romanTOarab(number)
到
return romanTOarab(number)