MathExam小学一二年级计算题生成器V1.0
MathExam小学一二年级计算题生成器v1.0
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 880 | 1540 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 60 | 100 |
• Design Spec | • 生成设计文档 | 20 | 20 |
• Design Review | • 设计复审 | 10 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
• Design | • 具体设计 | 60 | 90 |
• Coding | • 具体编码 | 300 | 500 |
• Code Review | • 代码复审 | 10 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 300 | 600 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 60 | 100 |
• Size Measurement | • 计算工作量 | 10 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 880 | 1540 |
二、需求分析
我通过在网络搜索的方式了解到,小学一年级数学有如下的几个特点:
- 特点1:一年级数学只有加减法。
- 特点2:只有三位数以下的加减。
- 特点3:得出的结果不能为负数,因此当式子为减法式子时,前面的数字要小雨后面的数字。
- 特点4:二年级数学有加减乘除。
- 特点5:二年级数学有余数。
- 特点6:二年级数学除法的除数只有个位数。
经过分析,我认为,这个程序应当:
- 使用的数字应为[0,100)
- 除数的数字应[1,10)
三、设计
1. 设计思路
- 根据题目要求,最终需要写入文本out.txt中,因此要先创建文本。
- 数字需要随机得出,因此需要简历随机数。
- 随机出来的式子需要写入文本,因此需要多个数组进行存储。
- 答案需要的格式为“等式+答案”,并且还需要判断符号以及是否有余数,所以需要if{} else if{}进行判断。
需要写入文本out.txt,所以需要BufferedWriter( )和循环,将数组里的数据一 一写入文本中。- 文本末尾需显示当前时间,因此创建Date,提取当前系统时间。
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地...
- 技术关键点:
- 数组会越界,从而导致程序无法正常运行,因此循环时需要注意循环体是否达到要求,是否有问题。
- 使用随机数Random( )时,需要注意随机数生成范围,比如除数的范围只有【1-9】
- 当式子为减法时,减数要等于或小于被减数。
- 使用 BufferedWriter( )将存入数组的数据一一输入文本 out.txt 里面。
- 使用正则表达式、Pattern、Matcher判断输入参数是否达标,不达标则提示重新输入,并给予格式。
- 使用 DateFormat( )获取系统当前时间。
四、编码
请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程
1. 调试日志
记录编码调试的日志,请记录下开发过程中的 debug 历程
- 在for循环中,存放数据的数组因为循环体出错,反复循环多次,导致越界,是程序无法正常运行。最后通过system.out.println打印出数组,判断出循环问题。
- 在写入正则表达式之后,关于Boolean的判定,一开始使用的是 matcher.find(),后来发现只要数据带有相关的数字就会通过检验,因此改换成matcher.matches() ,成功将参数范围以及类型进行限定。
- 当参数只写入一个的时候,程序出现问题,使用args.length判断输入参数的长度,再传参时,如果args.length==1则默认年级为1年级。
2. 关键代码
请展示一段程序的关键代码,并解释代码的作用
- 通过main函数中String[] args的参数,进行正则表达式的判断,最后传入create()方法内。
- count表示要生成的题数,grade表示对应的年级。
- 使用random()随机生成数字。
public static void create(int count,int grade) {
Date date = new Date();
DateFormat dt = DateFormat.getDateTimeInstance();
dt.format(date);
File file = new File ("out.txt");//创建文本
FileWriter fw=null;
try {
fw = new FileWriter(file);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
BufferedWriter bw = new BufferedWriter(fw);
int first=0,symbol=0,second=0,mark=0,w=0;
int [] an=new int[count];//创建数组,用于存储数据,存储答案。
int [] bn=new int[count];//存储第一个数字,式子的第一个数;
int [] cn=new int[count];//存储第二个数字,用于判断符号;
int [] dn=new int[count];//存储第三个数字,式子的第二个数
int [] en=new int[count];//存储余数;
Random r =new Random();
while(w <count) {
if(mark==0) //判断题号是否需要更新,若需要则输入题号。
{
try {
bw.write(String.valueOf("("+ (w+1) +") "));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
for(int i=0;i<4;i++)//循环四次,随机生成三个数。并在第四次进行符号判断,最后在文本输入式子。
{
if(i==0)
{
int number = (int)Math.floor((r.nextDouble()*100.0));//生成式子的第一个数
first=number;
bn[w]=first; //将式子的数字存入数组中,方便之后的提取
}
else if(i==1)
{
if(grade==1)
{
int number = (int)Math.floor((r.nextDouble()*2.0));//生成第二个数字,用于判断符号
symbol=number;
}
else if(grade==2)
{
int number = (int)Math.floor((r.nextDouble()*4.0));//生成第二个数字,用于判断符号
symbol=number;
}
cn[w]=symbol;//将式子的数字存入数组中,方便之后的提取
}
else if(i==2)
{
if(symbol==3)
{
int number = 1+(int)Math.floor((r.nextDouble()*10.0));//生成第三个数字
second=number;
}
else
{
int number = 1+(int)Math.floor((r.nextDouble()*100.0));//生成第三个数字
second=number;
}
dn[w]=second;//将式子的数字存入数组中,方便之后的提取
}
else if(i==3)
{
en[w]=0;//输入余数
if (symbol==0)//判断符号,0为+号,1为-号,2为×号,3为÷号
{
try {
bw.write(String.valueOf(" "+ first+ " + " +second+" = "));//输入式子
an[w]=first+second;//将答案存储在数组an中
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else if((symbol==1))
{
if(first-second < 0)
{mark=1;break;}
try {
bw.write(String.valueOf(" "+ first+ " - " +second+" = "));//输入式子
an[w]=first-second;//将答案存储在数组an中
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else if((symbol==2))
{
try {
bw.write(String.valueOf(" "+ first+ " × " +second+" = "));//输入式子
an[w]=first*second;//将答案存储在数组an中
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else if((symbol==3))
{
try {
en[w]=first % second;//将余数存入数组en中
bw.write(String.valueOf(" "+ first+ " ÷ " +second+" = "));//输入式子
an[w]=(int)(first/second);//将答案存储在数组an中
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
mark=0;//证明式子成功写入,题号需要更新。
w++;
}
}//内循环结束
if(mark==0)//判断式子是否成功写入,如果成果则执行换行。
try {
bw.newLine();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}//while循环结束。
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条:代码中的变量名不能以下划线开始也不能以下划线结束。
- 第二条:代码中的命名严禁使用拼音与英文混合,更不许使用中文命名。
- 第三条:常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长。
- 第四条:类型与中括号紧挨相连来定义数组。
- 第五条:杜绝完全不规范的缩写,避免忘文不知义。
- 第六条:第四条:不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。并人工检查代码是否符合规范
五、测试
请思考并记录你认为必要的测试点,并记录测试用例与测试结果
参数个数 | 测试用例 | 结果 |
---|---|---|
一个参数 | java MathExam6360 10 | 运行正常 |
java MathExam6360 0 | 提示错误,需重新输入 | |
java MathExam6360 00001 | 提示错误,需重新输入 | |
java MathExam6360 a | 提示错误,需重新输入 | |
java MathExam6360 10000 | 提示错误,需重新输入 | |
java MathExam6360 -1 | 提示错误,需重新输入 | |
java MathExam6360 0.1 | 提示错误,需重新输入 | |
2个参数 | java MathExam6360 10 2 | 运行正常 |
java MathExam6360 10 20 | 提示错误,需重新输入 | |
java MathExam6360 10 a | 提示错误,需重新输入 | |
java MathExam6301 d 2 | 提示错误,需重新输入 | |
java MathExam6301 0001 2 | 提示错误,需重新输入 | |
java MathExam6301 100 0.1 | 提示错误,需重新输入 | |
java MathExam6360 10 | 运行正常 |
六、总结
请总结过程中的教训和经验,思考
- 在写代码的过程中,每功课一次目标,其实内心是很欢喜的,因为这代表着我在攻克这目标之前所用的时间都得到了相应的回报,我的水平并不高,因此可能功课每一步的时间花费的比其他人都要长,不过我也确实在这次的过程中学到了一些东西,严格来说其实不算是学到,而是把上学期所学过的,所用过的进行了一次巩固。当然水平不足的我少不了翻看曾经的PPT、作业以及上网查询某一些函数的用法。
- 由于水平不足,其实我的代码有着冗余,还是在同学的指导下,发现了其中一些代码冗余的地方。而且刚开始决定敲代码时,并没有程序进行相应规划以及设计,属于想到什么就写什么,因此遇到了问题时,总是手忙脚乱的找错误。倒是养出了给代码注释的习惯,方便之后出错可以迅速查找。
- 相比于其他人,我确实是自愧不如,敲代码的时间四五天有余,虽然最后敲出来了成果,但是却依然比不得其他同学,还有许多需要改进的地方。使用正则表达式限制了输入参数的类型以及范围,最开始使用的matcher.find()的boolean判断,却总能被判断正确,即使输入参数不对。之后再同学的建议下修改成matcher.matche()的boolean判断,总算成功限定了参数类型和范围。
- 这一次的作业,让我受益良多,即使代码看多了脑壳会疼,不过在完成目标后,那种可以令人上瘾的感觉,实在是欲罢不能,这或许是我坚持那么久去推敲代码的动力吧。
MathExam小学一二年级计算题生成器V1.0的更多相关文章
- MathExamV2.0四则混合运算计算题生成器
MathExamV2.0四则混合运算计算题生成器----211606360 丁培晖 211606343 杨宇潇 一.预估与实际 PSP2.1 Personal Software Process Sta ...
- 悲催的二柱子们做小学二年级四则运算题(Javaweb)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 一个hin秀的小学三年级奥数题 [hin秀]
~~~~~~不知为何总会被小学的题虐哭QAQ,真的秀啊,毒害广大小朋友~~~~~~ 一个hin秀的小学三年级奥数题 [hin秀] 题目: 给出一个无限大的棋盘 n×n (n>0 , 是 ...
- PMP--可能会涉及到的计算题
一.进度管理里的历时三点估算历时的三点估算可能会出现在进度管理的计算题里.以下公式,大家要记住:说一下历时的三点估算中的几个值:1.最有可能的历时估算:Tm2.最乐观的历时估算: To3.最悲观的历时 ...
- 将100道计算题输出至txt文件,再读取文件至控制台,在控制台中输入答案并评判对错
我在课堂上基本完成了输出100道题和创建文档,但是因为对输入输出流不熟悉,所以并没有实现将输出的计算题导出到文档里,在课下我又请教了宿舍的大佬,基本完成如下: 源代码: import java.io. ...
- CTF-练习平台-WEB之 计算题
四.计算题 打开连接 输入后发现只能输入一个数字,在火狐浏览器中按F12,打开查看器 ,如图所示修改最大长度 输入答案后验证,当当当~~flag出现
- #82. 【UR #7】水题生成器
链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 —— 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是 ...
- 【UOJ#82】【UR #7】水题生成器(贪心)
[UOJ#82][UR #7]水题生成器(贪心) 题面 UOJ 题解 把\(n!\)的所有约数搜出来,这个个数不会很多. 然后从大往小能选则选就好了. #include<iostream> ...
- Java练习 SDUT-1149_计算题
计算题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的计算,你需要计算f(m,n),其定义如下: 当m=1时 ...
随机推荐
- P1353 [USACO08JAN]跑步Running
题目描述 The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ...
- 四步掌握CAN节点隔离设计
四步掌握CAN节点隔离设计 “隔离”是模块为CAN节点设备提供可靠数据传输的首要保障,通常隔离模块的“隔离”是指模块上电后,能为节点提供信号隔离及电源隔离,隔离电压等级以2500VDC.3500VDC ...
- 【jq】插件—弹出层layer.js
layer.js包含了所有的层级情形,并且附加的有:tab层,相册层.webIM层. 适用于移动版本的layer.js 为layer for mobile 配套的layui 非常适合用于后台系统的 ...
- Linux VFS的主要的数据结构
先说明一下,linux内核中各种数据结构也不停的在变,所以不同版本的内核各个数据结构的定义可能会差别很大,这一组关于linux 文件系统的文章中的代码都摘自linux-2.6.34.1. VFS依赖于 ...
- 快速开发平台分享-UCML快速开发七种武器
传统的快速开发平台强调的是组件重用.构件重用,主要解决功能重用层面,一般提供了软件开发最常用的功能:表单设计.BPM(业务流程管理).报表.组织机构及权限等功能.但只有功能重用,没有过程重用,要么只能 ...
- jQuery----获取兄弟元素的方法
① $(this).next(): 获取的是当前元素的下一个兄弟元素 ②$(this).nextAll(); 获取的是当前元素的后面的所有的兄弟元素 ③$(this).pre ...
- Disruptor时序调用
接下来,我会对disruptor的设计和源码上进行讲解,先来一篇时序图,简单理解下disruptor的工作过程
- 2.7 usb摄像头之usb摄像头描述符打印
学习目标:参考lsusb源码,打印USB摄像头的设备描述符.配置描述符.接口联合描述符.端点描述符: 一.lsusb命令和源码 使用命令lsusb可以看看设备的id,并执行 # lsusb -v -d ...
- 使用promis串行化异步操作
该代码可在chrome下运行,对于低版本浏览器可以引入Q库 function async1() { var defer = Promise.defer() setTimeout(function(){ ...
- 2015306 白皎 《网络攻防》Exp4 恶意代码分析
2015306 白皎 <网络攻防>Exp4 恶意代码分析 netstat [Mac.Linux.Win] sysinteral [MS]:1 2 3 一.系统监控--Windows计划任务 ...