MathExam285
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 390 | 410 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 60 | 30 |
• Design Spec | • 生成设计文档 | 10 | 10 |
• Design Review | • 设计复审 | 5 | 5 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 20 | 20 |
• Coding | • 具体编码 | 120 | 150 |
• Code Review | • 代码复审 | 30 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | 70 |
• Size Measurement | • 计算工作量 | 5 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 410 |
二、需求分析
我通过上网浏览的方式了解到,小学一年级数学有如下的几个特点:
-
特点1
-
知识结构分为数与代数、空间与图形、统计与概率。
-
特点2
-
数与代数中使用的数字仅限于10以内的加减法。
经过分析,我认为,这个程序应当:
- 使用的数字小于10,但是计算出的答案不在此范围之内。
- 四则运算只考虑其中的加法和减法。
三、设计
1. 设计思路
实验一:
这个程序在经过思考之后,我分为三个部分:
- 文件的输入和输出:在程序中由于最终的目的是创建一个out.txt的文件并向里面写入题目和答案。所以我打算创建一个输入方法和输出方法用来随时进行调用。
- 题目的产生:在读取用户键入的题目的数量后,我需要单独创建一个方法(gradeOne)用来随机产生一年级的数学题目。
- 用户的输入:用户的输入可能不符合我们预期的猜想,所以要对用户的输入进行错误处理,防止程序崩溃。
实验二:
这是在实验一的基础上新增功能,所以我在考虑之后分为两步:
- 新增2个参数的命令行输入并不影响实验1的命令行执行方式:通过判断args数组的长度可以推断出输入了几个参数。
- 在算法中新增四则运算中的乘法和除法
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地。
实验一:
- 技术关键点:文件的输入和输出在转换时要转换成机器能识别的语言,在随机产生的题目中计算出的答案如何保存并在题目之后再一次写入到out.txt中,错误处理是否考虑的完全。
实验二:
- 技术关键点:如何编写代码才能实现程序在输入1个参数和2个参数的时候都能运行。
四、编码
1. 调试日志
实验一:
- 首先我就是先去尝试着使用java创建一个out.txt的文件,并向其中写入任意数据就行试验,但在一开始我就遇到了在字符串中使用 不能换行的问题。后面经过网上查阅资料后更正为 。
- 之后我开始研究如何产生一年级的数学题目,然后发现我自己对随机数产生的方法印象并不是很深刻,在我查阅了随机数的产生方法之后,这个问题也迎刃而解。
- 现在我开始进行错误处理,我考虑了用户可能输入的值超过int的范围,所以使用了判断数据位数的方法来防止。其他的还有值可能是负数、字符串等也考虑在其中并编写了相应的代码进行解决。
- 我少考虑了一种错误处理,也就是用户可能键入00000000000000001这种数值,这个问题会导致程序输出“输入的正整数数太大”并停止运行,所以我使用了replaceFirst的方法来处理。
实验二:
- 在经历过N次尝试和上网寻找资料后,里面的main函数中的(String[] args)的含义才写出输入参数个数不同的运行方法。
- 在进行除法的编码时发现,居然还需要保留余数!然后我就重写了gradeTwo()中的switch代码,使得程序满足用户的要求。
2. 关键代码
-
args[0]=args[0].replaceFirst("^0*", "");//用来去掉数字面前的0
-
out(str){
-
File file = new File("out.txt");//定义一个文件对象并令其指向一个文件位置
-
file.createNewFile();//在指定位置创建一个文件
-
BufferedWriter br = new BufferedWriter(new FileWriter(file,true));//建立一个缓冲对象,把文件内容转换成计算机能识别的对象
-
br.write(str+" ");
-
br.flush();
-
br.close();
-
}
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条:驼峰式命名风格
- 第二条:不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
- 第三条:大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:左大括号前不换行。左大括号后换行。右大括号前换行。右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- 第四条:单行字符数限制不超过120个
- 第五条:没有必要增加若干空格来是耨一行的字符与上一行对应位置的字符对齐。
- 第六条:在一个switch块内,每一个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使空代码。
- 第七条:在 if/else/for/while/do 语句中必须使用大括号。
- 第八条:避免采用取反逻辑运算符。
五、测试
实验一:
- 输入题目的数量极大:java MathExam285 10000000000000000000,输出:输入的正整数数太大。
- 输入题目的值为非数字的字符串:java MathExam285 asdasd,输出:只能输入正整数。
- 输入题目的值为负数:java MathExam285 -3,输出:只能输入正整数。
- 正常输入:java MathExam285 5,输出:(out.txt文件中写入了题库和答案)
实验二:
- 输入题目的数量极大:java MathExam285 10000000000000000000 1 ,输出:输入的正整数数太大。
- 输入题目的值为非数字的字符串:java MathExam285 asdasd 2,输出:只能输入正整数。
- 输入题目的值为负数:java MathExam285 -3 1,输出:只能输入正整数。
- 正常输入:java MathExam285 5 1,输出:(out.txt文件中写入了题库和答案)
- 正常输入:java MathExam285 5 2,输出:(out.txt文件中写入了题库和答案)
- 正常输入:java MathExam285 5,输出:(out.txt文件中写入了题库和答案)
六、总结
通过这一次的代码编写,我发现在编写代码之前的准备工作是极其重要的。准备工作如果有做好,那么接下来的工作就起到了事半功倍的作用,相反,如果没有去做准备工作而是直接上手写代码,那么将会一头雾水。另外,代码的排版也是我感悟良多,一个优秀的规范代码无论对于他人还是自己都是益处多多的,代码上面的注释还可以使他人在阅读的时候便于理解而且自己在回顾的时候也能起到作用。
代码重构也是编程的一大关键,重构后的代码看起来相当清爽并且简单易懂,不过这一点我做的还不够好,接下来还需要努力。