当前位置: 首页 > news >正文

【python实现一个更复杂的计算器】

当然可以。为了实现一个更复杂的计算器,我们可以考虑添加一些额外的功能,比如支持括号、更复杂的表达式解析(使用栈来处理运算符的优先级),以及可能的用户交互改进。然而,完全从头开始实现一个支持复杂表达式的解析器是一个相当复杂的任务,通常需要使用到解析技术如递归下降解析或利用现有的库如eval()(但出于安全考虑,通常不推荐直接使用eval()处理用户输入)。

为了简化,我们可以使用一个现成的库,比如sympy,它提供了强大的符号数学功能,包括表达式解析和计算。但如果你想要自己实现而不依赖外部库,那么下面我将给出一个简化的版本,它支持括号和基本的运算符优先级处理(使用栈)。

不过,由于篇幅和复杂性的限制,我将只提供一个非常基础的框架,用于说明如何使用栈来处理包含括号和运算符优先级的表达式。

def precedence(op):if op == '+' or op == '-':return 1if op == '*' or op == '/':return 2return 0def apply_op(a, b, op):if op == '+': return a + bif op == '-': return a - bif op == '*': return a * bif op == '/':if b != 0.0:return a / belse: return "Error: Division by zero"def evaluate_expression(expression):numbers = []operators = []i = 0while i < len(expression):if expression[i] == ' ':i += 1continueelif expression[i] == '(':operators.append(expression[i])elif expression[i].isdigit():val = 0while i < len(expression) and expression[i].isdigit():val = (val * 10) + int(expression[i])i += 1i -= 1  # Correct the index for the next iterationnumbers.append(val)elif expression[i] in '+-*/':while (len(operators) != 0 andprecedence(operators[-1]) >= precedence(expression[i])):operators.pop()if len(numbers) >= 2:b = numbers.pop()a = numbers.pop()result = apply_op(a, b, operators.pop())numbers.append(result)operators.append(expression[i])elif expression[i] == ')':while (len(operators) != 0 and operators[-1] != '('):if len(numbers) >= 2:b = numbers.pop()a = numbers.pop()result = apply_op(a, b, operators.pop())numbers.append(result)operators.pop()  # Remove '(' from the stacki += 1while len(operators) != 0:if len(numbers) >= 2:b = numbers.pop()a = numbers.pop()result = apply_op(a, b, operators.pop())numbers.append(result)return numbers[0]# Example usage
expression = "10 + 2 * 6"
print(evaluate_expression(expression))  # Output: 22expression = "100 * ( 2 + 12 )"
print(evaluate_expression(expression))  # Output: 1400expression = "100 * ( 2 + 12 ) / 14"
print(evaluate_expression(expression))  # Output: 100.0

请注意,这个实现仍然有很多限制和可以改进的地方,比如它不支持浮点数直接输入(需要像10.5这样的数字被解析为两个数字10.5,这显然是不正确的),也没有处理负数或更复杂的表达式结构。此外,错误处理也非常基础。

如果你想要一个更健壮和完整的解决方案,考虑使用sympy库或其他类似的数学表达式解析库。


http://www.mrgr.cn/news/25635.html

相关文章:

  • 【H2O2|全栈】关于CSS(3)CSS基础(三)
  • Java 图片处理简易指南
  • Python习题 180:使用 sqlite3 模块实现数据库操作
  • 力扣题解2576
  • 计算各种图形的周长(多态)
  • MBD_入门篇_24_SimulinkSources
  • [001-02-001]. 第07-03节:理解线程的安全问题
  • 【AI绘画】Midjourney进阶:景别详解
  • 6.3排序——冒泡排序+快速排序
  • 2024第三届大学生算法大赛 真题训练2 解题报告 | 珂学家 | FFT/NTT板子
  • 先攒一波硬件,过几年再给电脑升级,靠谱吗?想啥呢?
  • 嵌入式边缘计算:融合创新与未来展望
  • C语言实现一个24点游戏
  • GD32/STM32启动过程
  • 深入理解Java中的Lambda表达式
  • DAY14信息打点-JS 架构框架识别泄漏提取API 接口枚举FUZZ 爬虫插件项目
  • C++面向对象结构改进
  • 【隐私计算】Paillier半同态加密算法
  • WInform记录的添加和显示
  • C#中的集合