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