【软件工程基础】结对项目|四则运算

1.Github链接 https://github.com/FattyHappy/calculator

2.项目预估时间

 

 

 

 

 

 

3.项目实际实现时间

 

 

 

 

 

 

4.项目描述

4.1 需求分析

1. 功能需求 软件的功能需求分为三个部分。
支持一次性生成不超过 1000 道四则运算题目(包含括号),一个表达式中运算符个 数不会超过 10 个。要求所有题目都是合法的四则运算题,并且它们两两都不同构。
要求支持分数表示。 程序应当能接受用户输入的答案,并且判定对错。最后输出正确/错误题数与正确 率。
围绕上述功能,添加一个额外的运算符——乘方,可以用^或**两种表示方法。用 户应当可以自行设置采用何种表示。 应当注意乘方是从右往左计算的,即 2^3^3=2^27= 134217728。

         实现基本功能的命令行程序,并在此基础上添加了附加内容用户可以设置题目范围(多少个数字,用哪些运算符,要出多少题目),同时可以计算有多少题目正确和错误。也可以做普通计算器使用(注意:!!答题格式请严格按照readme里的格式要求!)

start 10:开始 生成10个式子
exit/quit:退出
help:查看帮助
setting:查看当前设置
setpower 0:设置乘方显示参数为0
setopnum 10:设置式子中的运算符数为10
answer 123:提交当前题目的答案为123

calc 2^(-3)**2:计算想要求解式子的值

 

 

2. 性能需求 运行时间限制:一分钟。空间限制:1GB。
3. 结构化需求分析与建模

    a. 数据建模

     实体有原表达式、转换生成的后缀表达式、进一步处理建出的判定树、表达式 的计算结果、用户输入的结果值。 考虑括号的问题,原表达式与后缀表达式应该是多对一的关系。 判定树是必须的,因为表达式同构的问题可以转化成判定树同构的问题。

       

b.功能建模

                  c.行为建模

4.2 算法描述

这里着重讲述我们判定树的生成,我们生成一个式子,在生成后缀表达式的同时就建立出判定树。把把字符栈S2和数字栈S1替换成两个节点栈,然后和后缀表达式求法一样处理。退栈时把S2.top的左右儿子设置为S1的前两个,并把S2.top()扔到S1中视为数字,最后S1剩下的唯一一个节点就是根,否则一定是异常。S2应当维护成一个优先级单调不减的栈,但考虑到乘方计算顺序从右往左,那么乘方采用单调递增维护方式。具体代码请查看源码中 solve函数

4.3 项目思路变更

一开始我们想用c++完成核心代码,然后用js调用,完成第三部分。结果发现太过艰难。

接着我们想用js调用exe,在本地读取exe生成的文档,前端的主界面已基本完成,但由于安全性和兼容性的问题,该方法实现起来也十分困难,

此时,我们项目的时间已经耗费了很多,转而开发其他的项目已经不太现实了。我们决定在命令行里充实我们的程序并且选取最后一个用动画介绍后缀表达式的生成。

4.4 项目演示

首先进入主界面,可以进行选择,如有不明白的,可以查看help

接下来设置一下我们所需要的乘方形式 和 所需要的操作符数

意为只可显示^做操作符,有五个操作符,详细请输入setting查看

接下来start 2,代表出两道题

我们可以看到必须要严格按照答题格式answer+答案

做完后会计算正确率

而且在做题的过程中可以随时更改设置,非常人性化。

并且还支持本身的计算功能,两种次方都可以

4.5 项目测试记录

1.环境的适配,该程序最开始只兼容VS和mingw,在ubuntu下无法运行

解决:加入判定,判断有没有宏定义GNUC

2.setpower修改不起作用

3.setopnum修改不会改变接下来式子符号数的问题

4.answer后面带一个有空格的式子无法识别

以上问题都是在不断测试中发现的,现在都已解决。

 

5.项目反思

在本次项目中,我们在命令行程序实现该项目完成度较高,并且能有不错的创新和较为人性化的设计。只是在项目开始前对于技术的评估和研究不够,导致浪费了很多时间。也体会到了一个简易的较为完整的项目的具体实现。希望自己能不断进步,

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注