GitHub地址: https://github.com/201571030116/sizeyunsuan
一、题目要求
尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习的命令行软件开发
软件基本功能要求如下:
- 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
- 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
- 当程序接收的参数为4时,以下为输出文件示例。
二、需求分析
1.程序可接收一个输入参数n
2.可以随机产生n道四则运算练习题
3.生成的数字范围为0-100
4.要求至少包含2种运算符,即运算符个数为2个或两个以上,可知随机产生的数字至少有3个
5.不能出现负数与小数
6.将学号与生成的练习题和答案输出并存储到result文件中
三、算法设计
1.随机生成3个或3个以上0-100的正整数
2.随机生成2-5个运算符,包含:+、-、*、/ 用0、1、2、3分别定义
3.判断减法运算时是否产生负数,是的话则排除;除法运算是否可以整除,不可以的话排除
4.定义运算符的优先级
5.接收参数n
6.随机组合产生n个运算式
7.输出随机产生的运算式和结果,存储到result.txt文件中
四、设计实现
由于对Java已经不是很熟悉,所以理清思路之后在网上查找了一些相关问答和博客,对于一些功能只是能大概了解所用函数但是无法实现(因为Java基础很差,学完之后也没有经常练习,比如判断优先级的堆栈和可以去括号的逆波兰式,在查了一些资料之后发现自己无法写出正确的代码来实现,就放弃了),所以在做的时候有投机取巧的现象,对于一些自己编码无法实现的功能用了投机的方法把老师要求的功能简化了,没有完全实现。(比如把生成的运算符的先后顺序和个数定死了,省去了判断优先级部分),大概的要求实现了,但是完成之后回过头来反思发现跟原来的设计思路有所差异,随机输出的运算式都被我认为定义成了由3个随机正整数和2个运算符组成的式子。对于函数这块的调用不太熟练所以采用了很笨很繁琐的办法来一个一个写输出。关于这些问题我希望自己能够在之后的学习中多下功夫钻研,争取能跟上老师和同学们的进度。
以下是我查找资料时所引用的博文地址:https://www.cnblogs.com/ziyixuedie/p/6492163.html
五:测试运行
六、核心代码
public class yunsuan { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub int x, y, i, a1; int d1 = 0; String d = null; System.out.println("请输入题目的数量"); BufferedWriter BufferedWriterbw = new BufferedWriter(new FileWriter("result.txt")); BufferedWriterbw.write("201571030116 "); Scanner scan2 = new Scanner(System.in); x = scan2.nextInt(); int daan[] = new int[x]; y=100; for (i = 0; i < x; i++) { int a = (int) (Math.random() * y);// 随机生成一个1-10的整数 int b = (int) (Math.random() * y);// 随机生成一个1-10的整数 int e = (int) (Math.random() * y);// 随机生成一个1-10的整数 int c = (int) (Math.random() * 4);// 随机生成一个1-4的整数,0表示加法,1表示减法,2表示乘法,3表示除法 if (c == 0) { d1 = a + b+ e; System.out.print(a + "+" + b + "+" + e + "= " ); BufferedWriterbw.write( a + "+" + b + "+" + e + "=" +d1+" " ); } if (c == 1) { d1 = a -b +e; int f = a - b; if(f<0){ i--; } else{ System.out.print(a + "-" + b + "+" + e + "= " ); BufferedWriterbw.write( a + "-" + b + "+" + e + "=" +d1+" " ); } } if (c == 2) { d1 = a * b + e; System.out.print(a + "*" + b + "+" + e + "= " ); BufferedWriterbw.write(a + "*" + b + "+" + e + "=" +d1+" " ); } if (c == 3) { d1 = a / b * e; int f = a%b; if(f!=0){ i--; } else{ System.out.print(a + "/" + b + "*" + e + "= " ); BufferedWriterbw.write(a + "/" + b + "*" + e + "=" +d1+" " ); } } if ((i + 1) % 3 == 0) { System.out.println(); } } BufferedWriterbw.flush(); } }
七、总结
很久没有用Java写过这样一个相对来说比较复杂的程序了,其实大部分的时间不是花费在敲代码上,是花费在复习和寻找某个功能的解决方法上。说来惭愧,Java基础一直很差的我当年还抱着考过了这门课就万事大吉了的心态,现在想来当时那种不负责任的态度对现在造成的影响可以说是很大了。在这一周的时间里开始恶补Java,但是短短的一周也没有起到太大的作用,反而把这次作业一拖再拖。在完成的过程中也是在自己探索的基础上借鉴网上给出的一些最基础的算法还有同学的帮忙才算勉强完成任务。
这次作业比起上次提问题来难度突然增大了不少,让我有些慌乱。但是这是我真正意识编程这件事不是只靠写代码就能完美解决的。需求分析和算法设计在这种相对较难的程序中扮演着举足轻重的角色,如果一味的埋头敲代码,那碰到一个需求就得转换一下思路,这样缝缝补补不仅浪费时间,写出来的代码也不够精炼。总之这次作业中在个人能力方面收获最大的还是知道了需求分析和算法设计的重要性,这两步在之后的编程过程中不可或缺。
还有一个很深的感触,以前一直觉得只有Deadline临近才能催发灵感事半功倍,于是这几天我一次又一次在这种刺激里探索和尝试,最终的结果与我所料也相差无几,每次都能做到Deadline的一半——Dead。 虽然是句玩笑话,但是我真的意识到完成作业这件事赶早不赶晚,不下功夫是不会有所谓的灵光乍现的,踏踏实实做功课才是道理。
八、PSP展示
PSP2.1 |
任务内容 |
计划完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
15 |
20 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10 |
10 |
Development |
开发 |
480 |
600 |
·· Analysis |
需求分析 (包括学习新技术) |
20 |
25 |
· Design Spec |
· 生成设计文档 |
10 |
15 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
60 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
具体设计 |
20 |
30 |
· Coding |
具体编码 |
240 |
400 |
· Code Review |
· 代码复审 |
20 |
20 |
Test |
· 测试(自我测试,修改代码,提交修改) |
10 |
40 |
Reporting |
报告 |
60 |
120 |
·· Test Report |
· 测试报告 |
20 |
30 |
Size Measurement |
计算工作量 |
10 |
10 |
·Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
10 |
15 |