結對專案進展第二週 模組化分析

2022-08-19 15:18:09 字數 2870 閱讀 3898

結對專案第一步:把實現的四則運算程式的功能劃分模組,將不同模組功能分開,從而使模組可復用,並作為獨立的部分進行測試。

優化的四則運算程式需要高內聚和低耦合。而我們組寫得**使用了樹的資料結構,雖然表達起來簡單易懂,演算法也比較容易實現,卻有著乙個很大的缺點:我們在遞迴生成運算表示式的同事計算了表示式的結果。這樣雖然演算法和實現的**都很簡便,卻不符合模組化的思想。

我們選擇的原型程式,一共有輸入、隨機生成表示式框架(只有運算子但沒有資料)、在框架中填入數字並計算結果、輸出共四個模組。實現的時候覺得很簡單,還以為自己選擇了一種不錯的演算法。不過現在也覺得這種演算法不錯,起碼很新穎,但是基於可復用性強的原則來看,模組的劃分就太不合理了,並且不符合低耦合高內聚的要求。根據討論,我們決定將以前程式的主模組再細分為兩個模組,分別為自動生成表示式模組和根據表示式求解模組。總之,就是將以前的模組拆開,然後重組為新的模組。

對於自動生成表示式模組,我們現有的**還是有很強的實用性的。面臨的問題就是:如何根據表示式求解。我們一致認為不應該拋棄原來的資料結構,所以新的模組功能設定為:先獲得使用者輸入的表示式字串,然後將字串轉換成樹結構。

接下來面臨的問題是運算元的多樣性,首先要將運算元字串轉換為相應的資料型別。

實現如下:

void charstoint(char *tmpstr,int flag1, int flag2, int * numer, int * demon,int

i) tmpstr1[j] = '\0'

; tmpint1 =atoi(tmpstr1);

//帶分數中的分子部分

for (j = flag1+1 ; j < flag2; j++)

tmpstr1[j - flag1 -1] = '\0'

; tmpint2 =atoi(tmpstr1);

//帶分數中的分母部分

for (j = flag2+1; j < i; j++)

tmpstr1[j - flag2 -1] = '\0'

; tmpint3 =atoi(tmpstr1);

*(numer) = tmpint1 * tmpint3 +tmpint2;

*(demon) =tmpint2;

}else

tmpstr1[j] = '\0'

; *(numer) =atoi(tmpstr1);

for (j = flag2 + 1; j < i; j++)

tmpstr1[j] = '\0'

; *(demon) =atoi(tmpstr1);

}}

實現函式中用到了兩個棧:運算元棧&運算子棧

從表示式第一位開始讀取字元,如果讀到的字元不是運算子,那麼就是運算元(錯誤的情況單考慮),運算元有分數和整數。

比如運算元為11『2/3,這是乙個帶分數,現在讀取到的是'1',根據這個子字串得到運算元的分子numer,分母demon。在讀取的過程中,用兩個標誌位表示符號 』 和符號 /的位置。然後用charstoint()將這個子字串變成value型別的運算元,即operation.numer = 35,operation.demon = 3.

如果讀取的是運算子,還要分運算子是否為括號。為左括號進棧,為右括號則脫括號。

void experssion::generatetree(string

expr)

if (tmpchar == '/'

)

tmpchar = expr[idx++];

i++;

}tmpstr[i] = '\0'

;

//處理這個暫存的字串,獲得分子分母

if (flag1 == 0 && flag2 == 0)//

為整數

else

//為分數

value operation(numer,demon);

p = new

experssion();

p->result =operation;

datastack.push(p);

}else

//讀取的是運算子

p = new

experssion();

p->oper =c;

if(datastack.size())

if(datastack.size())

datastack.push(p);

}tmpchar = expr[idx++];

break

;

default

:

if (operstack.size() == 0 || tmpchar != '

\0'

&& operlevel(operstack.top()) else

if(datastack.size())

datastack.push(p);

operstack.pop();

}break

; }}}

p =datastack.top();

datastack.pop();

this->oper = p->oper;

this->left = p->left;

this->right = p->right;

}

最後根據生成的表示式樹求解,採用遞迴的方法:

//

由生成的表示式樹求解

value experssion::getresult()

return

result;

}else

}

結對程式設計專案 四則運算 第二週

1.要滿足加減乘除的運算,包含括號,支援真分數 2.物件選擇生成四則運算題目的數量 3.手動輸入結果 4.題目要可以驗證結果正確與否並統計正確率 5.要輸出檔案 6.可以支援多運算子 7.將程式的過程寫入檔案 8.最好使用棧的方式,中綴轉字尾 9.物件可以選擇題目運算子的數量決定題目的難度1.先將 ...

個人專案四則運算生成程式進展 第二週

我認為四則運算生成程式功能上分為兩大部分,隨機生成四則運算表示式 四則運算表示式的計算 開始的時候想從程式設計結構上劃分這兩部分,用逆波蘭表示式和棧的結構進行四則運算的計算,但是實現效果不太理想,程式設計到一半就編不下去了。後來上網查閱了一些資料,並受到 編譯原理 書中表示式可以用樹的結構來表示的啟...

第二次作業 結對專案之需求分析與原型設計

本次作業deadline 2020 9 28 10 00pm 一 閱讀 構建之法 第3章和第8章的內容,並在下方作業裡體現出閱讀後的成果。特別是第8章中的nabcd模型。二 結對合作,閱讀下方的客戶描述的現實困擾,請你們能將整套流程資訊化,以共同發布乙份部落格隨筆的形式,設計一套方案,向客戶推銷。描...