Reputation: 21
I am writing a Python program that takes a string that is a two sided equation, "(equation) = (equation)", and solves the two sides by blacking out two characters that can be on either side, so that the equations solutions are equal to each other
So far I have this code, and I keep getting the error for any case that is not a one sided equation. Below is the full traceback:
Traceback (most recent call last):
File "C:/Users/rgade_000/Desktop/blackout.py", line 69, in <module>
main()
File "C:/Users/rgade_000/Desktop/blackout.py", line 65, in main
print("+11x4 =",compute("+11x4"), "(expect None)")
File "C:/Users/rgade_000/Desktop/blackout.py", line 22, in compute
temp_num_int = int(temp_num_str)
ValueError: invalid literal for int() with base 10: ''
I know this is a problem at the op == ""
statement, but I don't know how to fix it. The problem only occurs with any string equation that I try to use solve with, for instance with the main call
print("solving 288/24x6=18x13x8: ", solve("288/24x6=18x13x8"))
(The main function contains test cases)
def compute(exp):
"""
Takes a string representing an equation and computes the value
"""
temp_num_str = ""
temp_num_int = 0
op = ""
for ch in exp:
if ch.isdigit():
if temp_num_str == "":
temp_num_str = ch
else:
temp_num_str += ch
else:
if op == "":
op = ch
temp_num_int = int(temp_num_str)
else:
temp_num_int = eqs(temp_num_int, op, temp_num_str)
op = ch
temp_num_str = ""
return eqs(temp_num_int, op, temp_num_str)
def eqs(temp_num_int, op, temp_num_str):
if op == "+":
return temp_num_int + int(temp_num_str)
elif op == "-":
return temp_num_int - int(temp_num_str)
elif op == "x":
return temp_num_int * int(temp_num_str)
else:
return temp_num_int / int(temp_num_str)
def solve(eqn):
"""
Takes two sided equation and blacks out values so that the equations are equal
"""
for i in range(len(eqn)):
for j in range(i+1,len(eqn)):
if i != eqn.find('=') and j != eqn.find('='):
eqn_tmp = eqn[:i] + eqn[i+1:j]+eqn[j+1:]
if evaluate(eqn_tmp) == True:
return eqn_tmp
else:
print("No solution")
def evaluate(eqn):
"""
Evaluates a string of two sided equation and returns True if equal
"""
lt = eqn[:eqn.find('=')]
rt = eqn[eqn.find('=')+1:]
if (compute(lt) == compute(rt)):
return True
else:
return False
def main():
print("22-11x4 =", compute("22-11x4"), " (expect 44)")
print("+11x4 =",compute("+11x4"), "(expect None)")
print("22-11x4=7x5+9", evaluate("22-11x4=7x5+9"),"(expect True)")
print("solving 288/24x6=18x13x8: ", solve("288/24x6=18x13x8"))
main()
Upvotes: 2
Views: 139
Reputation: 14685
The error message is telling you that temp_num_str contains nothing at the time that you are trying to convert it to an integer.
temp_num_int = int(temp_num_str)
ValueError: invalid literal for int() with base 10: ''
The way to fix this is to put print statements every where you think you are assigning values to temp_num_str and find out where it does not get the value you expect, then fix up all the problems that this uncovers.
(Actually, reading the code, its clear at least one way this can go wrong: the first time you enter the loop
for ch in exp:
if ch.isdigit():
ch might be not a digit. This results in
else:
if op == "":
op = ch
temp_num_int = int(temp_num_str)
being executed before temp_num_str has had a value given to it by
if ch.isdigit():
if temp_num_str == "":
temp_num_str = ch
else:
temp_num_str += ch
)
Upvotes: 1