1.题目要求
题目1: 咱们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:java
- 可以自动生成四则运算练习题
- 能够定制题目数量
- 用户能够选择运算符
- 用户设置最大数(如十之内、百之内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据本身能力选作,以完成上述功能为主)
2.分工
本次个人结对对象是王肖男,在做业的完成过程当中,咱们交换领航员和驾驶员的角色。本次做业的主要总体设计思路由我提出;在图形界面的部分,我做为领航员,王肖男做为驾驶员;在算式生成的部分,王肖男做为领航员,我做为驾驶员;在文件操做部分,我做为领航员,王肖男做为驾驶员。git
3.我所负责的部分代码的思路
3.1算式生成部分
在该部分,要根据传入的信息产生符合用户要求的四则运算式。 代码以下:github
package ppp; import java.util.ArrayList; import java.util.Iterator; import java.util.Random; public class CreateList { private StringBuffer[] operator = new StringBuffer[4]; private boolean createBrackets = true;//生成括号 private boolean createMD = true;//生成乘除 private boolean createDecimal = true;//是否包含小数 private int maxNumber = 10;//最大值 private ArrayList<StringBuffer> arrOperator; private ArrayList<StringBuffer> arrNumber; private ArrayList<StringBuffer> arrDemo; //"乘除","小数","括号","最大值" public ArrayList<StringBuffer> create(String MD, String pointNum, String brackets,String maxNum) { if(pointNum == "no") createDecimal = false; if(brackets == "no") createBrackets = false; if(MD == "no") createMD = false; maxNumber = Integer.parseInt(maxNum); operator[0] = new StringBuffer("+"); operator[1] = new StringBuffer("-"); operator[2] = new StringBuffer("*"); operator[3] = new StringBuffer("/"); arrOperator= new ArrayList<StringBuffer>(); arrNumber = new ArrayList<StringBuffer>(); arrDemo = new ArrayList<StringBuffer>(); createOperator(); if(createDecimal) addDecimal(); else addInteger(); if(createBrackets) addBrackets(); Merge(); return arrDemo; } public void createOperator() { Random ra = new Random(); int pointer = 0; int l = 4; if(!createMD) l = 2; int length = 2+(int)ra.nextInt(4); for(int i=0;i<length;++i) { pointer =ra.nextInt(l); if (i!=0&&operator[pointer]==arrOperator.get(i-1)) i--; else arrOperator.add(operator[pointer]); } } public void addInteger() { int i=0; Random ra = new Random(); int d = ra.nextInt(maxNumber); arrNumber.add(new StringBuffer(Integer.toString(d))); for(StringBuffer sb:arrOperator) { int m = createInteger(i,sb); arrNumber.add(new StringBuffer(Integer.toString(m))); ++i; } } public void addDecimal() { Random ra = new Random(); int d = ra.nextInt(maxNumber-1)+1; arrNumber.add(new StringBuffer(Integer.toString(d))); double flag = 0; for(StringBuffer sb:arrOperator) { flag = ra.nextDouble(); if(flag<0.7) { arrNumber.add(new StringBuffer(Integer.toString(ra.nextInt(maxNumber-1)+1))); }else { StringBuffer st = new StringBuffer(); st.append(ra.nextInt(maxNumber)); st.append('.'); st.append(ra.nextInt(maxNumber)); arrNumber.add(st); } } } public void Merge() { Iterator<StringBuffer> it1 = arrOperator.iterator(); Iterator<StringBuffer> it2 = arrNumber.iterator(); for(;it1.hasNext();) { arrDemo.add(it2.next()); arrDemo.add(it1.next()); } arrDemo.add(it2.next()); } private int createInteger(int i,StringBuffer sb) { Random ra = new Random(); if(sb==operator[3]) { int num = Integer.parseInt(arrNumber.get(i).toString()); if(num == 0) return ra.nextInt(maxNumber)+1; for(int j = num-1;j>0;--j) if(num%j == 0) return j; } return ra.nextInt(maxNumber)+1; } public void addBrackets() { int tempI; double tempD; int i = 0; boolean jump = false; for(StringBuffer sb:arrNumber) { tempD = Double.parseDouble(sb.toString()); tempI = (int)tempD; if((tempD-tempI)<0.00000001&&(tempI>1)) { String s = String.valueOf(tempD); for(int t=0;t<s.length();++t) if(s.charAt(t)!='.') { departInteger(i); jump = true; break; } if(jump) break; } ++i; } } public void departInteger(int i) { Random ra = new Random(); int l = 4; if(!createMD) l=2; int pointer = ra.nextInt(l); int number1 = 0; int number2 = 0; StringBuffer s = arrNumber.get(i); int element = Integer.parseInt((s.toString())); if(pointer == 0) { number1 = ra.nextInt(element); number2 = element - number1; StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"+"+Integer.toString(number2)+")"); arrNumber.remove(i); arrNumber.add(i,newS); }else if(pointer == 2) { for(number1=element;number1>0;--number1) if(element%number1 == 0) { number2 = element/number1; break; } StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"*"+Integer.toString(number2)+")"); arrNumber.remove(i); arrNumber.add(i,newS); }else if(pointer == 3) { for(int j=maxNumber-1;j>=1;++j) if(j%element==0) { number1 = j; break; } number2 = number1/element; StringBuffer newS = new StringBuffer("("+Integer.toString(number1)+"/"+Integer.toString(number2)+")"); arrNumber.remove(i); arrNumber.add(i,newS); } } }
3.2代码的编写思路
- 算式的各部分生成顺序: 在屡次尝试后,我采用了先生成运算符序列,再生成运算数序列,最后根据要求选择添加括号。这种方式可以解决在不产生小数且须要添加括号的要求下运算结果不包含小数的问题,根据数学运算的规则,先计算括号中的算式,在运算中所有为整数时,当括号及除法都不产生小数,整个算式的运算结果就不会产生小数。
- 容器选择: 我选用的是ArrayList容器,用于存储运算符序列,运算数序列。在完成用户的算式生成要求后,再将两个序列合并为一个序列。而容器中存储的数据类型为StringBuffer,采用它的缘由是它相对于String类型的可变性,可以更容易地实现个人括号的添加的方法。
- 算符产生函数 将运算符生成为一个数组,依据随机数产生下标,组合成运算符序列。
- 生成小数 因为随机生成的double类型尾数较多,因此我采用了分别生成整数部分与小数部分再进行拼接的方法。
- 添加括号 该类中最复杂的部分是生成不含小数且含括号的算式。如果随机添加括号,则可能引发运算顺序改变而产生小数。因此在生成运算数序列时,将运算数序列的运算数分解为一个带括号的运算序列,这样在运算顺序改变时结果不会改变,即不产生小数。
3.3运行截图
4.代码地址
GitHub算法
5.总结
在本次任务中由我负责总体的规划。在代码编写过程当中不断改进,包括容器的选择,用户要求的实现顺序等,使我意识到软件工程思想的重要性,在过程当中遇到的问题让我反思本身在总体规划方面能力的欠缺。在从此,我会在这方面努力增强自身。数组
6.界面类及文件操做类的代码审查表
<table> <caption>计算器算法审查表</caption><caption> </caption><tbody> <tr> <td width="300" height="19">重要性</td> <td width="100">激活</td> <td width="100">级别</td> <td width="900">检查项</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">命名规则是否与所采用的规范保持一致?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">注释</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 10</td> <td bgcolor="yellow" width="900">注释是否较清晰且必要?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 10</td> <td width="900">复杂的分支流程是否已经被注释?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 10</td> <td width="900">距离较远的}是否已经被注释?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 10</td> <td width="900">非通用变量是否所有被注释?</td> </tr> <tr> <td width="300" height="19"></td> <td width="100">N</td> <td width="100"> 50</td> <td width="900">函数是否已经有文档注释?(功能、输入、返回及其余可选)</td> </tr> <tr> <td width="300" height="19"> 重要 </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 10</td> <td bgcolor="yellow" width="900">特殊用法是否被注释?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">声明、空白、缩进</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900"> 每行是否只声明了一个变量?(特别是那些可能出错的类型)</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">变量是否已经在定义的同时初始化?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">类属性是否都执行了初始化?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">代码段落是否被合适地以空行分隔?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">是否合理地使用了空格使程序更清晰?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">代码行长度是否在要求以内?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">折行是否恰当?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">语句/功能分布/规模</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">包含复合语句的{}是否成对出现并符合规范?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">是否给单个的循环、条件语句也加了{}?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">if/if-else/if-else if-else/do-while/switch-case语句的格式是否符合规范?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">单个变量是否只作单个用途?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">单行是否只有单个功能?(不要使用;进行多行合并)</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">单个函数是否执行了单个功能并与其命名相符?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">操做符++和— —操做符的应用是否复合规范?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">规模</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">单个函数不超过规定行数?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 100</td> <td bgcolor="yellow" width="900">缩进层数是否不超过规定?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 100</td> <td width="900">是否已经消除了全部警告?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">常数变量是否声明为final?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 80</td> <td bgcolor="yellow" width="900">对象使用前是否进行了检查?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 80</td> <td width="900">局部对象变量使用后是否被复位为NULL?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 70</td> <td bgcolor="yellow" width="900">对数组的访问是不是安全的?(合法的index取值为[0, MAX_SIZE-1])。</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">是否确认没有同名变量局部重复定义问题?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">程序中是否只使用了简单的表达式?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">全部判断是否都使用了(常量==变量)的形式?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 80</td> <td width="900">是否每一个if-else if-else语句都有最后一个else以确保处理了全集?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 80</td> <td width="900">是否每一个switch-case语句都有最后一个default以确保处理了全集?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 80</td> <td bgcolor="yellow" width="900">for循环是否都使用了包含下限不包含上限的形式?(k=0; k<max)< td=""> </max)<></td></tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 40</td> <td bgcolor="yellow" width="900">XML标记书写是否完整,字符串的拼写是否正确?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 40</td> <td width="900">对于流操做代码的异常捕获是否有finally操做以关闭流对象?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100"> N</td> <td width="100"> 20</td> <td width="900">退出代码段时是否对临时对象作了释放处理?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">可靠性(函数)</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 60</td> <td width="900">入口对象是否都被进行了判断不为空?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 60</td> <td width="900">入口数据的合法范围是否都被进行了判断?(尤为是数组)</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">是否对有异常抛出的方法都执行了try...catch保护?</td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 80</td> <td bgcolor="yellow" width="900">是否函数的全部分支都有返回值?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 50</td> <td width="900">int的返回值是否合理?(负值为失败,非负值成功)</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">对于反复进行了int返回值判断是否认义了函数来处理?</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 60</td> <td bgcolor="yellow" width="900">关键代码是否作了捕获异常处理?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 60</td> <td width="900">是否确保函数返回CORBA对象的任何一个属性都不能为null?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 60</td> <td width="900">是否对方法返回值对象作了null检查,该返回值定义时是否被初始化?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 60</td> <td width="900">线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">原子操做代码异常中断,使用的相关外部变量是否恢复先前状态?</td> </tr> <tr> <td width="300" height="19">重要</td> <td width="100">N</td> <td width="100"> 100</td> <td width="900">函数对错误的处理是恰当的?</td> </tr> <tr> <td bgcolor="gray" width="300" height="19">可维护性</td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="100"> </td> <td bgcolor="gray" width="900"> </td> </tr> <tr> <td width="300" height="19">重要</td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 100</td> <td bgcolor="yellow" width="900">实现代码中是否消除了直接常量?(用于计数起点的简单常数例外)</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">是否消除了致使结构模糊的连续赋值?(如a= (b=d+c ))</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">是否每一个return前都要有日志记录?</td> </tr> <tr> <td width="300" height="19"> </td> <td width="100">N</td> <td width="100"> 20</td> <td width="900">是否有冗余判断语句?(如:if (b) return true; else return false;)</td> </tr> <tr> <td width="300" height="19"> </td> <td bgcolor="yellow" width="100">Y</td> <td bgcolor="yellow" width="100"> 20</td> <td bgcolor="yellow" width="900">是否把方法中的重复代码抽象成私有函数?</td> </tr> </tbody> </table>安全