面向对象设计与构造第二次作业
题目描述
本次作业需要完成的任务为:读入自定义递推函数的定义以及一个包含幂函数、三角函数、自定义递推函数调用的表达式,输出恒等变形展开所有括号后的表达式。
在本次作业中,展开所有括号的定义是:对原输入表达式 \(E\) 做恒等变形,得到新表达式 \(E'\)。其中, \(E'\) 中不再含有自定义递推函数,且只包含必要的括号。
迭代内容概览
在第一次作业基础上,本次迭代作业增加了以下几点:
- 本次作业支持嵌套多层括号。
- 本次作业新增三角函数因子,三角函数括号内部包含任意因子。
- 本次作业新增自定义递推函数因子。
基本概念(新增)
基本概念的声明
- 因子
- 三角函数
- 一般形式:类似于幂函数,由
sin(<因子>)或cos(<因子>)、指数符号^和指数组成,其中指数为符号不是-的整数,如:sin(x) ^ +2。 - 省略形式:当指数为 1 的时候,可以采用省略形式,省略指数符号
^和指数部分,如:sin(x)。 - 本指导书范围内的“三角函数”仅包含
sin和cos。
- 一般形式:类似于幂函数,由
-
自定义递推函数
-
自定义递推函数的定义形如
f{n}(x, y) = 递推表达式 f{0}(x, y) = 函数表达式 f{1}(x, y) = 函数表达式三者顺序任意,以换行分隔。递推表达式和函数表达式的定义见“形式化表述”部分。定义中默认 \(n>1\)。
例如:f{0}(y) = y f{1}(y) = 1 f{n}(y) = 1*f{n-1}(sin(y)) - 4*f{n-2}(y^2) + 1 // or f{0}(x, y) = x - y f{n}(x, y) = 0*f{n-1}(x, y) + 35*f{n-2}(x, y^2) f{1}(x, y) = x^3 + y -
f是递推函数的函数名。在本次作业中,保证函数名只使用f,且每次只有 1 个自定义递推函数。n、0、1是递推函数的序号。 x、y是递推函数的形参。在本次作业中,形参个数为 1~2 个。形参只使用x,y,且同一函数定义中不会出现重复使用的形参。对一个自定义递推函数的定义来说,f{n}、f{n-1}、f{n-2}、…、f{1}、f{0}等一系列函数的形参统一,不会出现同一系列中函数形参不同的情况。- 递推表达式是一个关于形参的表达式,保证其中
f{n-1}和f{n-2}各被调用且只被调用 1 次,并且调用前需要和一个常数因子相乘。本次作业保证没有其他函数调用。函数表达式是一个关于形参的表达式。二者的一般形式见形式化定义。 - 自定义递推函数的调用形如
f{序号}(因子, 因子),比如f{3}(x^2),f{5}(-1, sin(x^2))。
-
- 三角函数
设定的形式化表述
自定义递推函数相关
- 自定义递推函数定义 → 定义列表
- 定义列表 → 初始定义 换行 初始定义 换行 递推定义 | 初始定义 换行 递推定义 换行 初始定义 | 递推定义 换行 初始定义 换行 初始定义
- 初始定义 → 'f' '{' 初始序号 '}' 空白项 '(' 空白项 形参自变量 空白项 [',' 空白项 形参自变量 空白项] ')' 空白项 '=' 空白项 函数表达式
- 初始序号 → '0' | '1'
- 递推定义 → 'f{n}' 空白项 '(' 空白项 形参自变量 空白项 [',' 空白项 形参自变量 空白项] ')' 空白项 '=' 空白项 递推表达式
- 序号 → '0'|'1'|'2'|'3'|'4'|'5'
- 形参自变量 → 'x' | 'y'
- 自定义递推函数调用 → 'f{' 序号 '}' 空白项 '(' 空白项 因子 空白项 [',' 空白项 因子 空白项] ')'
- 自定义递推函数调用n-1 → 'f{n-1}' 空白项 '(' 空白项 因子 空白项 [',' 空白项 因子 空白项] ')'(注:本次作业中此处的因子不允许出现任何函数调用)
- 自定义递推函数调用n-2 → 'f{n-2}' 空白项 '(' 空白项 因子 空白项 [',' 空白项 因子 空白项] ')'(注:本次作业中此处的因子不允许出现任何函数调用)
- 递推表达式 → 常数因子 空白项 '*' 空白项 自定义递推函数调用n-1 空白项 加减 空白项 常数因子 空白项 '*' 空白项 自定义递推函数调用n-2 [空白项 '+' 空白项 函数表达式]
- 函数表达式 → 表达式(将自变量扩展为形参自变量) (注:本次作业中函数表达式不允许出现任何函数调用)