高分小学计算器
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 780 | 995 |
• Estimate | • 估计这个任务需要多少时间 | 1080 | 1295 |
Development | 开发 | 480 | 595 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 60 |
• Design Spec | • 生成设计文档 | 10 | 10 |
• Design Review | • 设计复审 | 20 | 25 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 60 | 60 |
• Coding | • 具体编码 | 300 | 400 |
• Code Review | • 代码复审 | 20 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 600 | 700 |
Reporting | 报告 | 55 | 55 |
• Test Repor | • 测试报告 | 25 | 25 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1295 |
二、需求分析
我通过网络的方式了解到,小学一年级数学有如下的几个特点:
-
特点1
- 小学一年级:20以内不进位的加减法运算。
-
特点2
- 小学二年级:10以内的乘除法运算。
-
经过分析,我认为,这个程序应当:
-加减法使用的数字小于20
-乘除法使用的数字在10以内
三、设计
1. 设计思路
- 题目采用随机数的方法给出
- 题目的答案存于数组
- 利用比特流将答案和问题写入文件
- 需要设计三个过程,一年级、二年级、输出。
2. 实现方案
写出具体实现的步骤
比如:
- 准备工作:先在Github上创建仓库,克隆到本地...
- 技术关键点:
- 通过if、else判断条件来做continue继续下次循环还是break跳出整个循环。
- 利用随机数random()来产生题目。
- 第二位随机数根据第一位的个位数来限制最大取值范围。
- FileOutputStream的write()方法来写入文件。
- SimpleDateFormat的方法format()来获取当前系统时间。
四、编码
- 遇到要循环输入的问题,使用无线循环,然后通过if、else判断条件来做continue继续下次循环还是break跳出整个循环。
- 问题:出现死循环
- 利用随机数random()来产生题目,再用两个字符串数组来存储题目和答案,除法多一个余数存储数组。
-问题:出现数组空值或者越界 - 第二位随机数根据第一位的个位数来限制最大取值范围,即可产生无进制的数学题目。
- 将字符串数组转换成byte,再用FileOutputStream的write()方法来写入文件。
- SimpleDateFormat的方法format()来获取当前系统时间。
请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程
1. 调试日志
- 想要循环进程从头开始,代码在cmd中运行会导致死循环,问题在于没给再一次输入参数,所以参数一直保持在循环条件,解决方法是加一个控制台输入。
- 数组出现越界和空值的问题,给出现空值的数组赋上初值,越界的数组根据0和最后一个数字进行判断哪个地方出错,将有涉及数组的下表参数都从0开始,避免混乱。
- cmd输入文件的未换行,经过查询知道cmd换行符/r/n
2. 关键代码
if(m == 1) { //用随机数的方法来产生题目
for(int i = 0;i < n;i++){
int a = (int) (Math.random()*20);
int b = (int) (Math.random()*(20-a));
int c = (int) (Math.random()*2);
if(c == 0) {
System.out.println("("+(i+1)+")"+a+"+"+b+"=");;
questionlist[i] = "("+(i+1)+")"+a+"+"+b+"=";
answerlist[i] = " "+(a+b);
}
else {
b = (int) (Math.random()*a+1);
System.out.println("("+(i+1)+")"+a+"-"+b+"=");
questionlist[i] = "("+(i+1)+")"+a+"-"+b+"=";
answerlist[i] = " "+(a-b);
}
byte[] ba = questionlist[i].getBytes(); //利用比特流输入文件
String pa ="
";
byte[] ta = pa.getBytes();
in.write(ba);
in.write(ta);
}
}
else {
for(int i = 0;i < n;i++){
int a = (int) (Math.random()*9+1);
int b = (int) (Math.random()*9+1);
int c = (int) (Math.random()*2);
if(c == 0) {
System.out.println("("+(i+1)+")"+a+"*"+b+"=");
questionlist[i] = "("+(i+1)+")"+a+"*"+b+"=";
answerlist[i] = " "+(a*b);
}
else {
System.out.println("("+(i+1)+")"+a+"÷"+b+"=");
questionlist[i] = "("+(i+1)+")"+a+"÷"+b+"=";
answerlist[i] = " "+(a/b);
yushulist[i] = " "+(a%b);
}
byte[] ba = questionlist[i].getBytes();
String pa ="
";
byte[] ta = pa.getBytes();
in.write(ba);
in.write(ta);
}
}
- 使用随机数的方法来产生题目和字符串数组存储题目。
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
- 第二条左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格。
- 第三条任何二目、三木运算符的左右两边都需要加一个空格。
五、测试
- 输入规定范围外的数
- 输入-1,提示请输入大于0的正整数。
- 输入0或1来选贼继续出题或者退出,输入3,提示请输入大于0的正整数。
- 多次出题,未出现预定外的题目。
六、总结
-.敲代码总容易将简单的问题复杂化,我觉得写完应该认真排查,将不必要的代码简化。现在也许只有一百行左右的代码,但是养成好习惯,使用好代码规范,精简的代码有助于以后写代码。