21计科3班 3121005231 王嘉宸 21计科4班 3121005140 邱彦翔
前期准备
需求分析
使用 MoSCoW 方法进行需求分析。
Must Have
-
-
设:
-
自然数或真分数 $n$ : $0, 1, 2, \cdots$ ,
$1/2, 1/3, 2/3, \cdots$; -
运算符 $op$ : $+, -, \times, \div$ ;
-
括号 : $(, )$ ;
-
等号 : $=$ ;
-
分隔符 : 空格(用于四则运算符和等号前后);
-
算术表达式 $e$ , $e_1$ , $e_2$ ;
-
定义:
-
算术表达式的文法:
$e = n | e_1 op e_2 | ( e )$
-
四则运算题目: $e\ =$
-
首先实现对算术表达式 $e\ =\ n_1\ |\ e_1\ op\ e_2$ 的生成与计算支持,
其中 $n_1$ 为自然数。 -
-
-
-
命令行参数:
-n
:生成题目的个数;-r
:生成题目中数值(自然数、真分数和真分数分母)的范围;-e
:题目文件;-a
:答案文件;
-
-
- 读取:读取命令行参数给入的题目文件和答案文件;
- 写入:
-
生成的题目存入执行程序的当前目录下的
Exercises.txt
文件; -
计算出所有题目的答案,并存入执行程序的当前目录下的
Answers.txt
文件; -
根据给定输入题目和答案,统计分数输出到文件
Grade.txt
,格式如下:Correct: 5 (1, 3, 5, 7, 9) Wrong: 5 (2, 4, 6, 8, 10)
:
后面的数字5
表示对/错的题目的数量;- 括号(
(1, 3, 5, 7, 9)
)内的是对/错题目的编号。
为简单起见,假设输入的题目都是按照顺序编号的符合规范的题目。
-
Should Have
Could Have
Won’t Have
除了上述的需求,我们不会实现其他的功能。
资料搜集
项目的核心需求主要包含两个大部分:算术表达式的生成和计算。
根据核心需求,调研背景知识,了解关于算术表达式生成和计算的相关算法,
检索可能使用到的依赖库。
除核心需求外,还需要实现命令行界面和文件读写功能。
因此也需要了解标准库以及其他可能使用到的依赖库。
算术表达式的生成
算术表达式的生成需要使用随机数生成器,有库可供使用:
- rand :Rust 随机数生成库。
算术表达式的计算
关于算术表达式的计算,OI Wiki[1] 中有相对详细的介绍。
需要使用到的核心算法是逆波兰表达式求值算法。
检索 Rust 的依赖库,有如下库可供使用:
分数支持
对分数支持,可以使用如下库:
去重问题
对于重复项的处理,可以考虑使用哈希或者并查集的方法。
并查集在 Rust 中有如下库可供使用:
- HashMap
: Rust 标准库中的哈希表。 - union-find :并查集库。
命令行界面
关于命令行交互,我们使用 Rust 中一个功能丰富且非常常用的库:
- clap :Rust 命令行交互及参数解析库。
技术指标
- 支持平台: Linux, Windows
- 程序设计语言: Rust
- 依赖库:
clap
,rand
,prexel
需求建模
根据需求分析与依赖库选择,我们对项目进行功能建模。
将项目功能大体分为两个部分:前端(二进制包)和后端(库包)。
前端
- 命令行参数解析
- 执行后端控制逻辑,处理异常
后端
- 算术表达式生成
- 算术表达式计算
- 文件输入输出
总体设计
前期准备后,我们得到了项目的需求优先级、选用的技术指标和需要的功能模块。
接下来对项目进行总体设计,分为两个部分:确定模块接口和总体架构设计。
模块 API
后端库的整体设计如图
图 1 所示。
架构设计
功能实现
[Z/OL]//表达式求值. OI Wiki, 2023.
https://oi-wiki.org/misc/expression/. ↩︎