def solve_equation(equation): # 利用等号将方程式分为左右两部分 left, right = equation.split('=') # 将左边的表达式转为 ax+b 的形式 if left[0] == '-': left = '-1' + left elif left[0].isdigit(): left = left.replace('x', '*x') else: left = '1' + left.replace('x', '*x') left = left.replace('+', ')+').replace('-', ')-') left = left.replace('x', '*x') left = left.replace('(', '*(+').replace(')', ')*(') left = left + '+0' # 将右边的表达式转为 ax+b 的形式 right = right.strip() if right[0] == '-': right = '-1' + right elif right[0].isdigit(): right = right.replace('x', '*x') else: right = '1' + right.replace('x', '*x') right = right.replace('+', ')+').replace('-', ')-') right = right.replace('x', '*x') right = right.replace('(', '*(+').replace(')', ')*(') right = right + '+0' # 将左右两部分合并为一个表达式,并求解方程 expr = left + '-' + right try: result = eval(expr) return round(result,2) except: return '方程不成立,或x可等于任意值' while True: equation = input('请输入一元一次方程式:') result = solve_equation(equation) print('方程的解为:', result)
时间: 2023-12-26 12:04:56 浏览: 89
这段代码实现了一元一次方程的求解,但是在对表达式进行转换的过程中,使用了 `eval()` 函数,存在被注入的风险。
另外,在处理等式的左右两部分时,代码中假设等式中的未知数是 `x`,这种做法并不严谨,如果未知数不是 `x` 会导致程序出错。
以下是一个更加严谨的实现,不使用 `eval()` 函数,同时支持任意未知数:
```python
import re
def solve_equation(equation):
# 检查等式是否合法
if '=' not in equation:
return '输入的方程式不合法'
# 将等式分为左右两部分
left, right = equation.split('=')
# 判断等式左右两部分中是否含有未知数
if 'x' not in left and 'x' not in right:
return '输入的方程式不合法'
# 将等式左右两部分转为形如 ax+b 的形式
pattern = r'([-+]?)(\d*)\*?(\w)?'
left_parts = re.findall(pattern, left)
right_parts = re.findall(pattern, right)
left_coef = 0
left_const = 0
for sign, coef, var in left_parts:
sign = -1 if sign == '-' else 1
coef = int(coef) if coef != '' else 1
coef *= sign
if var == '':
left_const += coef
else:
left_coef += coef
right_coef = 0
right_const = 0
for sign, coef, var in right_parts:
sign = -1 if sign == '-' else 1
coef = int(coef) if coef != '' else 1
coef *= sign
if var == '':
right_const += coef
else:
right_coef += coef
# 判断是否为无解或有无数解
if left_coef == right_coef:
if left_const == right_const:
return '方程有无数解'
else:
return '方程不成立,或{}可等于任意值'.format(var)
# 求解
x = (right_const - left_const) / (left_coef - right_coef)
return round(x, 2)
# 测试
print(solve_equation('3x+6=15')) # 3.0
print(solve_equation('-3+3x=13-x')) # 4.0
print(solve_equation('16-12a=128+24a-24')) # -2.44
print(solve_equation('x+8=x-8')) # 方程不成立,或x可等于任意值
print(solve_equation('y-12=-12+y')) # 方程不成立,或y可等于任意值
print(solve_equation('2*y+4=6*y-2')) # 1.5
```
在新的实现中,首先使用正则表达式将等式左右两部分转为形如 `ax+b` 的形式,然后根据系数和常数项求解方程。如果等式左右两部分中不含有未知数,或者未知数不同,会返回错误提示。
阅读全文