BUAA_OO_2024_UNIT 1 总结

作业要求

读入一个包含加、减、乘、乘方以及括号表达式,输出恒等变形展开所有括号后的表达式。

  • 第一次作业: 单变量,括号嵌套只有一层
  • 第二次作业: 新增指数函数,自定义函数,以及多层嵌套
  • 第三次作业 : 新增导数因子

设计思路

第一次作业设有 :
MainClass , Expr , Term , Variable ,Lexer , Parser , Factor
第二次作业新增 :
AllDefineFunc , DefineFunc , Exp , ExpFunc
第三次作业新增 :
Differentiation

简单介绍 :
MainClass

  • 用于读入输入
  • 函数定义处理
  • 输入的预处理
  • 词法分析和语法解析
  • 结果输出

Factor

  • 接口~

Expr

  • 一个多项式表达式类
  • 合拼同类项
  • 展开多项式
  • 替换因子

遍历表达式中的每个项和因子,如果因子是指数函数则调用指数函数的替换方法,如果是表达式则递归调用方法处理内部的因子替换。

Term

  • 添加因子
  • 因子分析
  • 调用方法处理不同类型因子(指数函数和表达式)之间的运算

Variable

  • 获取变量包括单变量(x),系数,新增变量(y),(z),函数fgh等…
  • 比较指数变量是否相等
  • 检查变量是否不包含 x、y、z 中的任何一个,获取和设置 x、y、z 的指数值等。

Lexer

  • 实现方法大致和oolens递归下降篇一样

Parser

  • 实现方法大致和oolens递归下降篇一样

AllDefineFunc

  • 利用 HashMap 来管理已定义的函数
  • 通过 putInFunct 方法添加函数,并通过 getMap 方法获取整个函数映射。

DefineFunc

  • 用于处理单个函数的定义和表达式
  • 定义一个 initialize 方法用于解析函数定义字符串,并初始化函数的类型、参数和表达式。
  • 通过正则表达式匹配来提取函数类型和参数。
  • 对函数表达式部分进行预处理,并生成最终的表达式字符串。
  • 使用 LexerParser 对象对表达式字符串进行词法分析和语法解析,生成表达式对象 expr

Exp

  • 对指数项的初始化、获取和设置幂次、复制、比较相等性
  • 判断是否可以相乘以及转换为字符串的操作
  • 将指数项转换为字符串表示形式

ExpFunc

  • 指数函数的初始化、添加指数项、带入因子
  • 两个指数函数是否满足加法或减法的条件
  • 系数和变量是否匹配
  • 变量是否匹配以及指数项数量和内容是否相同
  • 将指数函数转换为字符串表示形式

Differentiation

  • 指数函数、因子和整个表达式进行求导
  • 主要根据不同的输入类型,选择不同的求导方式,并生成新的表达式对象表示导数。

类复杂度

在这里插入图片描述

方法复杂度分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

BUG

第一单元的三次作业皆可发现很多bug,甚至在第二第三次的作业被hack爆了,可以发现自己在预处理方面考虑不周全,在指数函数power展开方面也没有处理好,导致没有通过评测。

优缺点

  • Factor接口能将不同类型的因子分类,较容易进行修改,并且后面发现迭代作业也很方便
  • 有些方法的设计复杂度过高
  • 如有增merge方法可能会更好(如第二次上机)

心得体会

看了参与过先导课和未参与先导课的有效作业和强测成绩占比,觉得先导课真的很重要,但我不知道有先导课 毕竟国际学院学生在大一大二不能自己选课 ,故没参加先导课。刚接触到第一次作业的任务时,无从下手,对递归下降也完全不了解,庆幸有很多优秀学长姐的博客作为参考,一步一步学上来。对于第一单元的三次作业完成度,我并不满意,希望能在代码性能上完成的更好,可拓展性处理的更好,思想更能面向对象。

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值