🏡 rpn_manual.nim

RPN 计算器使用手册

项目概述

这是一个功能完整的逆波兰表示法(Reverse Polish Notation, RPN)计算器,使用C++编写。 RPN是一种无需括号的数学表达式表示方法,操作符位于操作数之后。

版本: v1.0
**作者**: [Your Name]
日期: 2025年9月


什么是RPN?

在逆波兰表示法中,运算符跟在操作数后面。例如:

计算过程示例

对于表达式 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

安装和编译指南

系统要求

编译步骤

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

编译选项说明


基本使用

启动程序

运行程序后会看到欢迎界面:

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. 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

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

其他命令

命令 说明
helph 显示帮助信息
history 显示计算历史
q, quit, exit 退出程序

详细使用示例

示例1: 四则运算组合

discard """
  > 15 7 1 1 + - / 3 * 2 1 1 + + -
  结果: 5.000000
  """

计算过程:

示例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
  """

最佳实践

  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:

Q: 计算器支持的最大数字是多少?

A: 受限于double类型,约为 ±1.7 × 10^308


技术细节

实现原理

性能特点


版本更新日志

v1.0 (2025-09)


联系方式


许可证

本项目采用 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