2017年秋季学期软件工程第二次作业

源代码链接:https://github.com/FredaCao/homework1.git

一. PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
Estimate 估计这个任务需要多少时间 255 260
Development 开发 150 165
Analysis 需求分析 10 暂无
Design Spec 生成设计文档 10 暂无
Design Review 设计复审 10 暂无
Coding Standard 代码规范 10 5
Design 具体设计 10 30
Coding 具体编码 100 130
Code Review 代码复审 10  
Test 测试(自我测试,修改代码,提交修改) 20 30
Reporting 报告 30 30
Test Report 测试报告    
Size Measurement 计算工作量 5 5
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 30 20
合计   255 910

二. 解题思路

 软件基本功能

  1. 参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算,例如:1/6 + 1/8 = 7/24。操作数必须随机生成
  2. 运算符(operators)为 +, −, ×, ÷ (如运算符个数固定,则不得小于3)运算符的种类和顺序必须随机生成
  3. 要求能处理用户的输入,并判断对错,打分统计正确率。
  4. 使用 -n 参数控制生成题目的个数,或通过用户交互过程确定题目个数,例如执行下面命令将生成5个题目
    • (以C/C++/C#为例) calgen.exe -n 5
    • (以python为例) python3 calgen.py -n 5

 实现思路

  1. 四则运算采用将中序表达式转化为后缀表达式
  2. 将原来四则运算中的整数换成分数,抽象出分数的类,并实现+,-,x三个运算符的重载
  3. 计算后缀表达式的过程中将字符串转化为分数的类实例,然后使用重载的运算符进行计算
  4. 使用getopt方法来获取命令行中的参数
  5. 处理用户的输入并转化为分数类实例,通过==运算符判断是否正确

三. 设计过程

1. 分数类 包含分子分母两个类成员,+,-,x运算符实现过程中进行约分,先获得计算之后的分子分母最大公约数,再同时除以这个约数即可

2. 中序表达式转化后缀表达式 使用栈来存储优先级较低的运算符,当遇到运算符时,将相同和更高优先级的操作符出栈,并加入string流中,另外把带数字和带有分号的分数作为一个整体直接加入string流中,使用空格来分割

3. 后缀表达式计算,将字符串使用空格作为分隔符split,如果是代表数的字符串则构造分数对象,并入栈,如果是操作符则使用栈顶的第一个和第二个元素进行计算,计算完之后栈顶元素出栈,迭代后栈中只有一个元素即为所求

四. 代码说明

1. 乘法运算符重载

  • 分子与分子相乘,分母与分母相乘
  • 计算最大公约数,分子分母同时除以最大公约数

2. 计算后缀表达式

  • 将字符串使用空格作为分隔符split,如果是代表数的字符串则构造分数对象,并入栈,
  • 如果是操作符则使用栈顶的第一个和第二个元素进行计算,
  • 迭代之后最后一个元素即为所求

五. 代码截图

六. 项目小结

  中序表达式转化为后缀表达式的迭代过程结束之后,栈内可能还有操作符,此时需要注意一下先输入空格再依次出栈其他操作符。单元测试的编写应该采用更加自动化的过程,以后会尝试使用googletest框架。

原文地址:https://www.cnblogs.com/fredacao-123/p/8146732.html