题目地址:http://www.cnblogs.com/HQL0301/p/7502315.html
程序码云地址:https://gitee.com/bingo2464/four_operations__console
需求分析:
本程序是基于控制台的用来自动生成四则运算表达式,以及自动生成答案和批改的的程序;通过输入数字大小和题目数目来控制题目的生成;生成带有生成包含‘+’,‘-’,‘*’,‘/’,‘(’,‘)’的四则运算表达 式,题目的/为除号,表达式中的运算数皆为整数,但最后的结果包含分数,且最后的结果支持真分数的运算;程序支持1W道题目的生成,生成题目后将题目和题目的运算结果保存至文件保存。程序能够对生成的题目进行查重,允许生成重复题目,但重复信息会在最后的结果分析中显示;
功能设计:基本功能:程序自动生成题目及答案,学生答题后,程序进行判断对错。程序批量生成题目及答案至相应文档。学生答题后提交相应文档,程序进行分析并得出结果。
扩展功能:程序生成题目可能会有重复的,所以程序最后分析时应该给出查重分析。
高级功能:后序可以将基于控制台的条件去除,改为Web端或APP的形式。
.设计实现:
本次试验我一共用了8个类,其中
Create类生成题目类:通过生成随机数来控制是否生成括号和运算符,生成字符串型表达式,再通过集合的形式实现批量生成。
TreeNode类:二叉树定义类。
BinaryTree类:二叉树生成类;从尾部到头部扫描表达式,最先扫描到的不在括号中的加号或减号必为表达式运算的最后一次操作,将其置于根节点,若无加减号则将最先扫描到的不在括号中的乘号或除号置于根节点,将表达式由此位置分为两个字串,重复此操作,直到表达式全部为二叉树的节点,其中必然有 数字位于叶节点。
IsZero类:判断分母是否为0;因为有括号的加入,所以我们必须保证除号后面的括号内的运算结果不为0;Create类在批量生成题目是必须先调用此类的getZero函数 来判断分母是否有为0的可能,若有则此表达式要重新生成。因为一开始没有考虑这个问题,所以出现了问题,解决此问题我采用了递归的思想计算除号的右字树。
Fraction类:分数类;因为考虑到分数的情况,后来才添加进来的一个类;因为运算数一开始都为整数只是因为有除号的出现才有分数的出现,所以我们将整数表达为整数/1的分数形式,在进行分数的各项加减乘除运算;因为运算时并没有得到最简式,所以还应当对其进行约分(anonym函数)
Answer类:生成答案类;在将表达式生成二叉树后,采用递归的思想,调用分数类,先计算二叉树的左子树,将返回结果与计算右子树得到的结果进行计算,得到 结果,最后因为答案的生成形式为真分数的形式,所以在调用分数类的FrcToStr函数将分数转化为真分数的形式(字符串的表达式);
Repeat类:查重类;将IsRepeat函数将两科树进行比较,若两棵树的根节点相同,比较其树1 的左子树与树2的左子树是否一样且树1 的右子树与树2的右子树是否一样;当其根节点为加号或乘号时,还需考虑树1的左子树与树2的右子树,树1耳朵右子树与树2的左子树相同的情况。
Result类:得到结果类;将学生提交的答案文档与程序生成的标准答案进行比对来判断对错;并将结果和题目重复信息显示到result.txt中。
test类:包含主函数。
测试运行:
程序运行截图:
![](https://i-blog.csdnimg.cn/blog_migrate/24e2a887d9a315554be7d9c4b60f1510.png)
exam.txt:生成的题目为:
![](https://i-blog.csdnimg.cn/blog_migrate/b1e1bdd0468804c48d6daff654be2fad.png)
answer.txt:生成的答案为:
![](https://i-blog.csdnimg.cn/blog_migrate/432be6553601003d2a98e131918a80ee.png)
在a.txt中输入答题答案
![](https://i-blog.csdnimg.cn/blog_migrate/1b54d37952d019e2e713cd75afe6ed51.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4881ef6cc5950c3b868325759874eaf4.png)
result.txt 得到结果
![](https://i-blog.csdnimg.cn/blog_migrate/9b1ee0901a3e60b58b5bd8fca0fdefaf.png)
展示PSP:
这是一个不知道该怎么填写的表。
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time | |
Planning | 计划 | 30 | 20 | |
· Estimate | 估计这个任务需要多少时间 | 800 | 700 | |
Development | 开发 | 600 | 500 | |
· Analysis | 需求分析 (包括学习新技术) | 10 | 5 | |
· Design Spec | 生成设计文档 | 30 | 40 | |
· Design Review | 设计复审 | 10 | 10 | |
· Coding Standard | 代码规范 | 10 | 10 | |
· Design | 具体设计 | 20 | 15 | |
· Coding | 具体编码 | 600 | 500 | |
· Code Review | 代码复审 | 10 | 10 | |
· Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 | |
Reporting | 报告 | 30 | 60 | |
· | 测试报告 | 10 | 10 | |
· | 计算工作量 | 10 | 10 | |
· | 并提出过程改进计划 | 5 | 5 | |
| | | | |
小结:
本次实验采用了String类型的四则运算表达式,因为一开始没有考虑括号的情况,所以只考虑了/后面不能劫数字0的情况,后面加了括号就出现了类似1+/(4-4)的除号后接0的情况,索性后来测试的时候发现了,解决这个问题我采用了建树计算/右子树是否为0的情况,因为在此就建了树,可能比较浪费内存,但目前为止我还没有想到更好的办法解决它。本程序还存在一个问题是忽略了÷和/的区别,生成表达式的中只有/代表除号,就导致了生成的表达式的运算数必为整数,为整数的四则运算或者可以说表达式没有区分真分数,虽然在计算结果的时候有采用真分数的形式但还不够完善。