小学生运算神器 ---你们不来试试?
优秀的我还是可以写出代码的嘛
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 1000 | 1500 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 20 | 20 |
• Design Spec | • 生成设计文档 | 30 | 40 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 40 | 30 |
• Design | • 具体设计 | 30 | 20 |
• Coding | • 具体编码 | 600 | 1000 |
• Code Review | • 代码复审 | 60 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | 70 | 120 |
• Test Repor | • 测试报告 | 20 | 30 |
• Size Measurement | • 计算工作量 | 10 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 1500 |
二、需求分析
我通过网上查询的方式了解到,小学一、二年级数学有如下的几个特点:
特点1
- 加法运算:和不超过100
- 减法运算:只进行100以内减法,且被减数比减数大
- 乘法运算:只进行表内乘除法,即因数都不大于10
- 除法运算:只在百内进行除法,且除数在10以内
- 不出现负数
经过分析,我认为,这个程序应当:
- 使用的数字小于100
- 被除数比除数大
- 被减数比减数大
- 结果要是正数
三、设计
1. 设计思路
说明你如何设计这个程序
- 程序分为1个类,3个方法。方法分别为运算的,测试参数大小的以及测试参数首位是否为0
- 整个程序的流程大致如下图:
2. 实现方案
写出具体实现的步骤
- 准备工作:先在Github上创建仓库,克隆到本地,之后在仓库中创建文件夹,编写代码之后通过git传到github
- 技术关键点:
(1)运算代码的实现
(2)参数如何在命令行输入
(3)正则表达式判断参数是否为数字
(4)文件的输入输出
(5)日期格式的转化
四、编码
请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程
1. 调试日志
- 对输入的参数进行判断后报错的输出总是出错
解决方案:对if /else if/else 语句理解还不够透彻,没有灵活使用,后整顿心态慢慢试才成功。 - 没有输入参数直接运行,结果无任何显示,与预期结果不一致
解决方案:在还没判断输入的参数是否为数字之前进行判断,如果args的长度为0,则报错
2. 关键代码
请展示一段程序的关键代码,并解释代码的作用
/**
-
代码的作用:生成题目后将答案存入文档,显示当前时间
-
n : 生成的题目数量
-
m : 年级
public static void operation(int n,int m){ File file = new File("out.txt"); OutputStream out; try { out = new FileOutputStream(file); int[] an= new int[n]; int bn[] = new int[n]; String random = ""; String[] Symbol1= {"+","-"}; String[] Symbol2= {"*","/"}; if(m==1) { //判断年级 for(int i=0;i<n;i++) { int index = (int)(Math.random()*(Symbol1.length)); random = Symbol1[index]; //随机调用Symbol1中的元素 if(random.equals("+")) { int a = (int)(Math.random()*(50+1));//随机选择0~50之间的数 int b = (int)(Math.random()*(50+1)); System.out.printf("("+(i+1)+") "+a+" + "+b+" = "+"\n"); an[i]=a+b; String output = "("+(i+1)+") "+a+" + "+b+" = "+"\n"; out.write(output.getBytes()); } else{ int a = (int)(Math.random()*(100+1)); int b = (int)(Math.random()*a); System.out.printf("("+(i+1)+") "+a+" - "+b+" = "+"\n"); an[i]=a-b; String output = "("+(i+1)+") "+a+" - "+b+" = "+"\n"; out.write(output.getBytes()); } } } if(m==2) { for(int i=0;i<n;i++) { int index = (int)(Math.random()*(Symbol2.length)); random = Symbol2[index]; if(random.equals("*")) { int a = (int)(Math.random()*10); int b = (int)(Math.random()*10); System.out.printf("("+(i+1)+") "+a+" * "+b+" = "+"\n"); an[i]=a*b; String output = "("+(i+1)+") "+a+" * "+b+" = "+"\n"; out.write(output.getBytes()); } if(random.equals("/")) { int a = (int)(Math.random()*(100+1)); int b = 1+(int)(Math.random()*9); System.out.printf("("+(i+1)+") "+a+" / "+b+" = "+"\n"); an[i]=a/b; bn[i]=a%b; String output = "("+(i+1)+") "+a+" / "+b+" = "+"\n"; out.write(output.getBytes()); } } } String flag = "\n"; out.write(flag.getBytes()); //输入答案 Scanner in = new Scanner(file); int j=0; while(in.hasNextLine()&&j!=n) { if(bn[j]==0) { String s = in.nextLine()+an[j]+"\n"; out.write(s.getBytes()); } else { String s = in.nextLine()+an[j]+"..."+bn[j]+"\n"; out.write(s.getBytes()); } j++; } //时间 Date date = new Date(); String time = "yyyy年MM月 dd日 HH:mm"; SimpleDateFormat sdf = new SimpleDateFormat(time); String now = " 211606301 蔡振翼 "+sdf.format(date)+"\n"; out.write(now.getBytes()); out.close(); } catch (IOException e) { System.out.println("抛异常"); }
}
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条:常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长。
- 第二条:类型与中括号紧挨相连来定义数组。
- 第三条:不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
- 第四条:不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。
- 第五条:如果变量值尽在一个固定范围内变化用enum类型来定义
- 第六条:左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格。详见第5条下面正例提示。
- 第七条: if/for/while/switch/do等保留字与括号之间都必须加空格。
- 第八条:采用4个空格缩进,禁止使用tab字符
五、测试
请思考并记录你认为必要的测试点,并记录测试用例与测试结果
参数个数 | 测试用例 | 结果 |
---|---|---|
1个参数 | java MathExam6301 1 | out文件正常存储题目及答案 |
java MathExam6301 0 | 题数首位不可为0! | |
java MathExam6301 1 2 | 只可输入一个参数! | |
java MathExam6301 a | 题数需为正整数! | |
java MathExam6301 100000 | 题数输入的数字太大! | |
java MathExam6301 00001 | 题数首位不可为0! | |
java MathExam6301 -1 | 题数需为正整数! | |
java MathExam6301 | 请输入参数! | |
2个参数 | java MathExam6301 10 2 | out文件正常存储题目及答案 |
java MathExam6301 10 | out文件正常存储一年级题目及答案 | |
java MathExam6301 2 2 5 | 只可输入两个参数! | |
java MathExam6301 5 d | 年级需为正整数! | |
java MathExam6301 d 2 | 题数需为正整数! | |
java MathExam6301 d d | 题数需为正整数! | |
java MathExam6301 001 2 | 年级和题数首位任何一个都不可为0! | |
java MathExam6301 4 0001 | 年级和题数首位任何一个都不可为0! | |
java MathExam6301 0001 00002 | 年级和题数首位不可为0! | |
java MathExam6301 | 请输入参数! |
六、总结
写完代码的感觉很棒,但是有自知之明,我的代码并不算好,有过多的代码冗余,完全可以用更好的方法来写但是我不会。
在写代码初期的时候自己并没有规划好怎么进行,就按着思路去做,结果一卡就卡死了,总要想很久才能有所突破,好几次测试的时候要改动代码头脑就像开花一样什么懂不清楚,浑浑噩噩的,硬是花了将近一天的时间才把bug调整好。我硬是想了想自己花在这个项目上的时间,有四天,当然这还包括了上课。哪里不好自己是最清楚不过的,我虽然花了很多时间,但相比那些大佬们我是自愧不如,所谓的事半功倍是给他们的,我是事倍功半。但是我是不会放弃的。这是之前不好好读书欠下的债,得自己慢慢不回来。