Pair_211606349蔡晨旸_211606369蔺皓雯
设计小学生计算题
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 2h | 3h |
• Estimate | • 估计这个任务需要多少时间 | 3d | 2.5d |
Development | 开发 | 2d | 2d |
• Analysis | • 需求分析 (包括学习新技术) | 1d | 0.5d |
• Design Spec | • 生成设计文档 | 3h | 1.5h |
• Design Review | • 设计复审 | 1.5h | 1h |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 1h | 1h |
• Design | • 具体设计 | 3h | 3h |
• Coding | • 具体编码 | 2d | 2d |
• Code Review | • 代码复审 | 2h | 1h |
• Test | • 测试(自我测试,修改代码,提交修改) | 2h | 1h |
Reporting | 报告 | 0.5h | 1h |
• Test Repor | • 测试报告 | 2h | 0.5h |
• Size Measurement | • 计算工作量 | 0.5h | 0.5h |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 2h | 1h |
合计 3d | 3d |
二、需求分析
- 我通过上网搜索的方式了解到,小学一年级数学有如下的几个特点:
- 特点1
- 小学一年级学到100以内加减法,最大99
- 特点1
- 我通过上网搜索的方式了解到,小学二年级数学有如下的几个特点:
- 特点1
- 小学二年级学到一百内加减法。 - 特点2
- 小学二年级学到九九乘法表的表内乘除法。 - 特点3
- 小学二年级学到整百整千加减法。 - 特点4
- 小学二年级学到几百几十加减整百或整十数。
- 特点5
- 小学三年级学习三位数乘除两位数的计算,以及加减法计算,加减法计算无要求。
- 特点1
经过分析,我认为,这个程序应当:
- 对一年级题来说,数字小于100,只有加减法。
- 对二年级题来说,使用的数字小于10000;100内加减随意;
- 整百整千加减随意;
- 过百整数加减整百或整十;
- 乘时数字1-9;
- 除时要得出商和余数。
- 对三年级来说,数字在100至999之间,乘除法题。被乘数与被除数为两位数。
- 加减法题没有什么限制。
三、设计
1. 设计思路
说明你如何设计这个程序
比如:
- 这个程序在上一个用于计算小学一二年级的加减乘除法题的基础上加上计算三年级的乘除法题。
- 三年级的乘除法题数字在100至999之间,乘除法题。被乘数与被除数为两位数。
- 在加减计算题上,三年级没有什么数字大小限制。
- 关键函数的流程图是怎样的?
- https://img2018.cnblogs.com/blog/1472365/201809/1472365-20180917231427698-1504002330.png
2. 实现方案
- 准备工作:先在Github上创建仓库,克隆到本地,仔细阅读题目要求,上网查找关于小学一二年级及三年级数学题目的出题范围和他们的学习范围。
- 技术关键点:将想要输入到txt文件上的题目与答案一次性输入到txt文件中,不逐条输入。
- 将括号加入四则运算。结果不能为负。
- 在四则混合运算中,实现调度场算法,求值逆波兰表达式。
- 先创建文件;在Math类中使用与主函数相同接口创建接口;将产生的随机数以及随机运算符号,算术“题目”与“答案”一起存入文件;最后,在文件中查看结果。
四、编码
- 在结对编程之后,我与队友互相查看并学习了上一次实验对方的代码。随后,将自己的代码进行了改进。我将自己原来的代码中关于将数据输入文件的方法进行了改进。
- 使得所写的数据能够一次性输入到文件中。但是,在for循环中的计算结果目前还未能完全正确地输出在文件中。
1. 调试日志
- 本次作业,最大的问题就是如何做到将for循环中的用于输出的变量值正确地显示在文件中,并且在四则运算中加入括号一并进行运算。
2. 关键代码
String c[] ={"+","-","×","÷"};
byte contentInBytes[];
Random rand=new Random();
for (int i=0;i<=n;i++) {
int a=rand.nextInt(c.length);
String resultChar=c[a];//运算符号存入resultChar
if (grade==1) {
for (int i1=0;i1<=n;i1++) {
left=rand.nextInt(100);
right=rand.nextInt(100);//左右百内随机数
String b= left+resultChar+right+"=";//题目
//又一套,存题目
if(resultChar=="+"){
re3=left+right;
String d=left+resultChar+right+"="+re3;
}else if(resultChar=="-"){
re3=left-right;
String e=left+resultChar+right+"="+re3;
}
}
}
if (grade==2) {
for (int i2=0;i2<=n;i2++) {
if(resultChar=="+"){
left=rand.nextInt(10000);
right=rand.nextInt(10000);
String b= left+resultChar+right+"=";
if((left%100==0 || left%1000==0 || left<=100)&&(right%100==0 || right%1000==0 || right<=100)) {
re3=left+right;
String e=left+resultChar+right+"="+re3;
}
if(left%100==0 && left>=100 && (right%100==0 || right%10==0)) {
re3=left+right;
String f=left+resultChar+right+"="+re3;
}
}else if(resultChar=="-"){
left=rand.nextInt(10000);
right=rand.nextInt(10000);
String b= left+resultChar+right+"=";
if((left%100==0 || left%1000==0 || left<=100)&&(right%100==0 || right%1000==0 || right<=100)) {
re3=left-right;
String g=left+resultChar+right+"="+re3;
}
if(left%100==0 && left>=100 && (right%100==0 || right%10==0)) {
re3=left-right;
String h=left+resultChar+right+"="+re3;
}
}else if(resultChar=="×"){
left=rand.nextInt(10)+1;
right=rand.nextInt(10)+1;
String b= left+resultChar+right+"=";
re3=left-right;
String j=left+resultChar+right+"="+re3;
}else if(resultChar=="÷"){
left=rand.nextInt(10)+1;
right=rand.nextInt(10)+1;
String b= left+resultChar+right+"=";
re2=left/right;
re1=left%right;
String k=left+resultChar+right+"=";
if(re1==0) {
re3=left/right;
String l=left+resultChar+right+"="+re3;
}
else {
String m=left+resultChar+right+"="+(re1+"..."+re2);
}
}
}
}
if (grade==3) {
for (int i3=0;i3<=n;i3++) {
if(resultChar=="+"){
left=rand.nextInt(10000);
right=rand.nextInt(10000);
re3=left+right;
String o= left+resultChar+right+"="+re3;
}
if(resultChar=="-") {
left=rand.nextInt(10000);
right=rand.nextInt(10000);
re3=left-right;
String o= left+resultChar+right+"="+re3;
}
if(resultChar=="×") {
left=rand.nextInt(1000)+100;
right=rand.nextInt(100)+10;
re3=left*right;
String o= left+resultChar+right+"="+re3;
}
if(resultChar=="÷") {
left=rand.nextInt(1000)+100;
right=rand.nextInt(100)+10;
re3=left/right;
String o= left+resultChar+right+"="+re3;
re2=left/right;
re1=left%right;
if(re1==0) {
String p=left+resultChar+right+"="+re3;
}
else {
String p=left+resultChar+right+"="+(re1+"..."+re2);
}
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条[强制]变量和常量的命名方式:
非公有(private/protected/default)变量前面要加上小写m;
静态变量(static)前面加上小写s;
其它变量以小写字母开头;
静态常量(static final)全大写。
- 第二条[强制]常量命名全部大写,单词键用下划线隔开,力求语义表达完整,不要嫌名字长
- 第三条抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类名开始,以Test结尾。
- 第四条[强制]类型与中括号紧挨相连来定义数组。
- 第五条[强制] POJO类中布尔类型的标量,都不要加is前缀,否则部分框架解析会引起序列化错误。
- 第六条[强制]杜绝完全不规范的缩写,避免忘文不知义
- 第七条[推荐]为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
- 第八条[推荐]如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。
并人工检查代码是否符合规范
五、测试
| 输入测试数据3 1 | 输出成功并且结果正确 | 输出成功,加减法答案正确 |
| 输入测试数据3 2 | 输出成功并且结果正确 | 输出成功,但答案都不正确 |
| 输入测试数据3 3 | 输出成功并且结果正确 | 输出成功,加减乘除答案都正确,但是除数不显示余数 |
六、总结提高
- 这次实验中,我做的结果并没有达到老师的要求。在四则运算中加入括号进行运算并没有实现,应该继续提高。与队友的配合让我学习到了新的知识,相信长期以往,一定能共同进步,变得更加优秀。