面向物件第一單元部落格
阿新 • • 發佈:2022-03-26
面向物件第一單元部落格
這次作業由於各種原因只完成第三次作業,在此對第三次作業的一些設計進行分享
類設計
Main
實現程式的頂層邏輯,包括輸入,輸出處理
Function
表示一個自定義函式
成員變數
- char name 函式的名字即(f、g、h)
- String expr 以字串的形式儲存了函式的表示式
- ArrayList \
funVar 儲存了函式自變數的順序
方法
- parseFunction(String poly) 將函式表示式解析為一個Function物件進行儲存
InputPoly
具有的功能:將標準輸入中的字串轉化為Poly類物件poly,並實現簡化,輸出的功能
成員變數
- Poly poly
- PolyParser parser
方法
- InputPoly(String str):將輸入的str解析為Poly類物件並賦值給poly
- void simplify():將poly進行合併同類項等優化操作,得到的結果賦值給poly
- public Poly parse(String str)對str進行解析,得到一個Poly物件
parse
功能:對輸入串進行預處理與格式檢查,然後呼叫parser生成Poly類物件
PolyParser
功能:使用遞迴下降方式解析多項式
具體實現:根據形式化定義從左到右掃描出現的符號,遇到可展開的符號就呼叫相應的函式解析該符號,解析完成就返回並繼續向下解析。
對自定義函式解析方式
我對自定義函式處理的方式如下:
*
Poly
具有的功能:表示一個表示式,管理其下所有的項,
成員變數
- Arraylist\
termList - Boolean simplifyFlag:表示該多項式是否被簡化過,初值為false
- BigInteger exp:表示該多項式的指數
方法
- Poly simplify():將Poly進行簡化並生成新的Poly類物件
- void mergePoly(Poly poly):合併一個多項式,不化簡
- static Poly multPoly(Poly src1,Poly src2)實現兩個多項式相乘,不化簡
simplify
執行邏輯:
- 生成一個新的Poly類物件ret
- 對termList的每個項呼叫simplify方法進行簡化併合併入成多項式ret
- 合併成多項式時合併同類項,每呼叫一次mergeAndSimplify就合併一次
- ret內部狀態是已被化簡的
- 根據指數展開多項式,並化簡
- 設定simplifyFlag = true,返回ret
polymultPoly
實現兩個多項式相乘
- 先對兩個多項式進行化簡
- 遍歷兩個多項式的每個項,進行乘法運算然後相加合併成一個多項式並化簡返回
Term
表示一個項,管理所有的因子
成員變數
FactorList factorList
方法
Poly simplify():將該項各因子進行簡化(去括號)
simplify
執行邏輯:
- 建立一個新的Poly類物件poly
- 檢查自身是否已經被化簡,若是,則將自身加入poly中並返回
- 遍歷factorList
- 記錄所有的常數因子和所有的變數因子
- 遇到第一個多項式因子直接合併入poly中,並化簡,若不是第一個,呼叫方法Poly.polymultPoly將該因子與poly合併為一個新多項式並賦值給poly
- 將常數因子和變數因子組成Poly類物件ret,若poly中沒有項,判斷poly是否因為合併而變為空,若不是,則直接返回ret,然後設simplifyFlag = true,呼叫方法polyMultPoly合併入ret中
- 並返回ret