123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- # **************************************************************************** #
- # #
- # ::: :::::::: #
- # main.py :+: :+: :+: #
- # +:+ +:+ +:+ #
- # By: mazimi <mazimi@student.42.fr> +#+ +:+ +#+ #
- # +#+#+#+#+#+ +#+ #
- # Created: 2015/04/22 13:13:05 by mazimi #+# #+# #
- # Updated: 2015/09/29 13:06:23 by mazimi ### ########.fr #
- # #
- # **************************************************************************** #
- import sys
- import re
- def ft_sqrt (n):
- a = 1
- for i in range(0, 10):
- a = 0.5 * (a + n / a)
- return (a)
- def sign(a):
- if a >= 0: print("+", end = " ")
- def print_d(n):
- print("{0:.3f}".format(round(n, 3)), end = " ")
- def wrong_degree():
- print ("Je ne sait pas résoudre les équations de degré polynomial différent de un et deux.")
- exit()
- def cond_X0(eq, i):
- if eq[i - 1] != "^" and "0" <= eq[i] and eq[i] <= "9":
- return (1)
- def parse (str):
- i = 0
- while (i < len(str) - 2):
- if cond_X0(str, i) and str[i + 1] == " " and str[i + 2] != "*":
- a = str[:i + 1]; b = str[i + 1:]; s = "";
- seq = a, " * X^0", b; str = s.join(seq)
- i = i + 1
- if cond_X0(str, len(str) - 1):
- seq = str, " * X^0"; str = s.join(seq)
- if str[0] == "X": seq = "1 * ", str; str = s.join(seq)
- if str[len(str) - 1] == "X":
- a = str[:len(str) - 1]; seq = a, "1 * X^1"; str = s.join(seq)
- str = str.replace("X ", "X^1 "); str = str.replace("+ X^", "+ 1 * X^")
- str = str.replace("- X^", "- 1 * X^"); str = str.replace("= X^", "= 1 * X^")
- eq1, eq2 = str.split("=")
- eq1 = re.split('(\-*\s*[\.0-9]*)\s\*\sX\^(\-*[0-9\.]*)', eq1)
- eq2 = re.split('(\-*\s*[\.0-9]*)\s\*\sX\^(\-*[0-9\.]*)', eq2)
- eq = re.split('(\-*\s*[\.0-9]*)\s\*\sX\^(\-*[0-9\.]*)', str)
- strp = str
- return (strp, eq, eq1, eq2)
- def get_degree(eq):
- degree = 1
- for i in range(2, len(eq), 3):
- d = float(eq[i])
- if (d != 0 and d != 1 and d != 2 and d != 3): wrong_degree()
- if degree < d: degree = d
- return (degree)
- def get_coef(eq1, eq2, degree):
- a, b, c, d = 0, 0, 0, 0
- if degree == 3:
- for i in range(2, len(eq1), 3):
- if eq1[i] == "3": d2 = eq1[i - 1]; d = d + float(d2.replace(" ", ""))
- for i in range(2, len(eq2), 3):
- if eq2[i] == "3": d2 = eq2[i - 1]; d = d - float(d2.replace(" ", ""))
- if d == 0: degree = 2
- else: wrong_degree()
- if degree == 2:
- for i in range(2, len(eq1), 3):
- if eq1[i] == "0": c2 = eq1[i - 1]; c = c + float(c2.replace(" ", ""))
- if eq1[i] == "1": b2 = eq1[i - 1]; b = b + float(b2.replace(" ", ""))
- if eq1[i] == "2": a2 = eq1[i - 1]; a = a + float(a2.replace(" ", ""))
- for i in range(2, len(eq2), 3):
- if eq2[i] == "0": c2 = eq2[i - 1]; c = c - float(c2.replace(" ", ""))
- if eq2[i] == "1": b2 = eq2[i - 1]; b = b - float(b2.replace(" ", ""))
- if eq2[i] == "2": a2 = eq2[i - 1]; a = a - float(a2.replace(" ", ""))
- if a == 0: return (1, b, c, 0)
- return (degree, a, b, c)
- if degree == 1:
- for i in range(2, len(eq1), 3):
- if eq1[i] == "0": b2 = eq1[i - 1]; b = b + float(b2.replace(" ", ""))
- if eq1[i] == "1": a2 = eq1[i - 1]; a = a + float(a2.replace(" ", ""))
- for i in range(2, len(eq2), 3):
- if eq2[i] == "0": b2 = eq2[i - 1]; b = b - float(b2.replace(" ", ""))
- if eq2[i] == "1": a2 = eq2[i - 1]; a = a - float(a2.replace(" ", ""))
- if a == 0: return (0, b, 0, 0)
- return (degree, a, b, 0)
- if degree == 0:
- for i in range(2, len(eq1), 3): a2 = eq1[i - 1]; a = a + float(a2.replace(" ", ""))
- for i in range(2, len(eq2), 3): a2 = eq2[i - 1]; a = a - float(a2.replace(" ", ""))
- return (0, a, 0, 0)
- def display(str, a, b, c, degree):
- print("Équation :", str)
- print ("\nÉquation réduite :")
- if degree == 0: print(a, "= 0\nÉquation fausse."); exit()
- if degree == 1:
- print (a, "X", end = " "); sign(b); print(b, " = 0\naX + b = 0")
- if degree == 2:
- print (a, "X²", end = " "); sign(b); print(b, "X", end = " "); sign(c);
- print (c, "= 0\naX² + bX + c = 0")
- print ("Équation de degré polynomial", end = " "); print(int(degree), "\n")
- def solve_degree_2(a, b, c):
- delta = b**2 - 4 * a * c
- print ("Calcul du discriminant :\nΔ = b² - 4ac\nΔ =", end = " ")
- print (b, "² - 4 ×", a, "×", c, "\nΔ =", delta)
- alpha = -b / (2 * a)
- if delta > 0:
- beta = ft_sqrt(delta) / (2 * a)
- print ("Dicriminant scritement positif.\n\nCalcul des solutions :")
- print (" -b + √Δ\nX1 = ——————— =", end = " "); print_d(alpha + beta)
- print("\n 2 × a\n\n -b - √Δ\nX2 = ——————— =", end = " ")
- print_d(alpha - beta); print("\n 2 × a")
- if delta == 0:
- print ("Discriminant nul.\n\nCalcul des solution :")
- print (" -b\nX = ——————— =", alpha, "\n 2 × a")
- if delta < 0:
- print ("Discriminant négatif.\n\nCalcul des solutions :")
- xi = ft_sqrt(-delta) / (2 * a)
- print (" -b + i × √-Δ\nX1 = ————————————— =", end = " "); print_d(alpha)
- sign(a); print_d (xi); print("× i\n 2 × a\n")
- print (" -b - i × √-Δ\nX2 = ————————————— =", end = " "); print_d(alpha)
- if a <= 0: print("+", end = " ")
- print_d (-xi); print ("× i\n 2 × a")
- if __name__ == '__main__':
- if len(sys.argv) != 2: print("Entrez l’équation à résoudre."); exit()
- str = sys.argv[1]
- strp, eq, eq1, eq2 = parse(str)
- degree = get_degree(eq)
- degree, a, b, c = get_coef(eq1, eq2, degree)
- display(str, a, b, c, degree)
- if (degree == 1):
- print ("Solution :\n -b\nX = ——— =", end = " ");
- print_d(-b / a); print("\n a")
- if (degree == 2): solve_degree_2(a, b, c)
|