MathExam
Posted yxmhl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MathExam相关的知识,希望对你有一定的参考价值。
小学一二年级数学题随机生成
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 560 | 715 |
? Estimate | ? 估计这个任务需要多少时间 | 560 | 715 |
Development | 开发 | 560 | 665 |
? Analysis | ? 需求分析 (包括学习新技术) | 30 | 25 |
? Design Spec | ? 生成设计文档 | 60 | 30 |
? Design Review | ? 设计复审 | 10 | 5 |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
? Design | ? 具体设计 | 70 | 50 |
? Coding | ? 具体编码 | 300 | 480 |
? Code Review | ? 代码复审 | 30 | 30 |
? Test | ? 测试(自我测试,修改代码,提交修改) | 40 | 30 |
Reporting | 报告 | 60 | 50 |
? Test Repor | ? 测试报告 | 30 | 30 |
? Size Measurement | ? 计算工作量 | 10 | 5 |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 20 | 15 |
合计 | 715 |
二、需求分析
我通过百度小学数学教学大纲的方式了解到,小学一年级数学有如下的几个特点:
- 特点1 数字范围小
- 特点2 运算内容简单
经过分析,我认为,这个程序应当:
- 小学一年级
- 使用的数字小于100且为20以内的加减法
- 运算类型为加减且不能有负数
- 小学二年级
- 使用的数字小于90
- 乘法运算应为表内乘法
- 除法运算的商和余数为一位数
- 运算类型为乘除且不能有负数
三、设计
1. 设计思路
- 用户输入的参数,需要正确识别且判断是否符合要求
- 随机题目生成,需要符合当前年级所学的知识且要满足运算规则
- 算法的关键有随机数的把握,加减法的分开处理且不能产生负数
- 文件的生成与写入
2. 实现方案
- 准备工作:先在Github上创建仓库,再用git克隆到本地
- 技术关键点:命令行参数的使用,随机符号的产生方式
四、编码
- 实现用户控制台输入并接收
- 使用随机函数生成随机运算式
- 将随机运算式保存在字符串数组中
- 本地创建一个out.txt文件,并向其中写入字符串数组的内容
- 将控制台接受输入改为命令行接收
- 处理命令行参数的问题如个数问题,非整数问题等等
1. 调试日志
- 随机数的生成时是上开下闭区间,导致无法正常取到20,通过将乘数+1来解决
- 判断参数只有一个时args[1]==null导致数组下标异常,将参数个数为1的情况判断单独判断解决问题
2. 关键代码
fuhao = (int)(Math.random()*2);
if (fuhao == 0) {
number1 = (int)(Math.random()*10);
number2 = (int)(Math.random()*10);
result = number1 * number2;
// 记录题目和答案
strArrayQ[i-1] = "(" + i + ") " + number1 + " * " + number2 + " =";
strArrayA[i-1] = "(" + i + ") " + number1 + " * " + number2 + " = " + result;
} else if (fuhao == 1) {
number1 = (int)(Math.random()*GRADE2_MAX);
do {
number2 = (int)(Math.random()*10);
} while (number2 <= (number1 / 10) || number2 == 0);
result = number1 / number2;
yu = number1 % number2;
// 记录题目和答案
strArrayQ[i-1] = "(" + i + ") " + number1 + " / " + number2 + " =";
if (yu == 0) {
strArrayA[i-1] = "(" + i + ") " + number1 + " / " + number2 + " = " + result;
} else {
strArrayA[i-1] = "(" + i + ") " + number1 + " / " + number2 + " = " + result + "..." + yu;
}
}
生成乘除运算式,并保存到字符串数组中,除法需要注意除数的取值,既不能为0也要使商和余数为一位数
3. 代码规范
- 第一条 类型与中括号紧挨相连来定义数组;
- 第二条 采用4个空格缩进,禁止使用tab字符;
- 第三条 在一个switch块内,每一个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使空代码;
- 第四条 在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式:if (condition) statements;
- 第五条 方法内部单行注释,在被注释语句上方另起一行,使用//珠海。方法内部多行注释使用/**/注释,注意与代码对齐;
- 第六条 IDE的text file encoding设置为UTF-8;
- 第七条 注释的双斜线与注释内容之间有且仅有一个空格;
- 第八条 大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
- 左大括号前不换行。
- 左大括号后换行。
- 右大括号前换行。
- 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- 第九条 if/for/while/switch/do等保留字与括号之间都必须加空格。
五、测试
测试id | 测试内容 | 具体输入 | 预期结果 | 实际结果 |
---|---|---|---|---|
1 | 参数内容问题 | 0 | “请输入合适的题目数量!比如1-100” | 符合预期 |
2 | -1 | “题目数量为负!请重新运行!” | 符合预期 | |
3 | h | “题目数量选项非整数!请重新运行!” | 符合预期 | |
4 | 1.1 | “题目数量选项非整数!请重新运行!” | 符合预期 | |
5 | 000...00001 | 正常运行,题目数量为1 | 符合预期 | |
6 | 9999...999 | “请输入合适的题目数量!比如1-100” | “题目数量选项非整数!请重新运行!” | |
7 | 参数个数问题 | “参数个数有误!请重新运行!” | 符合预期 | |
8 | 10 1 2 | “参数个数有误!请重新运行!” | 符合预期 | |
9 | 第二个参数问题 | 10 | 正常运行,年级为1 | 符合预期 |
10 | 10 h | “年级选择选项非整数!请重新运行!” | 符合预期 | |
11 | 10 3 | “年级选择超出范围,请选择一年级或者二年级 | 符合预期 |
测试6预期不符是数据溢出导致异常,不影响正常需求
六、总结
- 使用了“软件开发的基本策略:分而治之”,但因为这次作业内容较小重构需求体现不明显
- 采用了少量的重构,但自己对重构的理解不够透彻,感觉还需加强
- 万事开头难,我可能平时基础比较薄弱,拿到作业要求时慌得不知所措,但是静下心来慢慢一步一步实现要求发现自己也能做好,可能这也是一种分而治之的体现吧。
以上是关于MathExam的主要内容,如果未能解决你的问题,请参考以下文章