Summary Ⅰ

第一单元设计测试思路
第一部分--类的定义与设计
第一节:功能结构分析
题目最本质的要求是“合理展开表达式“,而展开意味着计算 。(紧扣题意)
第一种最简单展开:+(...)+ -->直接去括号即可;
第二种:简单乘法展开:m*(...) -->对括号内结构进行顺次遍历和变化;
第三种:复杂乘法展开:(...)*(...) -->双遍历和变化;
其中对于幂展开:(...)**m -->m次遍历和变化 ;
通过以上分析,可以发现如果括号内数据的结构不定,功能的结构也无法设计,因此顺理成章地进行结构分析
第二节:数据结构分析
常数因子,带符号整数,不带指数 ;
变量因子:带指数,;
三角函数因子:带指数;
函数因子:不带指数;
求导因子:不带指数;
表达式因子:复合结构 (表达式)主要需要考虑三种组织结构:顺序结构 ? 层次结构 ? 嵌套结构,并且带因子
(因子种类庞大,不符合结构精简的原则,下面会观察因子与因子之间的联系进行优化)
基于对数据结构的分析,可以得出数据之间的层次关系
第三节:类的识别与设计
表达式类(Expr) : 管理顺次相连的项对象,管理作用于相邻项对象的加或减操作符
项类(Item) :管理顺次相连的因子对象
【Summary Ⅰ】因子类() :由于因子种类较多,因此选择性进行合并:将常数因子和变量因子整合为类因子,三角函数为Trig因子,求导因子为Der因子,函数因子为Func因子,表达式为Expr因子
前三节均为掌握题旨之后进行的初步思考和审视,是对代码结构框架的宏观设计,下面将进入到题目的内核
第四节:展开计算
简单乘法展开:针对表达式中的每个项乘以一个因子
复杂乘法展开 :两个表达式中的项两两相乘
幂展开 :多次应用乘法展开
展开之后的表达式中每一项,表示形式可统一:系数*X**幂*Y**幂*Z**幂*三角函数*三角函数
注意:如上展开可以表示为:Norm*Trig*Trig… 即:每个最简项只有一个Norm和多个Trig,但是,并不含有Func,Der,Expr等复杂因子,这三种因子展开后都可以被化简为如上形式
先从宏观考虑最后的结果,再思考如何到达结果
第五节:类的三种主要角色
输入扫描 ? 基于层次化正则 ? 基于递归下降 ? 结果:得到一系列因子(字符串)和连接操作符(字符串)
格式化输出 ? 连接操作符的表示不必冗余存储 ? 必要的输出格式
对象管理类提供统一的对象构造方法:以切分后的字符串(或者解析后的数值)为输入,自动调用相关的类来构造对象 , ,
通过类来管理项对象,形成项对象容器
通过Item类来管理这些因子对象,形成因子对象容器
考虑几个问题:
何时创建对象?
创建时对输入字符串的扫描处理与输入输出类的扫描处理是否有区别?
哪个类需要提供展开功能?(最关键)
哪些类需要提供合并功能?(设计优化)
第二部分--优化(基于功能实现)
狭义优化:
传统优化方法有两种:一种为拿到最终结果后进行合并优化;另一种为在处理过程中进行相关优化 。
我选择了第二种,不仅因为该方法体现了分治的思想,还因为该方法可以带来其他效益,见下 。下面进行简述:
从最底层的Norm,Trig主要根据自身类的特性进行化简(如指数为0的处理等),将优化结果呈递到Term,Term处进行的同类项合并,显然上述四种分类之间不存在不同之间可以合并的情况,即只有同类才可以进行合并 。此处优化方式为:保证Term内元素的有序性,自定义等级,Norm > Trig > Func > Expr > Der