keep hard!
一、预估与实际
PSP2.1 | Personal Softwar Process Stages | Estimated Time(分钟) | Practical Time(分钟) |
Planning | 计划 | 600 | 550 |
|
|
600 | 550 |
Development | 开发 | 570 | 570 |
|
|
80 | 60 |
|
|
70 | 50 |
|
|
20 | 30 |
|
|
30 | 40 |
|
|
30 | 30 |
|
|
250 | 280 |
|
|
30 | 20 |
|
|
60 | 60 |
Reporting | 报告 | 60 | 50 |
|
|
20 | 20 |
|
|
20 | 10 |
|
|
20 | 20 |
二、需求分析
我通过上网百度查询了解到,小学一年级数学的加减运算特点如下:
- 不会出现小数
- 运算结果数字不超过百
- 运算结果不存在负数
小学二年级数学的乘除运算特点如下:
- 运算应为表内乘法
- 算式为除法时被除数和除数均不能有0
- 运算结果不存在负数
三、设计
1.设计思路
- 分别写两个方法生成一年级和二年级的题目
- OutPutFile()函数将题目和答案输出到out.txt文件
- 写一个方法将out.txt文件内的内容进行打印输出
- 主方法判断用户的输入方式
- 算法的关键:
- 判断输入的参数是否合法,对于不合法的各种情况需给予提示
- 生成的数字是否满足大纲要求时的判断逻辑
2.实现方案
写出具体实现的步骤
- 准备工作:
- 先在Github上Fork仓库,再克隆到本地
- 编写任务1代码
- 在任务1的基础上改进逻辑并增加任务2的功能
- 优化任务二代码,并增加注释
- 代码测试
- 技术关键点:拼接可变字符串、按需求产生随机数、文件io流、输入参数的各种判断
四、编码
1.调试日志
1.生成一年级减法数学计算题时,产生了结果为负数的算式。
- 解决方法: 当生成的算式为减法时,判断被减数是否小于减数,若返回true,则将它们互换。
2.OutPutFile()函数,将可变字符串转成二进制流打印却一直为空。
-
解决方法:发现在主函数创建的可变字符串str在init()函数里面又重新创建了一次,删除init()函数里面的str可解决问题。
2.关键代码
// 定义商和余数 | |
String quotient = null; | |
String remainder = null; | |
// 判断算式是乘法运算还是除法运算 | |
if (randomSign.equals("÷")) {// 当算式为除法时,重新生成两个因数,使得两个因数小于81 | |
numberOne = randomNumber.nextInt(80) + 1; | |
numberTwo = randomNumber.nextInt(80) + 1; | |
// 判断被除数是否大于除数 | |
if (numberOne > numberTwo) {// 判断是否能够整除 | |
if ((numberOne % numberTwo) == 0) { | |
quotient = numberOne / numberTwo + ""; | |
Result[i] = quotient; | |
} else { | |
quotient = numberOne / numberTwo + ""; | |
remainder = numberOne % numberTwo + ""; | |
Result[i] = quotient + "..." + remainder; | |
} | |
// 修改因数后要相应的修改算式 | |
Calculate[i] = "(" + i + ")" + " " + numberOne + ' ' + randomSign + ' ' + numberTwo + " = "; | |
} else { | |
// 当被除数小于除数时将被除数和除数互换 | |
if ((numberTwo % numberOne) == 0) { | |
quotient = numberTwo / numberOne + ""; | |
Result[i] = quotient; | |
} else { | |
quotient = numberTwo / numberOne + ""; | |
remainder = numberTwo % numberOne + ""; | |
Result[i] = quotient + "..." + remainder; | |
} | |
Calculate[i] = "(" + i + ")" + " " + numberTwo + randomSign + numberOne + " = "; | |
} | |
} else { | |
Result[i] = numberOne * numberTwo + ""; | |
} |
3.代码规范
- 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式
- 杜绝完全不规范的缩写,避免忘文不知义
- 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
- 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式
- if/for/while/switch/do等保留字与括号之间都必须加空格
- 大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
- 左大括号前不换行
- 左大括号后换行
- 右大括号前换行
- 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
- 避免采用取反逻辑运算符
- 方法参数在定义和传入是,多个参数逗号后边必须加空格
五、测试
测试序号 | 具体输入 | 预期结果 | 实际结果 |
---|---|---|---|
1 | java MathExam6325 0 | 警告!格式错误! | 符合预期结果 |
2 | java MathExam6325 10 | 正常执行输出10道1年级加减运算 | 符合预期结果 |
3 | java MathExam6325 10 1 | 正常执行输出10道1年级加减运算 | 符合预期结果 |
4 | java MathExam6325 10 2 | 正常执行输出10道2年级乘除运算 | 符合预期结果 |
5 | java MathExam6325 100 | 警告!格式错误! | 符合预期结果 |
六、总结
- 完成了第一次的作业收获蛮多,大部分时间都花在百度翻资料上了,此外我还发现在编写代码之前的准备工作是极其重要的,逐渐感受到‘分而治之’的道理。
- 代码重构是编程的一个关键点,巩固好基础知识也很关键,不然经常很多东西一头雾水,所以仍需努力!