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的主要内容,如果未能解决你的问题,请参考以下文章

MathExam

MathExam

MathExam

MathExam

MathExam V2.0

MathExam小学一二年级计算题生成器V1.0