from math import * import re def convert_formula(input): """ 将输入的数学表达式转换为 Python 格式,并以字符串形式返回转换后的表达式 """ input = str(input) trig_functions = ['sin', 'cos', 'tan', 'cot', 'sec', 'csc', 'arctan', 'arcsin', 'arccos'] for func in trig_functions: # 匹配场景:函数名后紧跟字母/数字(如sinx→sin(x),cos2x→cos(2x)) # 正则说明:\b确保匹配完整函数名,([a-zA-Z0-9])捕获后续字符 input = re.sub(rf'\b{func}([a-zA-Z0-9])', rf'{func}(\1)', input) input = re.sub(r'(\d+\.?\d*|\.\d+|\))([a-zA-Z]|\d+\.?\d*|\.\d*|\()', r'\1*\2', input) # 新增:处理x/y/z等字母相乘省略乘号的情况(如xy→x*y,xyz→x*y*z) input = re.sub(r'([xyzXYZ])(?=[xyzXYZ])', r'\1*', input) # 替换所有的乘除符号为 Python 中的运算符 input = input.replace("×", "*") input = input.replace("÷", "/") # 替换所有的括号 input = input.replace("(", "(") input = input.replace(")", ")") # 替换所有的减号为 Python 中的运算符 input = input.replace("﹣", "-") # 替换所有的加号为 Python 中的运算符 input = input.replace("+", "+") # 替换所有的²为 Python 中的运算符 input = input.replace("²", "**2") # 替换所有的³为 Python 中的运算符 input = input.replace("³", "**3") # 替换所有的绝对值符号为 abs() l=input.split("|") n=[2*i+1 for i in range(len(l)-1)] for i in n: if n.index(i)%2==0: l.insert(i,"abs(") else: l.insert(i,")") o = "" for i in l: o += i input = o # 替换开根号符号为 **0.5,正确匹配作用域 # 正则说明:匹配 '√' 后的括号内容(如 √(a+b))或连续非运算符字符(如 √5、√ab) input = re.sub(r'√([a-zA-Z0-9_.()]+)', r'(\1)**0.5', input) # 替换所有的 ln 为自然对数函数 log(),支持小数点和变量 # 正则说明:匹配 'ln' 后紧跟的数字(含小数点)、字母、下划线(如 5.6、x、var_1 等) input = re.sub(r'ln([a-zA-Z0-9_.]+)', r'log(\1)', input) input = input.replace("ln","log") # 替换所有乘方符号为 Python 中的 ** 运算符 input = input.replace("^", "**") return input def test_convert_formula(): # 测试乘除符号转换 assert convert_formula("3×4÷2") == "3*4/2", "乘除符号转换失败" # 测试括号转换 assert convert_formula("(3 + 4)") == "(3 + 4)", "括号转换失败" # 测试加减符号转换 assert convert_formula("5+3﹣2") == "5+3-2", "加减符号转换失败" # 测试平方和立方符号转换 assert convert_formula("2² + 3³") == "2**2 + 3**3", "平方和立方符号转换失败" # 测试绝对值符号转换 assert convert_formula("|-5|") == "abs(-5)", "绝对值符号转换失败" # 测试自然对数符号转换 assert convert_formula("ln5.6 + lnx + ln(2x)") == "log(5.6) + log(x) + log(2x)", "自然对数符号转换失败" # 测试开根号符号转换 assert convert_formula("√9") == "(9)**0.5", "开根号符号转换失败" # 测试乘方符号转换 assert convert_formula("2^3") == "2**3", "乘方符号转换失败" # 增加一个包含所有转换的测试用例 assert convert_formula("3×(5+2²)÷√(ln4)﹣|-3|³") == "3*(5+2**2)/((log(4)))**0.5-abs(-3)**3", "包含所有转换的测试失败" print("所有测试用例通过!") def split_function(function): """ 将形如f(x)=x^2的函数表达式拆分成自变量和表达式两部分 """ independent_variable=function.split("=")[0].split("(")[1].split(")")[0] expression=function.split("=")[1] return independent_variable, expression def test_split_function(): # 测试函数表达式拆分 assert split_function("f(x)=x^2") == ("x", "x**2"), "函数表达式拆分失败" # 测试自变量提取 assert split_function("f(x)=x^2")[0] == "x", "自变量提取失败" # 测试表达式提取 assert split_function("f(x)=x^2")[1] == "x**2", "表达式提取失败" # 增加一个复杂的函数表达式拆分测试用例 assert split_function("g(x)=3x^2+5ln(x)") == ("x", "3*x**2+5*log(x)"), "复杂函数表达式拆分测试失败" # 调用测试函数 if __name__ == "__main__": test_convert_formula()