Skip to content

面向对象设计与构造第二次作业

题目描述

本次作业需要完成的任务为:读入自定义递推函数的定义以及一个包含幂函数、三角函数、自定义递推函数调用的表达式,输出恒等变形展开所有括号后的表达式。

在本次作业中,展开所有括号的定义是:对原输入表达式 \(E\)恒等变形,得到新表达式 \(E'\)。其中, \(E'\) 中不再含有自定义递推函数,且只包含必要的括号

迭代内容概览

在第一次作业基础上,本次迭代作业增加了以下几点:

  • 本次作业支持嵌套多层括号。
  • 本次作业新增三角函数因子,三角函数括号内部包含任意因子。
  • 本次作业新增自定义递推函数因子。

基本概念(新增)

基本概念的声明

  • 因子
    • 三角函数
      • 一般形式:类似于幂函数,由 sin(<因子>)cos(<因子>) 、指数符号 ^ 和指数组成,其中指数为符号不是 - 的整数,如:sin(x) ^ +2
      • 省略形式:当指数为 1 的时候,可以采用省略形式,省略指数符号 ^ 和指数部分,如:sin(x)
      • 本指导书范围内的“三角函数”仅包含 sincos
    • 自定义递推函数

      • 自定义递推函数的定义形如

        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 个自定义递推函数。 n01 是递推函数的序号。

      • xy 是递推函数的形参。在本次作业中,形参个数为 1~2 个。形参只使用 xy,且同一函数定义中不会出现重复使用的形参。对一个自定义递推函数的定义来说,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 [空白项 '+' 空白项 函数表达式]
  • 函数表达式 → 表达式(将自变量扩展为形参自变量) (注:本次作业中函数表达式不允许出现任何函数调用)