diff --git a/main.py b/main.py index 40ebab4..a180960 100644 --- a/main.py +++ b/main.py @@ -1,45 +1,227 @@ from nessesary.matrix import Matrix +from nessesary.parser.parser import insert_mul_sign +from nessesary.polynomial import Polynomial +from nessesary.fraction import to_fraction from file_read_write import * +from nessesary.equation.processing import change_side, poly_expand, simplify import ast -print("Algebraic And Matrix Solving tools.") +print("Calculator-for-Matrix-and-Algebra") print("===================================") -print("===============Guide===============") - line_count = 1 while True: command = input(f"[{line_count}]: ") - - brac_index = command.find("[") - if brac_index != -1: - todo = command[:brac_index] - expr = command[brac_index+1:-1] - - else: - if command.lower() in ["q", "quit", "quits"]: - break - elif command == "delete history": - delete() + try: + brac_index = command.find("[") + if brac_index != -1: + todo = command[:brac_index] + expr = command[brac_index+1:-1] + temp1 = '' + for i in expr: + if i == " ": + temp1 += "" + else: + temp1 += i + expr = temp1 + else: + if command.lower() in ["q", "quit", "quits"]: + break + elif 'clear' in command: + clear() + line_count += 1 + continue + elif 'delete' in command: + delete() + line_count += 1 + continue + if "histo" in command: + read_history() + line_count += 1 + continue + todo.lower() + except: + print("Invaid input. Please enter the input expression again.") + command = None + line_count += 1 + continue if "solve" in todo.lower(): - pass + if "=" not in expr: + try: + val = ast.literal_eval(expr) + poly = Polynomial(val) + except: + poly = Polynomial(expr) + + elif "=" in expr: + new_expr = change_side(expr) + try: + poly = Polynomial(new_expr) + except: + sim_result = poly_expand(new_expr) + poly = Polynomial(sim_result) + + print(f"Input: {expr}") + print("="*(21+len(poly.to_str()))) + try: + result_list = poly.solve() + collected_answer = [] + counting = 1 + print(f"Solution to {expr}") + for data in result_list: + if data["imag"] == 0: + ans = data["real"] + else: + if data["imag"] < 0: + ans = str(data["real"]) + "" + str(data["imag"]) + "i" + else: + ans = str(data["real"]) + "+" + str(data["imag"]) + "i" + try: + print(f"Answer #{counting}: x = {ans} | x = {to_fraction(ans, reduce=True)}") + except: + print(f"Answer #{counting}: x = {ans}") + collected_answer.append(ans) + counting += 1 + print("="*(21+len(poly.to_str()))) + write_command(todo, poly.to_str(), collected_answer) + except ValueError: + print("Can't find solution to this expression.(Program can only find solution up too 2nd degree polynomial)") + write_command(todo, poly.to_str(), "") + pass + + + elif "poly" in todo.lower(): + try: + val = ast.literal_eval(expr) + poly = Polynomial(val) + except: + poly = Polynomial(expr) + + print(f"Input Polynoimial: {expr}") + print("="*(21+len(poly.to_str()))) + try: + result_list = poly.solve() + collected_answer = [] + counting = 1 + print(f"Solution to {expr} = 0") + for data in result_list: + if data["imag"] == 0: + ans = data["real"] + else: + if data["imag"] < 0: + ans = str(data["real"]) + "" + str(data["imag"]) + "i" + else: + ans = str(data["real"]) + "+" + str(data["imag"]) + "i" + try: + print(f"Answer #{counting}: x = {ans} | x = {to_fraction(ans, reduce=True)}") + except: + print(f"Answer #{counting}: x = {ans}") + collected_answer.append(ans) + counting += 1 + print("="*(21+len(poly.to_str()))) + write_command(todo, poly.to_str(), collected_answer) + except ValueError: + print("Can't find solution to this expression.(Program can only find solution up too 2nd degree polynomial)") + write_command(todo, poly.to_str(), "") + pass + + elif "eval" in todo.lower(): + try: + expr = insert_mul_sign(expr) + result = eval(expr) + print(f"Result: {result}") + except: + raise ValueError("Error Occur!") elif "matrix" in todo.lower(): - val = ast.literal_eval(expr) - m1 = Matrix(val) + colleted_dict = {} + try: + val = ast.literal_eval(expr) + m1 = Matrix(val) + except: + print("invalid input.") + line_count += 1 + continue print(f"Input Matrix: {m1}") try: print(f"Determinant: {m1.determinant()}") + colleted_dict["det"] = m1.determinant() except: print(f"No determinant for {m1.row}x{m1.column} Matrix") + colleted_dict["det"] = "" t_matrix = m1.tranpose() print(f"Tranpose Matrix: {t_matrix}") + colleted_dict["tranpose"] = str(t_matrix) + try: + inv = m1.inverse() + print(f"Inverse Matrix: {inv}") + print("NOTE: inverse of matrix 3x3 4x4 ... is not the precise but 2x2 is precise.") + colleted_dict["inverse"] = str(inv) + except: + print(f"Can't evaluate inverse of this matrix") + colleted_dict["inverse"] = "" + elif "det" in todo.lower(): - pass - - if brac_index != -1: - save_dict = {todo:expr} - read_write_command(save_dict) + try: + val = ast.literal_eval(expr) + m1 = Matrix(val) + except: + print("invalid input.") + line_count += 1 + continue + try: + print(f"Determinant: {m1.determinant()}") + write_command(todo, str(m1), m1.determinant()) + except: + print(f"No determinant for {m1.row}x{m1.column} Matrix") + write_command(todo, str(m1), "") - line_count += 1 \ No newline at end of file + elif "inverse" in todo.lower(): + try: + val = ast.literal_eval(expr) + m1 = Matrix(val) + except: + print("invalid input.") + line_count += 1 + continue + try: + inv = m1.inverse() + print(f"Inverse Matrix: {inv}") + print("NOTE: inverse of matrix 3x3 4x4 ... is not the precise but 2x2 is precise.") + write_command(todo, str(m1), str(inv)) + except: + print(f"Can't evaluate inverse of this matrix") + write_command(todo, str(m1), "") + + elif "tranpose" in todo.lower(): + try: + val = ast.literal_eval(expr) + m1 = Matrix(val) + except: + print("invalid input.") + line_count += 1 + continue + try: + tran = m1.tranpose() + print(f"Tranpose Matrix: {tran}") + write_command(todo, str(m1), tran) + except: + print(f"Error Occur! Please enter input again!") + write_command(todo, str(m1), "") + + elif "sim" in todo.lower(): + try: + print(f"Result of Simplify: {poly_expand(expr)}") + write_command(todo, str(m1), poly_expand(expr)) + except: + try: + pass + except: + print("Can't simplify this expression.(maybe too many nested parentheless or Error in program.)") + write_command(todo, str(m1), "") + + line_count += 1 + command = None + todo = None + expr = None