MathExam
Posted yang1998
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MathExam相关的知识,希望对你有一定的参考价值。
设计小学生计算题
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 0.5d | 3h |
? Estimate | ? 估计这个任务需要多少时间 | 3d | 2d |
Development | 开发 | 1.5d | 2d |
? Analysis | ? 需求分析 (包括学习新技术) | 1d | 0.5d |
? Design Spec | ? 生成设计文档 | 0.5h | 1.5h |
? Design Review | ? 设计复审 | 1.5h | 1h |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 1h | 1h |
? Design | ? 具体设计 | 3h | 3h |
? Coding | ? 具体编码 | 2d | 2d |
? Code Review | ? 代码复审 | 1h | 1h |
? Test | ? 测试(自我测试,修改代码,提交修改) | 1h | 1h |
Reporting | 报告 | 1h | 1h |
? Test Repor | ? 测试报告 | 1h | 0.5h |
? Size Measurement | ? 计算工作量 | 0.5h | 0.3h |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 1h | 1h |
合计 3d | 2d |
二、需求分析
我通过上网搜索的方式了解到,小学一年级数学有如下的几个特点:
- 特点1
- 小学一年级学到100以内加减法,最大99
我通过上网搜索的方式了解到,小学二年级数学有如下的几个特点:
- 特点1
- 小学二年级学到一百内加减法。
- 特点2
- 小学二年级学到九九乘法表的表内乘除法。
- 特点3
- 小学二年级学到整百整千加减法。
- 特点4
- 小学二年级学到几百几十加减整百或整十数。
经过分析,我认为,这个程序应当:
-对一年级题来说,数字小于100,只有加减法。
对二年级题来说,使用的数字小于10000;100内加减随意;整百整千加减随意;过百整数加减整百或整十;乘时数字1-9;除时要得出商和余数。
三、设计
1. 设计思路
说明你如何设计这个程序
比如:
- 这个程序有2个类,3个函数,6个接口。
- 函数分别为主函数,Random函数和用于安放计算流程的代码的Math函数。
- 接口之间的关系是,IOException为函数接口,其余File,FileInputStream,FileOutputStream,IOException,InputStream,OutputStream接口均为输入输出数据于接口或创造新文件所需接口。
- 关键函数的流程图是怎样的?
接收数据,创建I/O接口,调用用于实现计算的Math方法。 - 算法的关键的关键是什么?
将所得到的数据和题目信息存入文件中。 - ...
2. 实现方案
写出具体实现的步骤
比如:
- 准备工作:先在Github上创建仓库,克隆到本地,仔细阅读题目要求,上网查找关于小学一二年级数学题目的出题范围和他们的学习范围。
- 技术关键点:接收从命令行参数得到的数据,并将其用Integer.parseInt转换成int格式。
- 创建新文件;在Math类中使用与主函数相同接口创建接口;将用Random产生的随机数以及随机运算符号,string类型的所出“题目”存入文件;将所出“题目”与“答案”分别一次性显示......
四、编码
原本我设计将代码分四块甚至更多,分别为主函数,判断年级的方法,并将两个年级分两个方法实现。
后来为此,代码写到建立新文件,并将随机数,所出“题”,“题的答案”存入文件时,发现无法下手,一动就错。
纠结很久后,我决定将主函数里一并写出判断年级的代码与创建的文件。将两个年级的计算题代码整合到同一个方法中。
并且,在这两个模块中一并写上相同名称的接口代码。只是,针对两个年级的计算题代码,另需加输入与输出文件的代码。
1. 调试日志
bug历程:只有string类型可以直接转换成能够存储在文件中的byte类型,int型需另外处理。
从命令行参数中接收到的值都是char类型,需要进行转换。
使用for函数定义时,要十分注意位置和包含关系以及方法的从属关系,十分复杂,纠结很久。
检查文件是否存在不能遗忘。
要注意随机数值的取值范围根据题目不断改变。
2. 关键代码
String b= left1+resultChar+right1+"="; ----将“题目”单独提出来,为string类型
byte contentInBytes2[]=b.getBytes(); -----将string类型代码转换为byte型并存在文件的数组里
out.write(contentInBytes2); -----将数据输入文件
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条[强制]变量和常量的命名方式:
非公有(private/protected/default)变量前面要加上小写m;
静态变量(static)前面加上小写s;
其它变量以小写字母开头;
静态常量(static final)全大写。
- 第二条[强制]常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长
- 第三条抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类名开始,以Test结尾。
- 第四条[强制]类型与中括号紧挨相连来定义数组。
- 第五条[强制] POJO类中布尔类型的标量,都不要加is前缀,否则部分框架解析会引起序列化错误。
- 第六条[强制]杜绝完全不规范的缩写,避免忘文不知义
- 第七条[推荐]为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
- 第八条[推荐]如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。
并人工检查代码是否符合规范
五、测试
需要测试题目的输出是否成功以及题目与答案出现的顺序。
六、总结
教训:以往的知识学习不够扎实,实验中,在不适合编写方法里缠绕太久,以及没有清楚理解题意,浪费了时间和精力。
- 使用了“软件开发的基本策略:分而治之”,不需要重构
- “高质量的设计、规范的编码以及有效的测试是保证软件产品质量的三个重要方面”,我否采用了相关的手段,不需要重构
以上是关于MathExam的主要内容,如果未能解决你的问题,请参考以下文章