你妈咪喊你回家刷题~~
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进行托管,方便更新迭代
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现