Как сделать что бы при вводе уравнения оно превращалось в числа

У меня есть программа, которая решает уравнения типа 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:

  1. Определить переменную x;
  2. Ввести уравнение;
  3. Разбить на левую и правую части по знаку равенства;
  4. Преобразовать части уравнения в выражения sympy;
  5. Создать уравнение;
  6. Решить уравнение.

Код:

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))
→ Ссылка