Reputation: 49
I am working on a roman number converter + roman number calculator project.
I am now stuck on the calculator part, because I cannot get the functions to return the values I need to continue.
The way I have done it is that I have defined a bunch of functions. This is the order I call them.
romanCalculator(number,operator)
This function takes the input number, say x+v. Devides them into 2 romen numbers, num1=x, num2=v.
These numbers are then separatly sent to romanValidation(num1)
This function checks if the input roman number is a real roman number and then sends them of to a third function romanTOarab(num1)
. This is where the problem starts.
romanTOarab(num1)
converts the roman number to an arab number, so num1=x would become 10. I want the romanTOarab(num1)
to return the value of num1 and num2 to the function romanCalculator(number,operator)
so that I within romanCalculator(number,operator)
can write somthing like:
num1Trans = romanValidation(num1)
num2Trans = romanValidation(num2)
And the should make the value of num1Trans = 10 and num2Trans = 5. However when I run my code and print num1Trans or num2Trans all I get is None.
How do I fix this?
Also, you have to excuse my english! :) Here is the code I wrote for all the functions mentioned.
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
Upvotes: 1
Views: 141
Reputation: 9967
Very simple fix, you just left out the return
in romanValidation
. The last line of this function should be changed from
romanTOarab(number)
to
return romanTOarab(number)
Upvotes: 2