作业3

成员 陈曦3123004137 / 陈培然3123004134
仓库链接 https://github.com/Mosya-CX/Mosya-CX/tree/master/第三次作业

PSP表

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 40
· Estimate · 估计这个任务需要多少时间 3 1
Development 开发 120 140
· Analysis · 需求分析 (包括学习新技术) 5 5
· Design Spec · 生成设计文档 10 5
· Design Review · 设计复审 5 3
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 3 1
· Design · 具体设计 60 50
· Coding · 具体编码 20 15
· Code Review · 代码复审 5 5
· Test · 测试(自我测试,修改代码,提交修改) 20 10
Reporting 报告 5 5
· Test Repor · 测试报告 5 5
· Size Measurement · 计算工作量 3 1
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 15 15
· 合计 329 341

性能分析


设计实现过程

(1)Fraction 类
作用:
用于存储和处理 带整数部分的分数,并提供字符串转换功能
关系:
Fraction 用于 Expression 类的 操作数(即数学表达式中的数字)。
计算模块(calculator)会返回 Fraction 作为运算结果。
(2)Expression 类
作用:
存储数学表达式,包括 操作数、运算符、括号信息,并支持计算。
关系:
Expression 依赖 Fraction 存储数字。
Expression 的 CalculateFraction() 调用 calculator 进行运算。
(3)ExerciseGenerate 类
作用:
随机生成四则运算表达式,支持整数和分数。
关系:
ExerciseGenerate 生成 Expression 对象。
生成的 Expression 会被计算,并存储到文件。
(4)calculator 模块
作用:
解析表达式并执行计算,包括整数运算和分数运算。
关系:
calc() 解析 Expression 传入的字符串,并计算结果。
计算后的 Fraction 结果会返回给 Expression,再进行格式化。
(5)主函数(main.cpp)
作用:
解析命令行参数,调用 ExerciseGenerate 生成题目或 calculator 进行计算。
关系:
读取用户输入,调用 ExerciseGenerate 生成题目。
计算结果,并与答案进行对比。

代码说明

  1. 代码结构
    Fraction.h / Fraction.cpp(分数处理)
    负责分数的数据结构和基本运算,如化简、转换字符串等。
    Expression.h / Expression.cpp(表达式处理)
    负责存储数学表达式,支持带括号的四则运算,并计算结果。
    ExerciseGenerate.h / ExerciseGenerate.cpp(题目生成)
    负责随机生成四则运算表达式,包括整数和分数。
    calculator.h / calculator.cpp(计算逻辑)
    解析数学表达式,进行分数和整数的运算,并校验表达式合法性。
    main.cpp(主程序入口)
    解析命令行参数,调用生成和计算逻辑,并输出结果。
  2. 代码功能分析
    (1) 分数处理 (Fraction 类)
    负责存储和处理分数,包括:
    integer(整数部分)、molecule(分子)、denominator(分母)。
    simplify():化简分数(求最大公约数)。
    toWstring():转换为 wstring 格式,如 "1'2/3"。
    Fraction(wstring fraction):解析字符串创建分数对象。
    (2) 表达式处理 (Expression 类)
    Expression 代表一个四则运算表达式,存储:
    操作数(Fraction t[4]):最多支持4个操作数。
    运算符(wchar_t wOPERATER[3]):存储 + - × ÷。
    括号信息(bracketsNum[2]):支持不同括号模式。
    方法
    toWstring():将表达式转换成字符串,如 "(1'2/3 + 3/4) × 2"
    CalculateFraction():调用 calculator.cpp 进行计算,并存储结果。
    (3) 题目生成 (ExerciseGenerate 类)
    generateExpress():
    随机生成操作数(整数或分数)。
    随机生成运算符(+ - × ÷)。
    随机加入括号(不同优先级)。
    调用 Expression 类封装表达式。
    (4) 计算逻辑 (calculator.cpp)
    计算不同类型的运算
    calculatorFractionAndInt():分数 + 整数
    calculatorIntAndFraction():整数 + 分数
    calculatorFraction():分数 + 分数
    calculatorInt():整数 + 整数
    BasicCalculation():统一调用对应计算方法
    解析表达式并计算
    calc(wstring S, size_t len):
    解析字符串,检查是否有非法字符。
    处理括号,递归计算子表达式。
    按照运算优先级,计算 × ÷,再计算 + -。
    (5) 主程序 (main.cpp)
    两种模式
    生成题目
    复制
    编辑
    Myapp.exe -n 10 -r 100
    生成 10 道题目,数值范围 0-100,存入 Exercises.txt 和 Answers.txt。
    批改题目
    css
    复制
    编辑
    Myapp.exe -e Exercises.txt -a Answers.txt
    读取 Exercises.txt 并计算答案,与 Answers.txt 比较,统计正确和错误答案,输出到 Grade.txt。

测试运行

测试样例:https://github.com/Mosya-CX/Mosya-CX/tree/master/第三次作业/测试文件

项目小结

(1)结对编程的优势
在本次结对编程中,我们深刻体会到了团队协作的优势:

思维碰撞:两个人可以提供不同的视角,发现单人开发时容易忽略的问题。
代码质量提升:在代码审查(Code Review)过程中,相互指出潜在的错误,提高代码规范性。
效率提升:任务分工后,开发速度加快,比如一个人专注 数据结构设计,另一个人专注 算法实现,提高开发效率。
(2)我们在结对中的角色分工
在实际开发过程中,我们采用了 Driver & Navigator 角色切换模式:

Driver(驾驶员) 负责编写代码,实现具体逻辑。
Navigator(领航员) 负责思考全局设计,检查代码质量,并及时提出优化建议。
我们的具体分工如下:

A 负责 Fraction、Expression、ExerciseGenerate 的核心设计,确保数据结构合理性。
B 负责 calculator 计算逻辑的实现与优化,并完成 main.cpp 入口逻辑。
这种分工让我们在开发过程中 高效合作,同时也增强了代码的一致性。

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13326
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序
posted @ 2025-03-11 23:02  莫思娅_Mosya  阅读(98)  评论(0)    收藏  举报