2016012019——小学四则运算练习软件项目报告
仓库地址:https://git.coding.net/Buza/arithmeticForStu.git
内容一:需求分析
用户用例:
用例名称 |
设置题目数 |
适用系统 |
Windows10 IOS |
级别 |
用户用例 |
用户 |
程序使用者 |
利益关系者 |
用户 |
前置条件 |
无 |
成功保证 |
输入正整数 |
主要成功场景 |
用户输入正整数,点击回车键,返回所输入数目的题目 |
扩展 |
输入小数或负数时,返回“请输入正整数” |
特殊需求 |
无 |
技术与数据计数表 |
暂无 |
发生频率 |
用户使用时发生一次 |
其他 |
无 |
内容二:功能设计
- 可以输入算式数目
- 算式结果不可出现小数、负数
- 生成计算结果正确的三到五个0~100之间正整数的四则运算算式
内容三:设计思路及其结构
·首先这个问题我首先想到的是,可以用栈或者递归来完成,我太菜了,想不出附加题,就用了递归。
·观察算式结构,要想使算式中不出现括号,比较简单的一种方法就是把算式拆分成两部分
·首先构造两个算法,分别生成第一部分的string和在第一部分的基础上逐步拼接第二部分的加减法。同时这两个算法要返回生成计算的结果值。在顾思宇同学的帮助下,我把结果值分别导入了指针为ans[ ]和newAnswer[ ]里面,就可以在不返回数值的同时得到我们需要的结果了。
第一部分:
1 public String addNum(int a,int b,String aa, int []ans,int d) { 2 int c; 3 if(a<b) { 4 c = b-a; 5 aa = a+" "+"+"+" "+c; 6 d = b ; 7 return aa; 8 }else if(a>b) { 9 c = a - b; 10 aa = b+" "+"+"+" "+c; 11 d = a; 12 return aa; 13 }else { 14 aa = a+" "+"+"+" "+0; 15 d = a; 16 return aa; 17 } 18 } 19 public String minNum(int a,int b,String aa, int []ans,int d) { 20 21 int c; 22 if(a<b) { 23 c = b-a; 24 aa = a+" "+"-"+" "+c; 25 d = b; 26 return aa; 27 }else if(a>b) { 28 c = b-a; 29 aa = b+" "+"-"+" "+c; 30 d = a ; 31 return aa; 32 }else { 33 aa = a+" "+"-"+" "+b; 34 d = 0; 35 return aa; 36 } 37 } 38 public String multNum(int a,int b,String aa, int []ans,int d) { 39 40 int c = a*b ; 41 d = c; 42 aa = a+" "+"*"+" "+b; 43 return aa; 44 } 45 public String divNum(int a,int b,String aa, int []ans,int d) { 46 47 int c = a*b; 48 if(c<=100) { 49 aa = c+" "+"%"+" "+a; 50 d = b; 51 return aa; 52 }else { 53 return divNum(a,b,aa, ans, d); 54 } 55 56 }
其中大家可能都有一个问题,如何避免除法中的分数和减法中的负数。我的思路是,除法生成时,先随机生成一个正整数作为算式的结果,再令这个结果乘一个正整数,得到算式的除数,这样避免了小数的出现;减法中,随机生成的两个数在进行减法时,进行比较,分出减数和被减数就好啦。
第二部分:
1 public String add(int a,int b,String equ,String bb,int[] newAnswer,int c) { 2 c = a+b; 3 bb = equ+" "+"+"+" "+ b; 4 return bb; 5 } 6 public String min(int a,int b,String equ,String bb,int[] newAnswer,int c) { 7 bb = equ+" "+"-"+" "+ b; 8 return bb; 9 }
因为只需要编写加减两部分,就轻松很多。
·最后在返回算式结果时,在新的string中加上=answer(导出的结果值)就好。
·方法构建完了,就要调用它,调用就很难,因为要递归,就感觉很复杂。
调用方法时我们要考虑:
1.需要的重要变量:符号数:numOfSign; 符号选择:(因为用了两个变量,我定义了两个变量来生成随机数)ran、ran0;两个随机正整数:a 、b;和两个数组用于接收结果值:Answer[ ]、newAnswer[ ]。
2.然后就是递归方法了,首先分了三种情况:两个符号、三个符号、四个符号;然后我们得把第二种方法套进去
1 if(numOfSign == 2) { 2 int c = (int)(Math.random()*100); 3 int ran0 = (int)(Math.random()*2); 4 if(ran == 0) { 5 addNum(a, b,equations,Answer, 0); 6 int ans = Answer[0]; 7 if(ran0 == 0) { 8 add(ans, c, equations, equations0,newAnswer,0); 9 equations = equations0; 10 }else{ 11 min(ans, c, equations, equations0,newAnswer,0); 12 equations = equations0; 13 } 14 }else if (ran == 1) { 15 minNum(a, b, equations,Answer, 0); 16 int ans = Answer[0]; 17 if(ran0 == 0) { 18 add(ans, c, equations, equations0,newAnswer,0); 19 equations = equations0; 20 }else{ 21 min(ans, c, equations, equations0,newAnswer,0); 22 equations = equations0; 23 } 24 }else if (ran == 2) { 25 multNum(a, b,equations,Answer, 0); 26 int ans = Answer[0]; 27 if(ran0 == 0) { 28 add(ans, c, equations, equations0,newAnswer,0); 29 equations = equations0; 30 }else{ 31 min(ans, c, equations, equations0,newAnswer,0); 32 equations = equations0; 33 } 34 }else{ 35 divNum(a, b,equations,Answer, 0); 36 int ans = Answer[0]; 37 if(ran0 == 0) { 38 add(ans, c, equations, equations0,newAnswer,0); 39 equations = equations0; 40 }else{ 41 min(ans, c, equations, equations0,newAnswer,0); 42 equations = equations0; 43 } 44 } 45 int newans = newAnswer[0]; 46 cc = equations+" "+"="+" "+newans; 47 return cc; 48 } 49 //there are two signs above 50 else if(numOfSign == 3) { 51 int c = (int)(Math.random()*100); 52 if(ran == 0) { 53 addNum(a, b, equations,Answer, 0); 54 int q; 55 for(q = 0;q<2;q++) { 56 int ran0 = (int)(Math.random()*2); 57 int ans = Answer[0]; 58 if(ran0 == 0) { 59 add(ans, c, equations, equations0,newAnswer,0); 60 equations = equations0; 61 }else{ 62 min(ans, c, equations, equations0,newAnswer,0); 63 equations = equations0; 64 } 65 } 66 67 }else if (ran == 1) { 68 minNum(a, b, equations,Answer, 0); 69 int q; 70 for(q = 0;q<2;q++) { 71 int ran0 = (int)(Math.random()*2); 72 int ans = Answer[0]; 73 if(ran0 == 0) { 74 add(ans, c, equations, equations0,newAnswer,0); 75 equations = equations0; 76 }else{ 77 min(ans, c, equations, equations0,newAnswer,0); 78 equations = equations0; 79 } 80 } 81 }else if (ran == 2) { 82 multNum(a, b,equations,Answer, 0); 83 int q; 84 for(q = 0;q<2;q++) { 85 int ran0 = (int)(Math.random()*2); 86 int ans = Answer[0]; 87 if(ran0 == 0) { 88 add(ans, c, equations, equations0,newAnswer,0); 89 equations = equations0; 90 }else{ 91 min(ans, c, equations, equations0,newAnswer,0); 92 equations = equations0; 93 } 94 } 95 }else{ 96 divNum(a, b,equations,Answer, 0); 97 int q; 98 for(q = 0;q<2;q++) { 99 int ran0 = (int)(Math.random()*2); 100 int ans = Answer[0]; 101 if(ran0 == 0) { 102 add(ans, c, equations, equations0,newAnswer,0); 103 equations = equations0; 104 }else{ 105 min(ans, c, equations, equations0,newAnswer,0); 106 equations = equations0; 107 } 108 } 109 } 110 int newans = newAnswer[0]; 111 cc = equations+" "+"="+" "+newans; 112 return cc; 113 } 114 //there are three signs above 115 else{ 116 int c = (int)(Math.random()*100); 117 if(ran == 0) { 118 addNum(a, b, equations,Answer, 0); 119 int q; 120 for(q = 0;q<3;q++) { 121 int ran0 = (int)(Math.random()*2); 122 int ans = Answer[0]; 123 if(ran0 == 0) { 124 add(ans, c, equations, equations0,newAnswer,0); 125 equations = equations0; 126 }else{ 127 min(ans, c, equations, equations0,newAnswer,0); 128 equations = equations0; 129 } 130 } 131 132 }else if (ran == 1) { 133 minNum(a, b, equations,Answer, 0); 134 int q; 135 for(q = 0;q<3;q++) { 136 int ran0 = (int)(Math.random()*2); 137 int ans = Answer[0]; 138 if(ran0 == 0) { 139 add(ans, c, equations, equations0,newAnswer,0); 140 equations = equations0; 141 }else{ 142 min(ans, c, equations, equations0,newAnswer,0); 143 equations = equations0; 144 } 145 } 146 }else if (ran == 2) { 147 multNum(a, b,equations,Answer, 0); 148 int q; 149 for(q = 0;q<3;q++) { 150 int ran0 = (int)(Math.random()*2); 151 int ans = Answer[0]; 152 if(ran0 == 0) { 153 add(ans, c, equations, equations0,newAnswer,0); 154 equations = equations0; 155 }else{ 156 min(ans, c, equations, equations0,newAnswer,0); 157 equations = equations0; 158 } 159 } 160 }else{ 161 divNum(a, b,equations,Answer, 0); 162 int q; 163 for(q = 0;q<3;q++) { 164 int ran0 = (int)(Math.random()*2); 165 int ans = Answer[0]; 166 if(ran0 == 0) { 167 add(ans, c, equations, equations0,newAnswer,0); 168 equations = equations0; 169 }else{ 170 min(ans, c, equations, equations0,newAnswer,0); 171 equations = equations0; 172 } 173 } 174 } 175 int newans = newAnswer[0]; 176 cc = equations+" "+"="+" "+newans; 177 return cc; 178 } 179 //there are four signs above 180
·最后只需要构造main函数,让用户输入所需题目数,然后用for循环来调用上面的方法。
第四部分:算法讲解
我的算法很烂啊,我感觉没啥说的,但是最近看博客大家提交的都好强啊,我会继续关注大佬们的更新动态的,fighting!
如果一定要说,我感觉递归是个好东西,虽然用不利索。。。。。。
第五部分:测试运行
从周五调到现在了,还是有bug(沮丧.jpg)还没修完,下周接着修,有时候有行,有时候就出问题了,就各种null,应该是某些方法出问题了,目前这样
第六部分:我感觉我除法这里弄的挺好的,这样做就没有分数,但是如果叫我做分数出来,我就不会弄了
1 public String divNum(int a,int b,String aa, int []ans,int d) { 2 3 int c = a*b; 4 if(c<=100) { 5 aa = c+" "+"%"+" "+a; 6 d = b; 7 return aa; 8 }else { 9 return divNum(a,b,aa, ans, d); 10 } 11 12 }
第七部分:总结
模块化很重要的,提前设计程序,把大程序拆成不同功能,面向不同功能的编程可以少走弯路节省很多时间,尤其是我这样的菜菜,做到模块化可以省力,不会很迷茫。模块化最重要的还是:小块修改不会牵扯大块,就很方便了。
第八部分:PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
40 |
20 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
40 |
20 |
Development |
开发 |
610 |
1230 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
10 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
120 |
150 |
· Coding |
· 具体编码 |
180 |
600 |
· Code Review |
· 代码复审 |
60 |
120 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
210(目前) |
Reporting |
报告 |
|
|
· Test Report |
· 测试报告 |
50 |
80 |
· Size Measurement |
· 计算工作量 |
10 |
15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
5 |
上面只是代码部分的PSP。。。。这周末研究coding.net研究到胃疼。最后还是王超学姐帮我找到了问题,总算把git给弄好了,公钥给生成了,可惜我还是不是很懂git的代码,照着教程码是行,但看代码看不懂,不太懂怎么用命令行往移动仓库移东西,还得接着研究呀。