个人编程作业
一、预估与实际
PSP2.1 | Personal Softwar Process Stages | Estimated Time(hours) | Practical Time(hours) |
Planning | 计划 | 15 | 13 |
|
|
15 | 13 |
Development | 开发 | 12 | 10 |
|
|
1 | 1 |
|
|
0.5 | 0.5 |
|
|
0.5 | 0.5 |
|
|
0.5 | 0.5 |
|
|
0.5 | 2 |
|
|
5 | 3 |
|
|
0.5 | 0.5 |
|
|
0.5 | 2 |
Reporting | 报告 | 3 | 1.5 |
|
|
1 | 0.5 |
|
|
1 | 0.5 |
|
|
1 | 0.5 |
二、需求分析
我通过网上查询了解到,小学一年级数学的加减运算特点如下:
- 算式内的两个加数都应该小于20。
- 算式得出的结果应该小于20。
- 运算结果不能为负数。
小学二年级数学的乘除运算特点如下:
- 算式应为表内乘法。
- 当算式为除法时,两个因数都不能为零。
- 运算结果不能为负数。
- 算式为除法时数字应该小于81;
三、设计
1.设计思路
- 该程序只需要一个类,需要两个方法分别生成一年级或二年级的题目
- 需要一个方法生成out.txt文件并将第一步生成的题目写入out.txt文件
- 需要一个方法将out.txt文件内的内容打印输出
- 需要判断用户输入是否符合要求,如不符合,做出回应
2.计算关键点
- 技术关键点: 如何判断用户输入是否符合要求,并作出回应。先设定好符合预定格式的一个正则表达式,与用户的输入进行匹配,如不符合,提示用户重新运行程序,并给出正确的输入格式。
- 技术关键点: 如何将算式保存到out.txt文件中。定义两个字符串数组,分别将算式和答案保存到字符串数组中,将字符串数组作为参数传给生成out.txt文件的方法中即可。
- 技术关键点: 如何实现符号的随机生成。先生成一个随机数,以该随机数区间的二分之一为分界点,以生成随机数的大小相对于分界点的位置设置符号,如生成的随机数大于分界点时设为加法,反之设为减法
四、编码
1.调试日志
1.生成一年级减法数学计算题时,生成了结果为负数的算式。
-
- 解决方法: 当生成的算式为减法时,判断被减数是否大于减数,若返回false,则将被减数与减数互换。
2.生成二年级除法数学计算题时,生成了除数为0的算式。
-
- 解决办法:当生成的算式为除法时,重新生成被除数和除数,使得被除数和除数都不能为零。
3.生成二年级除法数学计算题时,生成了商小于1的算式。
-
- 解决办法: 当生成的算式为除法时,判断被除数是否大于除数,若返回false,则将被除数和除数互换。
2.关键代码
System.out.println("请输入:想要生成的题目数(1-100) 生成几年级的题目(1或2年级)"); String args1=args[0]; String args2=null; if(args.length>=2) { args2=args[1]; }else{ args2=1+""; } String input=args1+" "+args2; // 书写符合输入格式的正则表达式,过滤不符合格式的输入 String regex="(([1-9]|[1-9][0-9]|100)( ?)(1?|2{1}))"; int n; int grade; // 判断输入是否以空格结尾 int flag=0; if(input.matches(regex)){ //只输入题目数的情况,如:10 for(int i=0;i<input.length();i++){ if((input.substring(i,i+1)).equals(" ")){ flag=1; break; } } if(flag==0){ n=Integer.valueOf(input); grade=1; getFirstGradeMathSubject(n, grade); return ; } // 输入为题目数+一个空格的情况,如:10+一个空格 if(input.endsWith(" ")){ n=Integer.valueOf(input.substring(0, input.length()-1)); grade=1; getFirstGradeMathSubject(n, grade); return ; }else{ // 输入符合格式,如:10 1或2时的情况 String[] spiltArray=null; spiltArray=input.split(" "); n=Integer.valueOf(spiltArray[0]); grade=Integer.valueOf(spiltArray[1]); if(grade==1){ getFirstGradeMathSubject(n, grade); }else{ getSecondGradeMathSuject(n, grade); } return ; } }else{ System.out.println("输入格式错误!" + "请按照如下格式输入:\n想要生成的题目数(1-100)"+" " + "生成几年级的题目(1或2年级)" + "\n注:如果没有指定年级,则默认生成一年级数学的题目"); }
3.代码规范
- 类名使用UpperCamelCase风格
- 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
- 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
- 左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格
- if/for/while/switch/do等保留字与括号之间都必须加空格
- 大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
- 左大括号前不换行
- 左大括号后换行
- 右大括号前换行
- 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
- 任何二目、三木运算符的左右两边都需要加一个空格
- 方法参数在定义和传入是,多个参数逗号后边必须加空格
五、测试
测试编号 | 具体输入 | 预期结果 | 实际结果 |
1 | 0 | 格式错误!请重新输入...... | 符合预期 |
2 | 10 | 正常执行,生成10道一年级加减运算题 | 符合预期 |
3 | 10 1 | 正常执行,生成10道一年级加减运算题 | 符合预期 |
4 | 10 2 | 正常执行,生成10道二年级乘除运算题 | 符合预期 |
5 | 10 3 | 格式错误!请重新输入...... | 符合预期 |
6 | 1000 | 格式错误!请重新输入...... | 符合预期 |
六、总结
- 想清楚要做什么和怎么做很重要(需求分析和具体设计)。在做这项目之前,每当有学习任务,我都是直接开始敲代码,边敲便想,这样做效率很低,并且会出现很多的bug。主要原因就是没有预先计划好需要做什么和怎么做。这次项目我强迫自己先静下心来规划,大致规划好了之后才开始动手敲代码,发现敲代码的时间大大缩短了,并且bug少了很多,整个程序的逻辑也变得较为严谨。
- 基础知识很重要。在敲代码的时候有时候会发现自己知道要怎么做,也知道要用什么相关知识实现,但是由于不够熟悉,需要复习后才能知道具体怎么写,因此巩固好基础知识很关键,要能做到随想随用的地步。