Как сделать что бы при вводе уравнения оно превращалось в числа
У меня есть программа, которая решает уравнения типа c = k * x + b, где c, K и b пользователь выбирает сам.
Сейчас этот выбор выглядит примерно вот так:
words = " Выберите c"
for char in words:
sleep(0.05)
sys.stdout.write(char)
sys.stdout.flush()
c = int(input("\n "))
words = " Выберите k"
for char in words:
sleep(0.05)
sys.stdout.write(char)
sys.stdout.flush()
k = int(input("\n "))
words = " Выберите b"
for char in words:
sleep(0.05)
sys.stdout.write(char)
sys.stdout.flush()
b = int(input("\n "))
Но я бы хотел, чтобы пользователь вводил, например, 10 = 4 * x + 6 и переменные получали значения типа c = 10, K = 4, b = 6. Возможно ли сделать что-то подобное?
Ответы (3 шт):
Автор решения: Алексей Р
→ Ссылка
Можно как-то так
import re
for text in '10=4*x+6', '10=10*x', '120 = x*5 +2':
lst = re.findall(r'(\d+)', text)
if len(lst) == 3:
c, k, b = map(int, lst)
print(f'{text}: c={c}, k={k}, b={b}')
else:
print(f'{text}: oшибка ввода выражения!')
10=4*x+6: c=10, k=4, b=6
10=10*x: oшибка ввода выражения!
120 = x*5 +2: c=120, k=5, b=2
Автор решения: CrazyElf
→ Ссылка
Напишу алгоритм в общем виде:
- предварительно убираем из строки ввода все пробелы, чтобы не делать
strip()каждый раз - делим через
splitстроку по знаку= - в той части, где оказалось число - это берём за
c - другую часть делим через тот же
splitпо знаку+ - в той части, где оказалось число - берём это число как
b - делим другую часть по знаку
* - в той части, где получилось число - берём её за
k - можно ещё проверить, что в другой части получился
xна всякий случай - если в конце не остался
xили если на каком-то этапе не получилось ровно 2 части при разбиении - выдаём ошибку ввода
Автор решения: Stanislav Volodarskiy
→ Ссылка
Алгоритм с использованием SymPy:
- Определить переменную x;
- Ввести уравнение;
- Разбить на левую и правую части по знаку равенства;
- Преобразовать части уравнения в выражения
sympy; - Создать уравнение;
- Решить уравнение.
Код:
import sympy
x = sympy.Symbol('x', real=True)
symbols = {'x': x}
while True:
print()
eq = input('equation: ')
lhs, rhs = (sympy.sympify(s, locals=symbols) for s in eq.split('='))
print(f'{x}:', sympy.solveset(sympy.Eq(lhs, rhs), x))
$ python solve.py equation: 10 = 4 * x + 6 x: {1} equation: x^2 = 4 x: {-2, 2} equation: x^2 + 4*x + 15 = 0 x: {-2 - sqrt(11)*I, -2 + sqrt(11)*I} equation: sin(x) = cos(x) x: Union(ImageSet(Lambda(_n, 2*_n*pi + 5*pi/4), Integers), ImageSet(Lambda(_n, 2*_n*pi + pi/4), Integers))