说不上高大上的第一次作业
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 710 | 840 |
• Estimate | • 估计这个任务需要多少时间 | 710 | 840 |
Development | 开发 | 710 | 840 |
• Analysis | • 需求分析 (包括学习新技术) | 100 | 110 |
• Design Spec | • 生成设计文档 | 10 | 20 |
• Design Review | • 设计复审 | 20 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 100 | 120 |
• Design | • 具体设计 | 60 | 90 |
• Coding | • 具体编码 | 180 | 220 |
• Code Review | • 代码复审 | 30 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 60 | 60 |
• Test Repor | • 测试报告 | 30 | 30 |
• Size Measurement | • 计算工作量 | 30 | 30 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 840 |
二、需求分析
我通过网站搜索方式了解到,小学一二年级数学有如下的几个特点:
- 特点1
小学一年级的数学题只有加减法的运算,而且两个加数不会大于100,但结果也不会超过100,即都为100以内的加减法。 - 特点2
小学一年级的数学题得出的结果不会出现负数的情况,,因此要避免出现负数的式子。 - 特点3
小学一年级的数学题会有相当一部分是图形结合让小孩子自己通过对图片的解读做数学运算(对这个作业没什么影响但是...确实有这个特点,能多打一点是一点) - 特点4
小学二年级的数学题有乘除法的基本运算,也有两个以上正整数的加减法,但题目好像没要求就不涉及了。
经过分析,我认为,这个程序应当:
- 每道题加减法的加数和减数不超过100,且如果是加法运算,和不会超过100;
- 减法题每道题的结果不会是负数。
- 最后要生成txt文件也要在屏幕上显示。
三、设计
1. 设计思路
说明你如何设计这个程序
-
想法是构建一个方法,负责产生随机数字并且运算,之后将输出结果写入txt文件;
-
产生随机数字和两数运算时:
- 1.保证两个数字不超过50;
- 2.如果是加法运算的话,两个数字的和不超过100;
- 3.如果是减法运算的话,不应该产生结果为负数的式子;
-
将输出结果写入到txt文件中;
2. 实现方案
写出具体实现的步骤
- 准备工作:
- 1.下载Git管理仓库,并在GitHub上fork亓老师主页的MathExam2018仓库,并clone到本地;
- 2.在本地仓库新建PSP6364文件夹,创建源文件MathExam6364.java
- 3.准备好Java环境,组装好Eclipse;
- 技术关键点:
- Math.radom()方法:Math.radom()方法是随机产生0.01.0的**浮点数**,但我们需要的是0100的随机整数,所以在运用时要使用强制类型转换(int);
- Math.random()>0.5?1:0 :在0.0 和1.0 中随机产生一个数字,两者概率为0.5;
- SimpleDateFormat():获取系统时间并且格式化为自己想要的形式;
- PrintStream类:先将系统输出流保存,然后创建一个新的输出流用来将结果输出到txt文件;最后将输出流换为系统输出流,将txt文件输出到屏幕。
四、编码
1. 调试日志
记录编码调试的日志,请记录下开发过程中的 debug 历程
比如:
-
在代码main函数的位置,while(flag)循环里出现了循环条件为1的情况,导致编译通不过;后来发现eclipse里while循环的条件是Boolean类型,而不是0或者1;
-
在代码main函数的位置,如果用户输入非数字或者输入多于两个数字或者多个空格则会显示异常;通过Stringarray类数组进行保存,并且以空格为分隔符,这样能够保证不正确的输入有相对应的提示。
-
在代码mathExam6364()方法里,如果是二年级的话会随机产生乘除法的运算,但是由于设置了一个条件(两个数乘积不超过100,但随机数又是1100),导致在做乘除法的时候乘法的式子很少;后来我仔细去百度了一下,将随机数改为120,这样就不会出现“一边倒”的情况了。
2. 关键代码
while(flag) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String stringArray[] = str.split(" ");// 使用" "空格来分隔字符串成一个字符串数组
if(stringArray.length > 1 ){ // 长度为1即默认只输入题目数目,年级为一年级
try {
num = Integer.parseInt(stringArray[0]);
grade = Integer.parseInt(stringArray[1]);
}catch(NumberFormatException e){
System.out.println("请正确输入!");
continue;
}
if (stringArray.length > 2) {
System.out.println("请正确输入!(题目数 年级)");
continue;
}
num = Integer.parseInt(stringArray[0]);
grade = Integer.parseInt(stringArray[1]);
if (num < 1 || num >10000) {
System.out.println("请输入1~10000的正数!");
continue;
}
if (grade != 1 && grade != 2) {
System.out.println("请输入正确的年级(1 or 2)");
continue;
}
break;
}
else {
try {
num = Integer.parseInt(stringArray[0]);
}catch(NumberFormatException e) {
System.out.println("请输入正整数的题目数!");
continue;
}
}
num = Integer.parseInt(stringArray[0]);
break;
}
这段代码的作用是用来判断用户的输入是否符合规定,是整个程序的关键代码。
3. 代码规范
- 第一条:方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式:
- static void mathExam6364(int num,int grade)
- 第二条:类名使用UpperCamelCase风格:
- public class MathExam6364
- 第三条:异常类命名使用 Exception 结尾:
- try {
num = Integer.parseInt(stringArray[0]);
}catch(NumberFormatException e) {
System.out.println("请输入正整数的题目数!");
continue;
}
- try {
- 第四条:左小括号和字符之间不出现空格;同样的,右小括号和字符之间也不出现空格:
- if (stringArray.length > 2)
- 第五条:任何二目、三木运算符的左右两边都需要加一个空格。
- k = num1 - num2;
- 第六条:注释的双斜线与注释内容之间有且仅有一个空格。
- // 产生第一个随机整数
- 第七条: if/for/while/switch/do等保留字与括号之间都必须加空格。
- while( flag )
- 第八条:左大括号后换行。
- if (stringArray.length > 2) {
System.out.println("请正确输入!(题目数 年级)");
continue;
}
- if (stringArray.length > 2) {
五、测试
测试输入 | 预测结果 | 实际结果 | 是否符合设计 |
---|---|---|---|
10 | 输出10道一年级数学题 | 正确运行 | 是 |
10 1 | 输出10道一年级数学题 | 正确运行 | 是 |
10 2 | 输出10道二年级数学题 | 正确运行 | 是 |
0 | 输出“请输入1~10000的正数!” | 输出“请输入1~10000的正数!” | 是 |
10001 | 输出“请输入1~10000的正数!” | 输出“请输入1~10000的正数!” | 是 |
-1 | 输出“请输入1~10000的正数!” | 输出“请输入1~10000的正数!” | 是 |
s | 输出“请输入正整数的题目数!” | 输出“请输入正整数的题目数!” | 是 |
s 1 | 输出“请正确输入!” | 输出“请正确输入!” | 是 |
10 3 | 输出“请输入正确的年级(1 or 2)” | 输出“请输入正确的年级(1 or 2)” | 是 |
10 1 2 | 输出“请正确输入!(题目数 年级)” | 输出“请正确输入!(题目数 年级)” | 是 |
10(多个空格)2 | 输出“请正确输入!(题目数 年级)” | 输出“请正确输入!(题目数 年级)” | 是 |
六、总结
- 使用了“软件开发的基本策略:分而治之”;
- 从刚开始看到作业脑海里浮现就是助教说的“看不懂”三个字,事实上也不是很难,但是我一旦看到巨多文字描述就觉得很难;后来不算特别仔细地看了一下任务要求后我关掉作业,静下心想了一下具体的思路,其实一下子就很清晰了。实际上,我java学的并不好(其他语言也没有学好真是抱歉),整个代码一些很主要的类,继承什么的都是网上查出来的,知道需要什么功能的方法,但是自己是一点都不清楚怎么写,都是通过各种博客看各种方法的简介和用法,最后一点一点拼凑出来的。不过庆幸的是自己确实没放弃,Github用了我一个半下午才搞清楚(但是后面用git提交确实搞不懂一直出错,user.name和user.email无论我怎么改都改不了 卸了重装还是之前的,后来提交上仓库的时候又出现error:403,我觉得出现错误就是因为那两个属性的问题),代码也是没课的下午网上查、跟舍友讨论一个一个自己打出来的。所以觉得老师醉翁之意不在这个作业完成地多完美,而是在我们到底有没有用心去写(?还是我想多了)