89 lines
1.7 KiB
Python
89 lines
1.7 KiB
Python
"""
|
|
Create a calculator program for rational numbers with the following functionalities:
|
|
+ add a rational number to the calculator
|
|
u undo the last operation
|
|
x exit
|
|
"""
|
|
from math import gcd
|
|
|
|
|
|
# ----------------------#
|
|
# Non-UI functions here #
|
|
# ----------------------#
|
|
|
|
def create_q(num, den: int = 1):
|
|
"""
|
|
Create Rational number
|
|
:param num:
|
|
:param den:
|
|
:return: The number, or None if number is invalid
|
|
"""
|
|
if den == 0:
|
|
return None
|
|
# return [num, den]
|
|
return {"num": num, "den": den}
|
|
|
|
|
|
def get_num(q):
|
|
# return q[0]
|
|
return q["num"]
|
|
|
|
|
|
def get_den(q):
|
|
# return q[1]
|
|
return q["den"]
|
|
|
|
|
|
def add_q(q1, q2):
|
|
num = get_num(q1) * get_den(q2) + get_num(q2) * get_den(q1)
|
|
den = get_den(q1) * get_den(q2)
|
|
g = gcd(num, den)
|
|
return create_q(num // g, den // g)
|
|
|
|
|
|
def to_str(q):
|
|
if get_den(q) == 1:
|
|
return str(get_num(q))
|
|
return str(get_num(q)) + "/" + str(get_den(q))
|
|
|
|
|
|
# -----------------------#
|
|
# Only UI functions here #
|
|
# -----------------------#
|
|
|
|
def add_rational(total):
|
|
num = int(input("enter numerator:"))
|
|
den = int(input("enter denominator:"))
|
|
|
|
q = create_q(num, den)
|
|
if q is None:
|
|
print("Invalid rational number")
|
|
return
|
|
|
|
return add_q(q, total)
|
|
|
|
|
|
def print_menu():
|
|
print("+ add a rational number to the calculator")
|
|
print("u undo the last operation")
|
|
print("x exit")
|
|
|
|
|
|
def start():
|
|
total = create_q(0)
|
|
while True:
|
|
print_menu()
|
|
print("Total: " + to_str(total))
|
|
opt = input(">")
|
|
|
|
if opt == "+":
|
|
total = add_rational(total)
|
|
elif opt == "x":
|
|
break
|
|
else:
|
|
print("Bad user option")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
start()
|