第一次结对编程作业

 

 

211606330 王建木 211606345 翟堂贵

一、预估与实际

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

二、需求分析

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

  • 运算符在2~4个,可以加括号,一对括号算一个运算符,"="不算运算符
  • 减法运算的结果不能为负数
  • 除法运算不能有余数,除数不能为零
  • 算式内最多只能有一对括号,并且括号不能无意义
  • 能在命令行模式下正常运行
  • 算式结果小于10000
  • 需要保留之前1-2年级出题器的功能
  • 输入格式为-n 题目数 (1-100) -grade 年级(1-3)或-grade 年级(1-3)-n 题目数(1-100)
  • 生成题目后需要将题目和答案保存到out.txt文件中并打印输出

三、设计

 1.设计思路

  1. 设计getThirdGradeMathSubject方法,根据随机生成的运算符的个数(2-4)分别调用handleTwo、handleThree、handleFour方法处理
  2. 判断是否需要添加括号,若为true,则调用getBrackets方法返回添加完括号的运算符串;
  3. 根据是否添加括号分别调用priotitySort和prioritySortWithoutBrackets方法分别对传入的运算符串进行优先级排序,分别返回排序完成后带括号和不带括号的运算符串
  4. 遍历第三步生成的运算符串,循环调用handleSign方法,根据当前遍历到的运算符(+,-,×,÷)进行不同的处理。handleSign方法接收如("+",100)的参数,生成第二个操作数和运算后的结果,并将操作数和结果用整形数组保存并返回。当传入的运算符为"÷"时调用getFactor方法保证操作数2为传入的操作数1的因数,保证除法运算的结果为整数。
  5. 遍历结束后将得到的操作数数组和排序完成的运算符数组重新排列,生成算式和答案并返回即可。

 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. 基础知识很重要。在敲代码的时候有时候会发现自己知道要怎么做,也知道要用什么相关知识实现,但是由于不够熟悉,需要复习后才能知道具体怎么写,因此巩固好基础知识很关键,要能做到随想随用的地步。

 

猜你喜欢

转载自www.cnblogs.com/anpaishangle/p/9688831.html