你妈咪喊你回家刷题~~

MathExam——实现小学一二年级算数题文本写入

一、预估与实际

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
• Estimate • 估计这个任务需要多少时间 5 3
Development 开发
• Analysis • 需求分析 (包括学习新技术) 90 60
• Design Spec • 生成设计文档 20 20
• Design Review • 设计复审 10 30
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30
• Design • 具体设计 30 20
• Coding • 具体编码 360 600
• Code Review • 代码复审 20 20
• Test • 测试(自我测试,修改代码,提交修改) 50 70
Reporting 报告
• Test Repor • 测试报告 30 20
• Size Measurement • 计算工作量 30 20
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 30 30
合计 893

二、需求分析

我通过查阅网络资料的方式了解到,小学一二年级数学有如下的几个特点:

  • 加法运算的范围在正区间

  • 减法运算的结果不会出现负数情况

经过分析,我认为,这个程序应当:

  • 加法
    • 两个加数的数值在20以内
  • 减法
    • 两数之差应该在大于0
    • 被减数和减数的数值在20以内

三、设计

1. 设计思路

  • 第一步实现四则运算题目的生成

  • 第二步实现字符串写入文本

  • 第三步实现从命令行接受参数并传入程序运行

  • 最后修改若干Bug,规范代码名,完善代码,提升质量

  • ...

2. 实现方案

  • 准备工作:先在Github上创建仓库,克隆到本地,创建一个PSP文件夹

  • MyEclipse中创建一个类,包含主方法和各函数

  • 详情如下:

    • 3个重载的构造方法分别实现从入口函数接受不同个数的参数,确保接受的参数是空、一个参数、两个参数和多个参数时都可以运行

      • 接收空参数:题数默认值 = 10,年级 = 2

      • 一个参数:年级默认值 = 2

      • 两个参数无需使用默认值

      • 多个参数只接受前两个参数值

    • 定义一个无返回的inPut方法,接收两个从构造函数中传来的参数,判断是否符合判别规则,并赋值给题目数量年级

    • 定义一个带参无返回的算术题生成方法mathProblem,通过调用加减乘除四则运算的方法名循环输出算术题库

    • 定义一个无返回的outPut方法

      • 判断写入的文件是否存在,即在当前路径下创建out.txt文本

      • 创建文件写入流,将生成的算术题及标准答案写入txt文本中

  • 技术关键点:

    • 输入一个参数和多个参数不影响程序运行

    • 判断输入参数规范性

    • ...

四、编码

1. 调试日志

  • 日志一:
  • 字符串写入文本的方法中,调用系统时间代码会导入数据库的包,导致代码报错
import java.sql.Date;  容易导入数据库的类,使日期函数报错
Date date = new Date();

  • 解决方案:删除导入的sql类,重新导入util
import java.util.Date;
  • 日志二:
  • 将字符串写入文本时出错
string [] str_ArithmeticProblem;
fos.write(str_ArithmeticProblem[i]);

  • 解决方案:将String转换为文本可以识别的二进制码
byte[] b_ArithmeticProblem;
b_ArithmeticProblem = str_ArithmeticProblem[i].getBytes();

fos.write(b_ArithmeticProblem);

2. 关键代码

  • 通过正则表达式对输入参数进行规范性判断

  • 通过matches()方法赋予变量布尔类型

boolean flag1 = true;		//跳向异常语句

		boolean flag2 = true;

		

		Scanner in = new Scanner(System.in);

		String regex1 = "0*[1-9]{1}[0-9]{0,1}";		//正则表达式判断输入参数为非零正整数

		String regex2 = "0*[1-2]{1}{0}";

		Pattern pattern1 = Pattern.compile(regex1);

		Pattern pattern2 = Pattern.compile(regex2);

		Matcher matcher1,matcher2;

		

		while (true) {

			

			matcher1 = pattern1.matcher(str0);

			matcher2 = pattern2.matcher(str1);

			

			try {

				flag1 = matcher1.matches();

				flag2 = matcher2.matches();

				

				if(!flag1 || !flag2){		//两个参数不符合正则表达式规范

						throw new NumberFormatException();		

				} else {	

					count = Integer.valueOf(str0);

					grade = Integer.valueOf(str1);

				}

			} catch (NumberFormatException e) {

				// TODO: handle exception

				if(!flag1){

					System.out.println("输入错误,只能输入99以内的题目数量,请按规定重新输入题目数量 : ");

					str0 = in.next();

				} 

				if(!flag2){

					System.out.println("输入错误,年级为\"1\"或\"2\" ,请按规定重新输入年级 : ");

					str1 = in.next();

				}

				continue;

			}			

			in.close();

			break;

		}

3. 代码规范

本次实验使用的代码规范:

  • 类名使用 UpperCamelCase 风格

  • 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,遵循驼峰形式

  • 变量和常量的命名方式:

    • 非公有(private/protected/default)变量前面要加上小写m
    • 静态变量(static)前面加上小写s
    • 其它变量以小写字母开头
    • 静态常量(static final)全大写
  • 类型与中括号紧挨相连来定义数组

  • 大括号的使用约定。如大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:

    • 左大括号前不换行
    • 左大括号后换行
    • 右大括号前换行
    • 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
  • 左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格

五、测试

序号 测试代码 预期输出结果 实际输出结果
1 java MathExam6335 输出10道二年级算术题 和预期结果相符
2 java MathExam6335 0 输出0道二年级算术题 和预期结果相符
3 java MathExam6335 5 输出5道二年级算术题 和预期结果相符
4 java MathExam6335 5 1 输出5道一年级算术题 和预期结果相符
5 java MathExam6335 00005 1 输出5道一年级算术题 和预期结果相符
6 java MathExam6335 5 00001 输出5道一年级算术题 和预期结果相符
7 java MathExam6335 100 1 超出题数规定范围,重新输入 和预期结果相符
8 java MathExam6335 5 10 不符合年级参数输入规范,重新输入 和预期结果相符
9 java MathExam6335 a 1 不符合题数参数输入规范,重新输入 和预期结果相符
10 java MathExam6335 5 a 不符合年级参数输入规范,重新输入 和预期结果相符

六、总结

  • 代码规范一定要在开始便注意
  • 代码注释写好,便于自己忘记时快速记起这段代码的作用
  • 先对本次项目进行需求分析,避免重复修改代码时产生不必要的bug
  • 一开始便要构思好代码的编写流程,避免东一头西一头的写,造成效率低下
  • 基础打牢固,不然编写代码的时候会造成代码的繁杂,代码不会调用等尴尬的情况
  • 每次版本更新后都尽量提交到GitHub进行托管,方便更新迭代
posted @ 2018-09-09 11:48  中国制造  阅读(259)  评论(4编辑  收藏  举报