可爱的小学一二年级计算题
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 600 | 950 |
• Estimate | • 估计这个任务需要多少时间 | 600 | 950 |
Development | 开发 | 660 | 830 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 100 |
• Design Spec | • 生成设计文档 | 20 | 30 |
• Design Review | • 设计复审 | 10 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 60 | 50 |
• Coding | • 具体编码 | 500 | 550 |
• Code Review | • 代码复审 | 30 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 40 |
Reporting | 报告 | 70 | 80 |
• Test Repor | • 测试报告 | 30 | 35 |
• Size Measurement | • 计算工作量 | 20 | 15 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 950 |
二、需求分析
我通过上网的方式了解到,小学一年级数学有如下的几个特点:
- 特点1
都是正整数,范围在0-100以内 - 特点2
会100以内加减乘除法 特点3
相减的差不为0
经过分析,我认为,这个程序应当:- 使用的数字小于100
- 不能使用负数
除数不能为0
三、设计
1. 设计思路
说明你如何设计这个程序
比如:
- 这个程序有x个类,x个函数,函数之间的调用关系是怎样的?
- 关键函数的流程图是怎样的?
- 算法的关键的关键是什么?
- 运用随机数,查阅资料
- FileOutputStream的write()方法来写入文件。
- out.txt文本的建立和写入
可以凭自己意愿循环生成想要的题目与答案
2. 实现方案
写出具体实现的步骤
比如:
- 准备工作:下载Git管理仓库,并在GitHub上fork亓老师主页的MathExam2018仓库,并clone到本地;
技术关键点:关于文本创建的一系列方法,判断是一年级还是二年级,用两个StringBuffer分别表示题目与答案,用append方法连接起来
四、编码
查到math.random()是生成随机数的方法
第二位随机数根据第一位的值限制范围,即可以不会发生差值为负的情况
将字符串数组转换成byte,再用FileOutputStream的write()方法来写入文件。
1. 调试日志
cmd输入文件的未换行,经过查询知道cmd换行符/r/n
想要循环进程从头开始,问题在于没给再一次输入参数,所以参数一直保持不变,解决方法是加一个控制台输入。
修改了输入“abcd”字符的结果
2. 关键代码
for(i=0;i<n[0];i++) {
int a=(int)(Math.random()10+1);
int b=(int)(Math.random()10+1); // 保证除数不为0
int c=(int)(Math.random()2);
if(c%2==0) {
System.out.println("("+(i+1)+")"+a+"x"+b+"="); // 乘法运算
qs = new StringBuffer("("+(i+1)+")"+a+"x"+b+"=");
rs = new StringBuffer(" "+(ab));
as[i]=("("+(i+1)+")"+a+"x"+b+"=");
qs.append(rs);
cs[i]=qs.toString();
}
乘法算法
for(;;) {
int flag=4;
int[] n =new int [args.length] ;
n[0]=Integer.parseInt(args[0]);
n[1]=Integer.parseInt(args[1]);
if(args[0].length()>5 && Integer.parseInt(args[0])>100) {
System.out.print(" 输入的题目数太大"); // 限制题数过大
flag=0;
}
if(Integer.parseInt(args[1])>2) {
System.out.print(" 输入的年级数太大"); // 限制年级数过大
flag=1;
}
if(n[0]<=0 && !args[0].matches("\d")) {
System.out.print(" 输入的题目数不对,应为正整数"); // 限制题数为正整数
flag=2;
}
if(n[1]<=0 && !args[1].matches("\d")) {
System.out.print(" 输入的年级数不对,应为正整数"); // 限制年级数为正整数
flag=3;
}
if(flag!=4) {
System.out.println("\n"+"请输入题目数与年级"); args[0]=sc.next();args[1]=sc.next();continue;
}// 如果输入的两个参数不对 则继续输入 直至正确为止控制输入参数的规范
3. 代码规范
- 第一条:注释的双斜线与注释内容之间有且仅有一个空格
- 第二条:左小括号和字符之间不出现空格;同样的,右小括号和字符之间也不出现空格
- 第三条:避免类似的名字,或者仅仅是大小写不同的名字
- 第四条:左大括号后换行
第五条:注释的双斜线与注释内容之间有且仅有一个空格
五、测试
- 输入 10 0 输出:输入的年级数不对,应为正整数
请输入题目数与年级 - 输入 -10 1 输出:输入的题目数不对,应为正整数
请输入题目数与年级 - 输入10 -1 输出:输入的年级数不对,应为正整数
请输入题目数与年级 - 输入10 3 输出:输入的年级数太大
请输入题目数与年级 - 输入-10 -1 输出:输入的年级数太大输入的题目数不对,应为正整数 输入的年级数不对,应为正整数
请输入题目数与年级 - 输入10 1输出正常
- 输入10 2输出正常
六、总结
- 敲代码前总觉得挺容易的,直到打完之后才发现有许许多多的问题。这种情况我觉得应该从一开始就规范好自己的代码,以便后续的寻找和修改,这对于自己与别人都好。刚开始写的时候真的是举步维艰,一个一个方法的查,一个一个人的问,写到能实现基础运算功能后又发现许许多多的错误,我才意识到思路有了之后一定要好好规划,不然写完了还要花大量的时间补代码。