結對專案第一步:把實現的四則運算程式的功能劃分模組,將不同模組功能分開,從而使模組可復用,並作為獨立的部分進行測試。
優化的四則運算程式需要高內聚和低耦合。而我們組寫得**使用了樹的資料結構,雖然表達起來簡單易懂,演算法也比較容易實現,卻有著乙個很大的缺點:我們在遞迴生成運算表示式的同事計算了表示式的結果。這樣雖然演算法和實現的**都很簡便,卻不符合模組化的思想。
我們選擇的原型程式,一共有輸入、隨機生成表示式框架(只有運算子但沒有資料)、在框架中填入數字並計算結果、輸出共四個模組。實現的時候覺得很簡單,還以為自己選擇了一種不錯的演算法。不過現在也覺得這種演算法不錯,起碼很新穎,但是基於可復用性強的原則來看,模組的劃分就太不合理了,並且不符合低耦合高內聚的要求。根據討論,我們決定將以前程式的主模組再細分為兩個模組,分別為自動生成表示式模組和根據表示式求解模組。總之,就是將以前的模組拆開,然後重組為新的模組。
對於自動生成表示式模組,我們現有的**還是有很強的實用性的。面臨的問題就是:如何根據表示式求解。我們一致認為不應該拋棄原來的資料結構,所以新的模組功能設定為:先獲得使用者輸入的表示式字串,然後將字串轉換成樹結構。
接下來面臨的問題是運算元的多樣性,首先要將運算元字串轉換為相應的資料型別。
實現如下:
void charstoint(char *tmpstr,int flag1, int flag2, int * numer, int * demon,inti) 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(stringexpr)
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模型。二 結對合作,閱讀下方的客戶描述的現實困擾,請你們能將整套流程資訊化,以共同發布乙份部落格隨筆的形式,設計一套方案,向客戶推銷。描...