个人编程作业

一、预估与实际

PSP2.1 Personal Softwar Process Stages Estimated Time(hours)  Practical Time(hours)
Planning 计划 15 13
  • Estimate
  • 估计这个任务需要多少时间
15 13
Development 开发 12 10
  • Analysis
  • 需求分析(包括学习新技术)
 1 1
  • Design Spec
  • 生成设计文档
0.5  0.5
  • Design Review
  • 设计复审(和同学审核设计文档)
0.5  0.5
  • Coding Standard
  • 代码规范(为目前的开发制定规范)
0.5  0.5
  • Design
  • 具体设计
0.5  2
  • Coding
  • 具体编码
5 3
  • Code Review
  • 代码复审
0.5  0.5
  • Test
  • 测试(自我测试、修改代码、提交修改)
0.5 2
Reporting 报告  3 1.5
  • Test Report
  • 测试报告
0.5
  • Size Measurement
  • 计算工作量
0.5
  • Postmortem & Process Improvement Plan
  • 事后总结,并提出过程改进计划
0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

二、需求分析

 我通过网上查询了解到,小学一年级数学的加减运算特点如下:

  1. 算式内的两个加数都应该小于20。
  2. 算式得出的结果应该小于20。
  3. 运算结果不能为负数。

小学二年级数学的乘除运算特点如下:

  1. 算式应为表内乘法。
  2. 当算式为除法时,两个因数都不能为零。
  3. 运算结果不能为负数。
  4. 算式为除法时数字应该小于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.代码规范

  1. 类名使用UpperCamelCase风格
  2. 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
  3. 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
  4. 左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格
  5. if/for/while/switch/do等保留字与括号之间都必须加空格
  6. 大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
    • 左大括号前不换行
    • 左大括号后换行
    • 右大括号前换行
    • 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
  7. 任何二目、三木运算符的左右两边都需要加一个空格
  8. 方法参数在定义和传入是,多个参数逗号后边必须加空格

 

五、测试

测试编号 具体输入 预期结果 实际结果
1 0 格式错误!请重新输入...... 符合预期
2 10 正常执行,生成10道一年级加减运算题 符合预期
3 10 1 正常执行,生成10道一年级加减运算题 符合预期
4 10 2 正常执行,生成10道二年级乘除运算题 符合预期
5 10 3 格式错误!请重新输入...... 符合预期
6 1000 格式错误!请重新输入...... 符合预期

 

六、总结

  1. 想清楚要做什么和怎么做很重要(需求分析和具体设计)。在做这项目之前,每当有学习任务,我都是直接开始敲代码,边敲便想,这样做效率很低,并且会出现很多的bug。主要原因就是没有预先计划好需要做什么和怎么做。这次项目我强迫自己先静下心来规划,大致规划好了之后才开始动手敲代码,发现敲代码的时间大大缩短了,并且bug少了很多,整个程序的逻辑也变得较为严谨。
  2. 基础知识很重要。在敲代码的时候有时候会发现自己知道要怎么做,也知道要用什么相关知识实现,但是由于不够熟悉,需要复习后才能知道具体怎么写,因此巩固好基础知识很关键,要能做到随想随用的地步。

 

posted on 2018-09-11 12:04  这真的是一个博客  阅读(175)  评论(6编辑  收藏  举报

导航