软件工程第三次作业——结对编程

发布时间 2023-09-28 21:44:22作者: PeterWang-dev

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$ ;

      • 定义:

        1. 算术表达式的文法:

          $e = n | e_1 op e_2 | ( e )$

        2. 四则运算题目: $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 的依赖库,有如下库可供使用:

  • dc-ock
    :一个用于计算逆波兰表达式的库。
  • prexel
    :一个用于计算数学表达式的库。

分数支持

对分数支持,可以使用如下库:

  • num :Rust 数学库,包含分数类型。
  • fraction
    :分数库,可用于分数表示。

去重问题

对于重复项的处理,可以考虑使用哈希或者并查集的方法。

并查集在 Rust 中有如下库可供使用:

命令行界面

关于命令行交互,我们使用 Rust 中一个功能丰富且非常常用的库:

  • clap :Rust 命令行交互及参数解析库。

技术指标

  • 支持平台: Linux, Windows
  • 程序设计语言: Rust
  • 依赖库: clap, rand, prexel

需求建模

根据需求分析与依赖库选择,我们对项目进行功能建模。

将项目功能大体分为两个部分:前端(二进制包)和后端(库包)。

前端

  • 命令行参数解析
  • 执行后端控制逻辑,处理异常

后端

  • 算术表达式生成
  • 算术表达式计算
  • 文件输入输出

总体设计

前期准备后,我们得到了项目的需求优先级、选用的技术指标和需要的功能模块。

接下来对项目进行总体设计,分为两个部分:确定模块接口和总体架构设计。

模块 API

后端库的整体设计如图
图 1 所示。

架构设计

功能实现


  1. [Z/OL]//表达式求值. OI Wiki, 2023.
    https://oi-wiki.org/misc/expression/. ↩︎