2016012058+小学四则运算练习软件项目报告
代码仓库地址:https://git.coding.net/jyuegq/project1.git
测试效果见src下的result.txt文件
一、需求分析
基本功能
1、使用JAVA语言。
2、程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
3、为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,练习题在运算过程中不得出现负数与非整数。
4、将学号和生成的练习题及对应答案输出到文件“result.txt”中,不输出额外信息。
5、当程序接收的参数为4时,以下为一个输出文件示例。
2018010203
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
扩展功能:
1、支持有括号的运算式,包括出题与求解正确答案。
2、扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。
二、功能设计
1、基本功能:
(1)、保证输入的是数字或者特定字符,如果不符合要求,会有提示输入有误。
(2)、当输入一个参数n,随机产生n道加减乘除算术题。保证生成的每个练习题至少要包含2种运算符,最多有5个运算符。考虑到对象是小学生,在运算式中和过程结果都不能出现负数和小数。
(3)、将生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致;
2、扩展功能:
(1)、可实现运算式中对括号的计算,对运算符进行优先级管理。
(2)、可实现真分数的运算,并对结果自动化简。
三、设计实现
关于计算使用了逆波兰表达式,也就是后缀表达式。它能将复杂表达式转换为可以依靠简单的操作得到计算结果,仅靠入栈和出栈这两种简单操作就可以搞定任何普通表达式的运算。如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
产生6个随机数的语句:
int a=(int)(Math.random()*100);
int b=(int)(Math.random()*100);
int c=(int)(Math.random()*100);
int d=(int)(Math.random()*100);
int e=(int)(Math.random()*100);
int f=(int)(Math.random()*100);
利用switch语句判定运算符的生成,再定义int g=(int)(Math.random()*4);随机生成一个0-3的整数,0表示3个运算数,1表示4个运算数,2表示5个运算数,3表示6个运算数。根据输入的整数n进行for循环,再根据g的不同值来确定运算式中有多少运算数然后利用逆波兰表达式计算结果。
我只写了一个类,在这个Main.java类中调用不同的方法;分别设计了3、4、5、6个运算数的方法。
四、算法详解
算法使用的是逆波兰表达式。
参考博客《调度场算法与逆波兰表达式》:https://blog.csdn.net/acdreamers/article/details/46431285
五、测试运行
在Main.java所在目录打开命令窗口,输入javac Main.java ,回车,再输入java Main回车,这时会提示“请输入一个整数n”,当输入-5时,命令窗口提示错误。当输入0到1000的整数,命令继续执行,并生成相应的txt文件,如图。
六、总结
看了很多的博客,查了很多信息,也看了别人对随机生成数和运算符的算法后,觉得自己的代码很僵硬,不够灵活。如果计算有6位、7位甚至更多的运算符,就还得继续在代码中加上相应的方法,可发展性不高。说明前期考虑不足,而在后期具体实践中代码经验不足,很难写出既简明又高效的代码,导致成型的代码价值性不高。让我明白前期的构思十分重要,往往会是一个项目质量高低与否的重要因素。
不过这个在我看来很难完成的项目总算是收官,熬夜的辛苦没有白费。过程是痛苦的,但结果是欣慰的。这一次的个人项目使本就代码量不足的我积累了经验。
七、PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
60 |
75 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
15 |
Development |
开发 |
120 |
150 |
Analysis |
需求分析 (包括学习新技术) |
60 |
120 |
Design Spec |
生成设计文档 |
20 |
10 |
Design Review |
设计复审 (和同事审核设计文档) |
10 |
8 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
15 |
20 |
Design |
具体设计 |
40 |
30 |
Coding |
具体编码 |
240 |
350 |
Code Review |
代码复审 |
20 |
15 |
Test |
测试(自我测试,修改代码,提交修改) |
30 |
20 |
Reporting |
报告 |
30 |
35 |
Test Report |
测试报告 |
10 |
7 |
Size Measurement |
计算工作量 |
5 |
8 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
20 |
25 |