BUAA-面向对象设计与构造2024-第一单元总结

邱柏硕-20373060 邱柏硕-20373060 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

前言

此篇只涉及第一单元的第一次作业。

 

程序架构分析

UML类图

由于时间原因,就没有使用starUML画类图。架构本来自己按照讨论区以及学长的博客进行设计,但最后问题很多,就采用了课程组第二次实验的架构。第二次实验与第一次作业内容相差不大,移除了对表达式的求导部分以及指数函数类,针对形式化描述中整数前可带正负符号进行修改。由于原架构中在Parser读入时就会将乘方展开,为了输出的简化,之后对其进行化简合并等操作。

  • Main为程序入口,其中读入字符串输入,参考讨论区,对其进行去空白符并经过simplifySigns()将最多3个的连续正负号进行缩减。之后交由Parser解析预处理表达式,先后调用expand(),merge(),specialMerge()和specialMerge2(),对表达式进行括号的去除,将展开的项进行聚拢合并,对指数以及未知数x前的数字为1或0时,进行特殊处理以尽量缩短输出字符串的长度,对表达式中有多项且存在项为0时(即结果不只是0),将为0的项进行去除,以缩短输出字符串长度。
  •  但对于输出仍还有优化的地方,比如有的输入,输出会存在正负号连续出现;还有同一表达式,将正号的项移到第一项等,由于时间原因,就没有实现。
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        //preprocess
        String input = scanner.nextLine();
        String processedString = input.replaceAll("[\\s\\t]", "");

        processedString = simplifySigns(processedString);
        //System.out.println(processedString);
        Lexer lexer = new Lexer(processedString);
        //lexer.getToken();

        Parser parser = new Parser(lexer);
        Expr expr = parser.parseExpr();
        //拆括号
        Expr expr1 = (Expr) expr.expand();
        //System.out.println(expr.expand());

        //合并同类项
        Expr expr2 = (Expr) expr1.merge();
        //System.out.println(expr2);

        //指数和数字为1和0 特殊处理
        Expr expr3 = (Expr) expr2.specialMerge();
        //System.out.println(expr3);

        //有多项时,0项不输出
        Expr expr4 = (Expr) expr3.specialMerge2();
        System.out.println(expr4);
    }
  • Lexer类与第二次实验的Lexer类一样,去除了指数函数的token。
  • Parser类按照语义递归下降解析Expr、Term、Factor。在第二次实验基础上,在parseFactor中增加了对带符号整数的处理。
  • Expr、Term、VariFactor、Number类都实现了Factor接口,并重写了clone()。

 

复杂度分析

Class Metrics

 

代码量分析

第一次作业的有效代码行数为570行,应该属于偏多的了。

 

心得体会

这学期已经是我大学本科最后一个学期,考研、毕设、OO各种任务都堆在了一起,第一次作业发布那周正准备毕设的开题答辩,这也是我第一次作业没来得及完成的原因之一。然后一环套一环,第二次、第三次作业都没能完成,这让我担心自己又重蹈覆辙,但毕竟关系到能否毕业,我终于在这周咬咬牙给第一次作业补交过了,但还是推翻了自己的架构,采用了第二次实验所给的架构并进行改动。这使得我仍然担心之后3个单元的9次作业,之后更是毕设和考研的关键时期,望自己能充分利用好时间,将任务量提前,而不是都堆到最后。

 

 

 

 

 

...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部