第一单元的任务是通过对表达式结构进行建模,完成多层嵌套表达式和函数调用的括号展开与化简,在这个单元的学习中,我学习了如何通过数据层次以及行为层次进行设计,并以面向对象的方式思考问题,熟悉了正则表达式处理字符串的手段,了解了对于代码的不断更新迭代满足需求。本单元的三次作业难度层层递进,下面我将分别介绍。
1、第一次作业
通过对表达式结构进行建模,完成单变量多项式的括号展开,初步体会层次化设计的思想。
1.1数据结构
Mainclass将输入的字符串进行预处理(去掉空白符与多余的符号并将“++”和“--”化简为“+”),之后将处理过的表达式字符串传给parse中的parseExpression,先将字符串赋值给Expression类中before和after,再用正则表达式进行字符串处理进行项的切割,之后将处理过的项字符串传给parse中的parseTerm,先将字符串赋值给Term类中before和after,再用正则表达式进行字符串处理进行因子的切割,之后将处理过的因子字符串传给parse中的parseFactor,先将字符串赋值给Factor类中before和after,此时已经递归到最低层,然后调用Expression、Term、Factor类中的calculate方法通过正则表达式进行括号拆解后传给类中的after,层层递归回Expression类,最终得到的Expression类的after便是括号拆解后的表达式。
1.2代码结构分析
Expression.add(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.addTerm(Term) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.calculate() | 4.0 | 1.0 | 5.0 | 5.0 |
Expression.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.Expression() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.reverse(String) | 6.0 | 1.0 | 7.0 | 7.0 |
Expression.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.sub(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.calculate() | 2.0 | 1.0 | 2.0 | 2.0 |
Factor.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.pow(String) | 4.0 | 3.0 | 3.0 | 3.0 |
Factor.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Mainclass.curtailment(String) | 1.0 | 1.0 | 2.0 | 2.0 |
Mainclass.main(String[]) | 0.0 | 1.0 | 1.0 | 1.0 |
Parser.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Parser.parseExpr(String) | 1.0 | 1.0 | 2.0 | 2.0 |
Parser.parseFactor(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Parser.parseTerm(String) | 1.0 | 1.0 | 2.0 | 2.0 |
pattern.getAddexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getBeginexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getExpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getExpressionfactormul() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getExpressionmulfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getMulexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getMultiplyexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getNoexpressionexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getNoexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getNoexpressionterm() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getPowerexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getSubexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getUltimateexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getUltimatefactor() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.getUltimateterm() | 0.0 | 1.0 | 1.0 | 1.0 |
pattern.pattern() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.addFactor(Factor) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.calculate() | 2.0 | 1.0 | 3.0 | 3.0 |
Term.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getFactors() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.multi(String) | 48.0 | 1.0 | 19.0 | 19.0 |
Term.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.Term() | 0.0 | 1.0 | 1.0 | 1.0 |
Total | 69.0 | 52.0 | 86.0 | 86.0 |
Average | 1.38 | 1.04 | 1.72 | 1.72 |
2、第二次作业
通过对表达式结构进行建模,添加了三角函数、自定义函数、求和函数,完成多项式的括号展开与函数调用、化简,进一步体会层次化设计的思想。
2.1数据结构
本次作业括号嵌套层数有限,因此我依旧采用了正则表达式进行解析,添加了Constant、Expressionfactor、Selfdefine、Summation、Trigonometric类继承在Factor类之下,Mainclass先读入自定义函数展开自定义函数表达式,并将自定义函数中的函数自变量换为a/b/c之后存储函数表达式,后将输入的字符串进行预处理(去掉空白符与多余的符号并将“++”和“--”化简为“+”并将三角函数括号转为[]),之后将处理过的表达式字符串传给parse中的parseExpression,先将字符串赋值给Expression类中before和after,再用正则表达式进行字符串处理进行项的切割,之后将处理过的项字符串传给parse中的parseTerm,先将字符串赋值给Term类中before和after,再用正则表达式进行字符串处理进行因子的切割,之后将处理过的因子字符串传给parse中的parseFactor,先将字符串赋值给Factor类中before和after,此时已经递归到最低层,然后调用Expression、Term、Factor类中的calculate方法通过正则表达式进行括号拆解后传给类中的after,层层递归回Expression类,最终得到的Expression类的after便是括号拆解后的表达式。
2.2代码结构分析
Constant.calculate() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.add(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.addTerm(Term) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.calculate() | 8.0 | 1.0 | 8.0 | 8.0 |
Expression.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.Expression() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.reverse(String) | 6.0 | 1.0 | 7.0 | 7.0 |
Expression.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.sub(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Expressionfactor.addExpression(Expression) | 0.0 | 1.0 | 1.0 | 1.0 |
Expressionfactor.calculate() | 2.0 | 1.0 | 3.0 | 3.0 |
Expressionfactor.Expressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Expressionfactor.pow(String) | 4.0 | 3.0 | 3.0 | 3.0 |
Factor.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Factor.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Mainclass.curtailment(String) | 5.0 | 1.0 | 5.0 | 5.0 |
Mainclass.getStrings() | 0.0 | 1.0 | 1.0 | 1.0 |
Mainclass.main(String[]) | 4.0 | 1.0 | 4.0 | 4.0 |
Mypattern.getAddexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getArgument() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getBeginexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getBesummed() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getExponent() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getExpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getExpressionfactormul() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getExpressionmulfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getFunctionalexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getHaveexponenttrifunction() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getMulexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getMultiplyexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewaddexpresionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewbgnexpresionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewbracketexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewnoexponentexpfac() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewnoexpressionexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewnoexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewnoexpressionterm() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewpowerexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNewsubexpresionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoexpressionexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoexpressionterm() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoselfsumexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoselfsumexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNoselfsumterm() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getOnlytrigonometricfunction() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getPowerexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getPowerfunction() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSelffunctioncall() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSelffunctiondefine() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSelffunctionname() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSinfunctionname() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSubexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSubtituteargument() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSummationexpressionfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getSummationfunction() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getTrigonometricfunction() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getUltimateexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getUltimatefactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getUltimatenoselfsumexpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getUltimateterm() | 0.0 | 1.0 | 1.0 | 1.0 |
Parser.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Parser.parseExpr(String) | 1.0 | 1.0 | 2.0 | 2.0 |
Parser.parseFactor(String) | 11.0 | 5.0 | 8.0 | 8.0 |
Parser.parseTerm(String) | 1.0 | 1.0 | 2.0 | 2.0 |
Selfdefine.addExpression(Expression) | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.calculate() | 1.0 | 1.0 | 2.0 | 2.0 |
Selfdefine.Selfdefine() | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.substitute(String) | 12.0 | 4.0 | 7.0 | 7.0 |
Summation.addExpression(Expression) | 0.0 | 1.0 | 1.0 | 1.0 |
Summation.calculate() | 1.0 | 1.0 | 2.0 | 2.0 |
Summation.substitute(String) | 5.0 | 1.0 | 4.0 | 4.0 |
Summation.Summation() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.addFactor(Factor) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.calculate() | 7.0 | 3.0 | 7.0 | 7.0 |
Term.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getAfter() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getBefore() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getFactors() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.multi(String) | 48.0 | 1.0 | 19.0 | 19.0 |
Term.setAfter(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.setBefore(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.Term() | 0.0 | 1.0 | 1.0 | 1.0 |
Trigonometric.calculate() | 2.0 | 1.0 | 2.0 | 2.0 |
Trigonometric.pow(String) | 4.0 | 3.0 | 3.0 | 3.0 |
Total | 122.0 | 105.0 | 163.0 | 163.0 |
Average | 1.326086956521739 | 1.141304347826087 | 1.7717391304347827 | 1.7717391304347827 |
2.3bug修复
表达式解析之后,自定义函数外的括号没有被解析,自定义函数解析时可能出现多层括号嵌套的情况,导致通过正则表达式无法解析到无非必要括号的表达式,只有重构才能解决这个问题。
3、第三次作业
通过对表达式结构进行建模,完成多层嵌套表达式和函数调用的括号展开与化简,进一步体会层次化设计的思想,本次作业未添加其他函数,但是提出了多层括号嵌套的需求。
3.1数据结构
本次作业在第二次作业的基础上又增加了新的需求,出现了多层括号嵌套因此无法再使用正则表达式进行解析,在这次作业中我进行了代码重构。首先读入自定义函数存储并进行解析,之后读入表达式,Mainclass将输入的字符串进行预处理(去掉空格),调用Lexer解析工具类,之后传入lexer工具和自定义函数容器进入parse类的parseExpression方法,运用lexer工具拆解表达式成为若干项进入parseTerm方法,运用lexer工具拆解项成为若干因子进入parseNested方法,在parseNested方法中再次用lexer工具按照因子的不同分类进入parseExpression方法、parseCosfactor方法、parseSinfactor方法、parseSummation方法、parseSelfdefine方法、构建常量因子 Constfactor、构建变量因子 Indvarfactor,层层递归到数据层次的最底层,之后调用各类中的debrackets方法得到最终被解析的表达式。
3.2代码结构分析
Constfactor.Constfactor(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Constfactor.debrackets() | 0.0 | 1.0 | 1.0 | 1.0 |
Constfactor.equal(Object) | 3.0 | 2.0 | 2.0 | 3.0 |
Constfactor.getNum() | 0.0 | 1.0 | 1.0 | 1.0 |
Constfactor.toString() | 0.0 | 1.0 | 1.0 | 1.0 |
Cosfactor.Cosfactor(Nestedfactor) | 0.0 | 1.0 | 1.0 | 1.0 |
Cosfactor.debrackets() | 1.0 | 2.0 | 1.0 | 2.0 |
Cosfactor.equal(Object) | 3.0 | 2.0 | 2.0 | 3.0 |
Cosfactor.toString() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.addNestedfactor(Nestedfactor) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.debrackets() | 4.0 | 1.0 | 3.0 | 3.0 |
Expression.equal(Object) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.Expression() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.getNesteds() | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.setNesteds(ArrayList) | 0.0 | 1.0 | 1.0 | 1.0 |
Expression.toString() | 8.0 | 2.0 | 4.0 | 4.0 |
Factory.manufacture(Lexer) | 2.0 | 1.0 | 3.0 | 3.0 |
Indvarfactor.debrackets() | 0.0 | 1.0 | 1.0 | 1.0 |
Indvarfactor.equal(Object) | 3.0 | 2.0 | 2.0 | 3.0 |
Indvarfactor.Indvarfactor(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Indvarfactor.toString() | 0.0 | 1.0 | 1.0 | 1.0 |
Lexer.getelse() | 0.0 | 1.0 | 1.0 | 1.0 |
Lexer.getLetter() | 2.0 | 1.0 | 3.0 | 3.0 |
Lexer.getNum() | 2.0 | 1.0 | 3.0 | 3.0 |
Lexer.getToken() | 0.0 | 1.0 | 1.0 | 1.0 |
Lexer.Lexer(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Lexer.next() | 6.0 | 2.0 | 4.0 | 4.0 |
Lexer.peek() | 2.0 | 2.0 | 2.0 | 2.0 |
Mainclass.curtailment(String) | 0.0 | 1.0 | 1.0 | 1.0 |
Mainclass.main(String[]) | 3.0 | 1.0 | 3.0 | 3.0 |
Mainclass.removeconstone(Nestedfactor) | 16.0 | 1.0 | 7.0 | 7.0 |
Mypattern.getAddminusPattern() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getletterPattern() | 0.0 | 1.0 | 1.0 | 1.0 |
Mypattern.getNumPattern() | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.getParameter() | 1.0 | 1.0 | 2.0 | 2.0 |
Parse.getTermcoef() | 1.0 | 1.0 | 2.0 | 2.0 |
Parse.isSelfdefine(String) | 3.0 | 3.0 | 2.0 | 3.0 |
Parse.Parse(Lexer) | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.Parse(Lexer, ArrayList) | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.parseCosfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.parseExponent(Nestedfactor) | 5.0 | 2.0 | 4.0 | 4.0 |
Parse.parseExpression() | 1.0 | 1.0 | 2.0 | 2.0 |
Parse.parseNested() | 25.0 | 12.0 | 13.0 | 13.0 |
Parse.parseSelfdefine(String) | 4.0 | 1.0 | 3.0 | 4.0 |
Parse.parseSinfactor() | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.parseSummation() | 0.0 | 1.0 | 1.0 | 1.0 |
Parse.parseTerm() | 1.0 | 1.0 | 2.0 | 2.0 |
Powerfactor.debrackets() | 6.0 | 4.0 | 5.0 | 5.0 |
Powerfactor.equal(Object) | 3.0 | 2.0 | 3.0 | 4.0 |
Powerfactor.Powerfactor(Nestedfactor, BigInteger) | 0.0 | 1.0 | 1.0 | 1.0 |
Powerfactor.toString() | 2.0 | 2.0 | 2.0 | 2.0 |
Selfdefine.getExpression() | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.getFuncionname() | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.getVarities() | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.Selfdefine() | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.Selfdefine(String, ArrayList, String) | 0.0 | 1.0 | 1.0 | 1.0 |
Selfdefine.substitute(ArrayList) | 2.0 | 1.0 | 3.0 | 3.0 |
Selfdefine.toString() | 1.0 | 1.0 | 2.0 | 2.0 |
Sinfactor.debrackets() | 1.0 | 2.0 | 1.0 | 2.0 |
Sinfactor.equal(Object) | 3.0 | 2.0 | 2.0 | 3.0 |
Sinfactor.Sinfactor(Nestedfactor) | 0.0 | 1.0 | 1.0 | 1.0 |
Sinfactor.toString() | 0.0 | 1.0 | 1.0 | 1.0 |
Summation.extend() | 8.0 | 1.0 | 5.0 | 5.0 |
Summation.Summation(String, String, String, String) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.addAllNestedfactor(ArrayList) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.addNestedfactor(Nestedfactor) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.debrackets() | 6.0 | 5.0 | 5.0 | 5.0 |
Term.equal(Object) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.expmultiplyNest(Expression, Nestedfactor) | 1.0 | 1.0 | 2.0 | 2.0 |
Term.getNesteds() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.getTermcoef() | 2.0 | 2.0 | 2.0 | 2.0 |
Term.hasexpression(ArrayList) | 3.0 | 3.0 | 1.0 | 3.0 |
Term.multiply(ArrayList) | 7.0 | 2.0 | 4.0 | 4.0 |
Term.multiplytwo(Expression, Expression) | 3.0 | 1.0 | 3.0 | 3.0 |
Term.setNesteds(ArrayList) | 0.0 | 1.0 | 1.0 | 1.0 |
Term.Term() | 0.0 | 1.0 | 1.0 | 1.0 |
Term.toString() | 9.0 | 1.0 | 6.0 | 6.0 |
Total | 153.0 | 113.0 | 156.0 | 167.0 |
Average | 1.9870129870129871 | 1.4675324675324675 | 2.0259740259740258 | 2.168831168831169 |
3.3bug修复
表达式解析没有问题,问题出现在解析后表达式缩减的问题,replaceAll("([*]{1}[1]{1})*","")在样例“x**11*cos(x)”中缩减错误,解决方法:“replaceAll("[*]{2}","^")”先将“**”转换成“^”之后再转换回来,对于缩减后表达式过长的问题,解决方法:在Term类中debrackets方法将含有常量因子“0”的项置为零项。
4、bug分析
个人认为搭建一个自动测试是十分重要的,软件的效率远远高于我自己debug的效率,因此在第二单元中我希望自己能搭建出来一个自己的自动测试程序。
5、hack策略
在本单元的互测阶段中,我发现同学的bug点主要集中于边界测试点例如表达式缩减后为0,常量因子数据大小在long的范围之外。
6、架构设计体验
在第一次作业中,我将绝大部分时间都放在了架构设计上,其中有多次返工,导致时间很紧,现在能从中总结出些许经验,打代码之前要有严谨的架构设计,可以大概将思路画在草稿上简单的代入一个样例大概走一遍代码。在第二次作业中由于有了三角函数,自定义函数,求和函数等的简单括号嵌套,正则表达式程序还是依旧能够使用,但是可以看出第二次作业的程序几乎无法在进行需求添加,一旦第三次作业有更多需求,代码只能重构,果不其然,在第三次中我只能重构代码,采取另一种解析方式,因此个人认为初期的框架设计十分重要,程序一定要留有需求扩展空间。
7、心得体会
OO第一单元强调锻炼数据与层次方面设计以及递归方法,在框架设计的时候如果要采用递归方法是真的复杂,对于我来说大量采用递归方法还是第一次,这也导致我第一次作业寸步难行,不断返工,希望在第二单元中能学习到更多的JAVA知识。