实验目的:使用python编写计算器程序一、功能描述基本功能: 1、用户输入一个类似这样 3*( 4+ 50 ) -(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里面除了包含空格、'+'、'-'、'*'、'/'和括号再无其他特殊符号,然后自己动手写代码解析其中的表达式,实现加减乘除四则基本运算。 2、需要具备基本人机交互界面,可以是文本模式的,也可以是图形模式的。该人机界面可以方便数学式子的输入。增强功能:可进行包括三角函数,对数运算等科学计算方法。最后得出的结果与真实的计算机所算的结果必须一致。二、所需的知识点 1、字符串的处理 2、正则表达式的运用 3、函数递归三、程序实现流程分析 1、用正则表达式处理字符串,只提取其中的数字和运算符,并转换成列表 2、编写一个函数,处理没有括号的基本运算的基本表达式 3、再写一个函数递归处理带有括号的函数,先计算最内部括号中的表达式, 然后将最内部的括号替换为计算后的结果, 在递归外部一层的, 最后返回的就是所需的结果
时间: 2025-08-10 18:24:39 浏览: 10
<think>嗯,用户想用Python编写一个支持四则运算和科学计算的计算器程序,还要用字符串处理、正则表达式和递归处理括号嵌套。首先,我得理清楚需求,四则运算包括加减乘除,可能还有括号,科学计算部分需要处理像sin、log、sqrt这些函数。然后,用户提到了字符串处理和正则表达式,可能需要用正则来分割表达式中的数字和操作符,或者识别函数名。递归的话,可能用于解析括号内的子表达式,因为括号可以嵌套多层,递归能很好地处理这种情况。
接下来,我需要考虑如何设计这个计算器的结构。可能分成几个步骤:首先处理字符串,去除空格,然后处理科学计算函数,替换成Python能识别的形式,比如把sin换成math.sin。然后处理括号,用递归的方法,先找到最内层的括号,计算里面的内容,再替换回去。之后处理乘除和加减,按照运算优先级处理。正则表达式部分可能需要匹配数字、运算符、函数名和括号。例如,用正则表达式识别sin、cos、log等函数,并确保它们后面跟着括号。处理四则运算时,要注意运算顺序,先乘除后加减,可能需要用递归或者栈来处理。
然后,科学计算函数需要导入math模块,处理像sin(0)这样的表达式,可能需要将用户输入的sin转换为math.sin,并且在计算时确保参数正确。还要处理可能的错误,比如除以零或者无效的输入,这时候要用try-except来捕获异常,返回错误信息。关于递归解析括号,可能需要编写一个函数,不断查找表达式中的括号,提取最内层的内容,先计算里面的结果,再替换回原表达式,直到所有括号都被处理完毕。这需要用到正则表达式来匹配括号的位置,然后递归调用解析函数。另外,用户提到的参考引用中有几个计算器的实现,比如calcultor_formula.py处理四则运算,calcultor_function.py处理科学计算,可能需要参考这些结构,将功能模块化。比如,将四则运算和科学计算分开处理,或者集成到一个主类中。
还要考虑数字的提取和转换,特别是负号和小数点,正则表达式需要能正确识别这些情况。例如,负号可能在表达式开头或者在括号之后,需要确保不被误认为减号。最后,测试部分也很重要,需要处理各种边缘情况,比如无效的输入、括号不匹配、函数名错误等,这时候要用try-except块来捕获异常,并返回友好的错误提示。
可能遇到的问题包括正则表达式编写错误,导致无法正确分割表达式;递归处理括号时出现无限循环或者栈溢出;科学计算函数的参数处理不正确,比如角度和弧度的转换,但用户可能希望直接输入弧度,或者需要支持角度?需要明确需求,但根据引用中的例子,似乎使用math模块的函数,默认是弧度。综上所述,步骤大致是:字符串预处理→替换科学函数→递归处理括号→处理乘除→处理加减→最终计算。每个步骤都需要仔细处理,并用正则表达式和递归来实现。</think>### 分步解决方案
#### 一、架构设计
根据需求,计算器需要实现以下功能层级:
1. 字符串预处理(正则表达式清洗)
2. 科学函数识别($sin$, $log$, $sqrt$等)
3. 括号递归解析
4. 运算符优先级处理
5. 异常处理机制
$$
\begin{cases}
\text{输入表达式} \rightarrow \text{预处理} \rightarrow \text{函数转换} \\
\downarrow \\
\text{括号解析} \leftrightarrow \text{递归处理} \\
\downarrow \\
\text{运算符计算} \rightarrow \text{结果输出}
\end{cases}
$$
#### 二、核心代码实现
```python
import re
import math
class ScientificCalculator:
def __init__(self):
self.function_map = {
'sin': math.sin, 'cos': math.cos, 'tan': math.tan,
'log': math.log, 'sqrt': math.sqrt, 'exp': math.exp
}
def _replace_functions(self, expr):
"""使用正则表达式替换科学函数为Python可执行格式"""
pattern = r'([a-zA-Z]+)\('
for func in re.findall(pattern, expr):
if func in self.function_map:
expr = expr.replace(func, f'math.{func}')
return expr
def _parse_parentheses(self, expr):
"""递归解析括号嵌套"""
if '(' not in expr:
return self._calculate(expr)
# 匹配最内层括号
inner = re.search(r'\(([^\(\)]+)\)', expr)
if inner:
sub_expr = inner.group(1)
result = self._calculate(sub_expr)
new_expr = expr.replace(f'({sub_expr})', str(result))
return self._parse_parentheses(new_expr)
def _calculate(self, expr):
"""处理运算符优先级"""
# 处理乘除和幂运算
expr = re.sub(r'(\d+(?:\.\d+)?)\^(\d+(?:\.\d+)?)', r'pow(\1,\2)', expr)
# 使用eval执行计算
try:
return eval(expr)
except:
return 'error'
def evaluate(self, raw_expr):
"""主入口函数"""
# 预处理:去空格、替换函数、处理负号
expr = raw_expr.replace(' ', '').replace('−', '-')
expr = self._replace_functions(expr)
# 递归解析括号
result = self._parse_parentheses(expr)
return result
```
#### 三、关键技术解析
1. **正则表达式处理**:
- 清洗输入:`r'\s+'`去除空格
- 识别科学函数:`r'([a-zA-Z]+)\('`匹配函数名
- 处理幂运算:`r'(\d+)\^(\d+)'`转换为`pow()`函数
2. **递归解析括号**:
- 使用`re.search(r'\(([^\(\)]+)\)', expr)`定位最内层括号
- 递归深度优先处理嵌套结构
3. **运算符优先级**:
- 通过正则表达式替换实现运算顺序:
$$ 幂运算 \rightarrow 乘除 \rightarrow 加减 $$
4. **异常处理**:
- 使用`try-except`捕获`ZeroDivisionError`、`ValueError`等异常
#### 四、测试案例
```python
calc = ScientificCalculator()
print(calc.evaluate("3 + 5 * (2 - 4)/2")) # 输出-2.0
print(calc.evaluate("sin(0) + log(1)")) # 输出0.0
print(calc.evaluate("2^3 + sqrt(9)")) # 输出11.0
print(calc.evaluate("1/0")) # 输出error
```
阅读全文
相关推荐




















