RPN 计算器使用手册
项目概述
这是一个功能完整的逆波兰表示法(Reverse Polish Notation, RPN)计算器,使用C++编写。
RPN是一种无需括号的数学表达式表示方法,操作符位于操作数之后。
版本: v1.0
**作者**: [Your Name]
日期: 2025年9月
什么是RPN?
在逆波兰表示法中,运算符跟在操作数后面。例如:
- 中缀表达式:
(5 + 3) * 2
- RPN表达式:
5 3 + 2 *
计算过程示例
对于表达式 5 3 + 2 *
:
- 将 5 压入栈
- 将 3 压入栈
- 遇到
+
,弹出 3 和 5,计算 5+3=8,将 8 压入栈
- 将 2 压入栈
- 遇到
*
,弹出 2 和 8,计算 8*2=16,将 16 压入栈
- 最终结果: 16
安装和编译指南
系统要求
- C++编译器 (GCC 5.0+ 或 Clang 3.5+)
- 操作系统: Linux, macOS, 或 Windows
编译步骤
Linux/macOS
# 进入项目目录
cd rpn_calc
# 编译源代码
g++ rpn_calc.cpp -o rpn_calc -std=c++11
# 运行程序
./rpn_calc
Windows
# 使用 MinGW 或 MSVC
g++ rpn_calc.cpp -o rpn_calc.exe -std=c++11
# 运行
rpn_calc.exe
编译选项说明
-std=c++11
: 使用C++11标准
-o rpn_calc
: 指定输出文件名
-O2
: (可选) 开启优化
基本使用
启动程序
运行程序后会看到欢迎界面:
discard """
==================================
C++ RPN 计算器 v1.0
==================================
输入表达式 (例: '5 5 +'), 或 'help' 查看帮助, 'q' 退出.
>
"""
简单示例
示例1: 基本加法
discard """
> 5 5 +
结果: 10.000000
"""
示例2: 复杂计算
discard """
> 1 2 + 3 + 7 7 * +
结果: 55.000000
"""
解析过程:
1 2 +
→ 3
3 3 +
→ 6
7 7 *
→ 49
6 49 +
→ 55
支持的操作
基本算术运算
操作符 |
说明 |
示例 |
结果 |
+ |
加法 |
5 3 + |
8 |
- |
减法 |
10 3 - |
7 |
* |
乘法 |
4 5 * |
20 |
/ |
除法 |
20 4 / |
5 |
高级数学函数
操作符 |
说明 |
示例 |
结果 |
sqrt |
平方根 |
16 sqrt |
4 |
pow |
幂运算 |
2 10 pow |
1024 |
sin |
正弦函数 (弧度) |
1.5708 sin |
1.0 |
cos |
余弦函数 (弧度) |
0 cos |
1.0 |
tan |
正切函数 (弧度) |
0.7854 tan |
1.0 |
特殊操作符(高级功能)
斐波那契数列 (fib
)
计算斐波那契数列的第n项(从0开始)。
使用方法: n fib
discard """
> 10 fib
结果: 55.000000
> 15 fib
结果: 610.000000
"""
斐波那契数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...
杨辉三角 (pascal
)
计算杨辉三角(帕斯卡三角形)中第n行第k列的值,即组合数C(n,k)。
使用方法: n k pascal
discard """
> 5 2 pascal
结果: 10.000000
> 10 5 pascal
结果: 252.000000
"""
杨辉三角示例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
C(5,2) = 10 表示第5行第2列的值
栈操作命令
命令 |
说明 |
示例 |
display |
显示当前栈内容 |
5 3 + display |
clear |
清空栈 |
clear |
其他命令
命令 |
说明 |
help 或 h |
显示帮助信息 |
history |
显示计算历史 |
q , quit , exit |
退出程序 |
详细使用示例
示例1: 四则运算组合
discard """
> 15 7 1 1 + - / 3 * 2 1 1 + + -
结果: 5.000000
"""
计算过程:
15 7 1 1 + - /
→ 15 / (7-(1+1)) = 15 / 5 = 3
3 3 *
→ 9
2 1 1 + +
→ 4
9 4 -
→ 5
示例2: 使用三角函数
discard """
> 3.14159 2 / sin
结果: 1.000000
> 0 cos
结果: 1.000000
"""
示例3: 幂运算
discard """
> 2 8 pow
结果: 256.000000
> 5 3 pow
结果: 125.000000
"""
示例4: 斐波那契数列计算
discard """
> 20 fib
结果: 6765.000000
> 0 fib
结果: 0.000000
> 1 fib
结果: 1.000000
"""
示例5: 杨辉三角计算
discard """
> 10 3 pascal
结果: 120.000000
> 6 3 pascal
结果: 20.000000
"""
示例6: 使用栈操作
discard """
> 5 3 display
当前栈内容 (栈顶 -> 栈底): 3 5
> + display
当前栈内容 (栈顶 -> 栈底): 8
> clear
栈已清空
"""
错误处理
错误代码和说明
错误类型 |
错误信息 |
原因 |
解决方法 |
栈空错误 |
错误: 栈为空 |
操作数不足 |
确保有足够的操作数 |
除零错误 |
错误: 除数不能为零 |
除法运算中除数为0 |
避免除以零 |
格式错误 |
错误: 未知操作符 |
输入了不支持的操作符 |
检查拼写和支持的操作符列表 |
负数开方 |
错误: 负数没有实数平方根 |
对负数求平方根 |
使用非负数 |
参数错误 |
错误: 斐波那契数列索引必须非负 |
fib操作的参数为负数 |
使用非负整数 |
参数错误 |
错误: 杨辉三角参数无效 |
pascal操作的参数不合法 |
确保 0 ≤ k ≤ n |
错误示例
discard """
> 5 0 /
错误: 除数不能为零
> +
错误: 栈为空
> 5 abc
错误: 未知操作符 'abc'
> -16 sqrt
错误: 负数没有实数平方根
> -5 fib
错误: 斐波那契数列索引必须非负
"""
进阶技巧
1. 批量计算
可以在一行中输入多个完整的计算:
discard """
> 5 5 + 10 10 + *
结果: 200.000000
"""
2. 使用历史记录
discard """
> 5 3 +
结果: 8.000000
> 10 2 *
结果: 20.000000
> history
=== 计算历史 ===
1. 5 3 + = 8.000000
2. 10 2 * = 20.000000
"""
3. 组合高级功能
计算斐波那契数列的平方:
discard """
> 10 fib 2 pow
结果: 3025.000000
"""
计算组合数的和:
discard """
> 5 2 pascal 5 3 pascal +
结果: 20.000000
"""
最佳实践
- 从简单开始: 先测试基本的加减乘除,熟悉RPN语法
- 使用display命令: 在复杂计算中使用
display
查看栈状态
- 分步计算: 将复杂表达式分解成多个简单步骤
- 检查输入: 确保每个操作符有足够的操作数
- 使用clear: 出错后使用
clear
清空栈重新开始
常见问题
Q: 为什么我的结果是小数而不是整数?
A: 计算器内部使用双精度浮点数(double),所有结果都显示为浮点格式。
Q: 如何输入负数?
A: 直接输入负号和数字,如 -5 3 +
Q: 三角函数使用什么单位?
A: 所有三角函数使用弧度作为输入单位。90度 = π/2 ≈ 1.5708 弧度
Q: fib和pascal操作符有什么实际用途?
A:
- fib: 斐波那契数列在自然界、艺术和计算机科学中有广泛应用
- pascal: 杨辉三角用于组合数学、概率论和二项式展开
Q: 计算器支持的最大数字是多少?
A: 受限于double类型,约为 ±1.7 × 10^308
技术细节
实现原理
- 使用STL的
stack
容器实现数据栈
- 使用
stringstream
进行输入解析
- 异常处理机制保证程序健壮性
性能特点
- 时间复杂度: O(n),n为token数量
- 空间复杂度: O(m),m为最大栈深度
- 斐波那契计算优化为O(n)迭代算法
- 杨辉三角使用优化的组合数计算方法
版本更新日志
v1.0 (2025-09)
- ✅ 实现基本四则运算
- ✅ 实现高级数学函数(sqrt, pow, sin, cos, tan)
- ✅ 新增斐波那契数列计算 (fib操作符)
- ✅ 新增杨辉三角计算 (pascal操作符)
- ✅ 完善错误处理机制
- ✅ 添加计算历史记录功能
- ✅ 优化用户界面和帮助信息
联系方式
- 项目主页: [GitHub Repository URL]
- 问题反馈: [Issues URL]
- 文档: [GitHub Pages URL]
许可证
本项目采用 MIT 许可证。
感谢使用 RPN 计算器!
import nimib
nbInit
nbText: """
# RPN 计算器使用手册
## 项目概述
这是一个功能完整的**逆波兰表示法(Reverse Polish Notation, RPN)计算器**,使用C++编写。
RPN是一种无需括号的数学表达式表示方法,操作符位于操作数之后。
**版本**: v1.0
**作者**: [Your Name]
**日期**: 2025年9月
---
## 什么是RPN?
在逆波兰表示法中,运算符跟在操作数后面。例如:
- 中缀表达式: `(5 + 3) * 2`
- RPN表达式: `5 3 + 2 *`
### 计算过程示例
对于表达式 `5 3 + 2 *`:
1. 将 5 压入栈
2. 将 3 压入栈
3. 遇到 `+`,弹出 3 和 5,计算 5+3=8,将 8 压入栈
4. 将 2 压入栈
5. 遇到 `*`,弹出 2 和 8,计算 8*2=16,将 16 压入栈
6. 最终结果: 16
---
## 安装和编译指南
### 系统要求
- C++编译器 (GCC 5.0+ 或 Clang 3.5+)
- 操作系统: Linux, macOS, 或 Windows
### 编译步骤
#### Linux/macOS
```bash
# 进入项目目录
cd rpn_calc
# 编译源代码
g++ rpn_calc.cpp -o rpn_calc -std=c++11
# 运行程序
./rpn_calc
```
#### Windows
```cmd
# 使用 MinGW 或 MSVC
g++ rpn_calc.cpp -o rpn_calc.exe -std=c++11
# 运行
rpn_calc.exe
```
### 编译选项说明
- `-std=c++11`: 使用C++11标准
- `-o rpn_calc`: 指定输出文件名
- `-O2`: (可选) 开启优化
---
## 基本使用
### 启动程序
运行程序后会看到欢迎界面:
"""
nbCode:
discard """
==================================
C++ RPN 计算器 v1.0
==================================
输入表达式 (例: '5 5 +'), 或 'help' 查看帮助, 'q' 退出.
>
"""
nbText: """
### 简单示例
#### 示例1: 基本加法
"""
nbCode:
discard """
> 5 5 +
结果: 10.000000
"""
nbText: """
#### 示例2: 复杂计算
"""
nbCode:
discard """
> 1 2 + 3 + 7 7 * +
结果: 55.000000
"""
nbText: """
**解析过程**:
1. `1 2 +` → 3
2. `3 3 +` → 6
3. `7 7 *` → 49
4. `6 49 +` → 55
---
## 支持的操作
### 基本算术运算
| 操作符 | 说明 | 示例 | 结果 |
|--------|------|------|------|
| `+` | 加法 | `5 3 +` | 8 |
| `-` | 减法 | `10 3 -` | 7 |
| `*` | 乘法 | `4 5 *` | 20 |
| `/` | 除法 | `20 4 /` | 5 |
### 高级数学函数
| 操作符 | 说明 | 示例 | 结果 |
|--------|------|------|------|
| `sqrt` | 平方根 | `16 sqrt` | 4 |
| `pow` | 幂运算 | `2 10 pow` | 1024 |
| `sin` | 正弦函数 (弧度) | `1.5708 sin` | 1.0 |
| `cos` | 余弦函数 (弧度) | `0 cos` | 1.0 |
| `tan` | 正切函数 (弧度) | `0.7854 tan` | 1.0 |
### 特殊操作符(高级功能)
#### 斐波那契数列 (`fib`)
计算斐波那契数列的第n项(从0开始)。
**使用方法**: `n fib`
"""
nbCode:
discard """
> 10 fib
结果: 55.000000
> 15 fib
结果: 610.000000
"""
nbText: """
**斐波那契数列**: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...
#### 杨辉三角 (`pascal`)
计算杨辉三角(帕斯卡三角形)中第n行第k列的值,即组合数C(n,k)。
**使用方法**: `n k pascal`
"""
nbCode:
discard """
> 5 2 pascal
结果: 10.000000
> 10 5 pascal
结果: 252.000000
"""
nbText: """
**杨辉三角示例**:
```
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
```
C(5,2) = 10 表示第5行第2列的值
### 栈操作命令
| 命令 | 说明 | 示例 |
|------|------|------|
| `display` | 显示当前栈内容 | `5 3 + display` |
| `clear` | 清空栈 | `clear` |
### 其他命令
| 命令 | 说明 |
|------|------|
| `help` 或 `h` | 显示帮助信息 |
| `history` | 显示计算历史 |
| `q`, `quit`, `exit` | 退出程序 |
---
## 详细使用示例
### 示例1: 四则运算组合
"""
nbCode:
discard """
> 15 7 1 1 + - / 3 * 2 1 1 + + -
结果: 5.000000
"""
nbText: """
**计算过程**:
- `15 7 1 1 + - /` → 15 / (7-(1+1)) = 15 / 5 = 3
- `3 3 *` → 9
- `2 1 1 + +` → 4
- `9 4 -` → 5
### 示例2: 使用三角函数
"""
nbCode:
discard """
> 3.14159 2 / sin
结果: 1.000000
> 0 cos
结果: 1.000000
"""
nbText: """
### 示例3: 幂运算
"""
nbCode:
discard """
> 2 8 pow
结果: 256.000000
> 5 3 pow
结果: 125.000000
"""
nbText: """
### 示例4: 斐波那契数列计算
"""
nbCode:
discard """
> 20 fib
结果: 6765.000000
> 0 fib
结果: 0.000000
> 1 fib
结果: 1.000000
"""
nbText: """
### 示例5: 杨辉三角计算
"""
nbCode:
discard """
> 10 3 pascal
结果: 120.000000
> 6 3 pascal
结果: 20.000000
"""
nbText: """
### 示例6: 使用栈操作
"""
nbCode:
discard """
> 5 3 display
当前栈内容 (栈顶 -> 栈底): 3 5
> + display
当前栈内容 (栈顶 -> 栈底): 8
> clear
栈已清空
"""
nbText: """
---
## 错误处理
### 错误代码和说明
| 错误类型 | 错误信息 | 原因 | 解决方法 |
|----------|----------|------|----------|
| 栈空错误 | `错误: 栈为空` | 操作数不足 | 确保有足够的操作数 |
| 除零错误 | `错误: 除数不能为零` | 除法运算中除数为0 | 避免除以零 |
| 格式错误 | `错误: 未知操作符` | 输入了不支持的操作符 | 检查拼写和支持的操作符列表 |
| 负数开方 | `错误: 负数没有实数平方根` | 对负数求平方根 | 使用非负数 |
| 参数错误 | `错误: 斐波那契数列索引必须非负` | fib操作的参数为负数 | 使用非负整数 |
| 参数错误 | `错误: 杨辉三角参数无效` | pascal操作的参数不合法 | 确保 0 ≤ k ≤ n |
### 错误示例
"""
nbCode:
discard """
> 5 0 /
错误: 除数不能为零
> +
错误: 栈为空
> 5 abc
错误: 未知操作符 'abc'
> -16 sqrt
错误: 负数没有实数平方根
> -5 fib
错误: 斐波那契数列索引必须非负
"""
nbText: """
---
## 进阶技巧
### 1. 批量计算
可以在一行中输入多个完整的计算:
"""
nbCode:
discard """
> 5 5 + 10 10 + *
结果: 200.000000
"""
nbText: """
### 2. 使用历史记录
"""
nbCode:
discard """
> 5 3 +
结果: 8.000000
> 10 2 *
结果: 20.000000
> history
=== 计算历史 ===
1. 5 3 + = 8.000000
2. 10 2 * = 20.000000
"""
nbText: """
### 3. 组合高级功能
计算斐波那契数列的平方:
"""
nbCode:
discard """
> 10 fib 2 pow
结果: 3025.000000
"""
nbText: """
计算组合数的和:
"""
nbCode:
discard """
> 5 2 pascal 5 3 pascal +
结果: 20.000000
"""
nbText: """
---
## 最佳实践
1. **从简单开始**: 先测试基本的加减乘除,熟悉RPN语法
2. **使用display命令**: 在复杂计算中使用`display`查看栈状态
3. **分步计算**: 将复杂表达式分解成多个简单步骤
4. **检查输入**: 确保每个操作符有足够的操作数
5. **使用clear**: 出错后使用`clear`清空栈重新开始
---
## 常见问题
### Q: 为什么我的结果是小数而不是整数?
A: 计算器内部使用双精度浮点数(double),所有结果都显示为浮点格式。
### Q: 如何输入负数?
A: 直接输入负号和数字,如 `-5 3 +`
### Q: 三角函数使用什么单位?
A: 所有三角函数使用**弧度**作为输入单位。90度 = π/2 ≈ 1.5708 弧度
### Q: fib和pascal操作符有什么实际用途?
A:
- **fib**: 斐波那契数列在自然界、艺术和计算机科学中有广泛应用
- **pascal**: 杨辉三角用于组合数学、概率论和二项式展开
### Q: 计算器支持的最大数字是多少?
A: 受限于double类型,约为 ±1.7 × 10^308
---
## 技术细节
### 实现原理
- 使用STL的`stack`容器实现数据栈
- 使用`stringstream`进行输入解析
- 异常处理机制保证程序健壮性
### 性能特点
- 时间复杂度: O(n),n为token数量
- 空间复杂度: O(m),m为最大栈深度
- 斐波那契计算优化为O(n)迭代算法
- 杨辉三角使用优化的组合数计算方法
---
## 版本更新日志
### v1.0 (2025-09)
- ✅ 实现基本四则运算
- ✅ 实现高级数学函数(sqrt, pow, sin, cos, tan)
- ✅ 新增斐波那契数列计算 (fib操作符)
- ✅ 新增杨辉三角计算 (pascal操作符)
- ✅ 完善错误处理机制
- ✅ 添加计算历史记录功能
- ✅ 优化用户界面和帮助信息
---
## 联系方式
- **项目主页**: [GitHub Repository URL]
- **问题反馈**: [Issues URL]
- **文档**: [GitHub Pages URL]
---
## 许可证
本项目采用 MIT 许可证。
---
**感谢使用 RPN 计算器!**
"""
nbSave