標籤:
軟體工程的個人項目是寫一個面向小學生的四則運算題目產生和校正工具。主要功能有兩個,一是產生四則運算題目,二是對給定的題目和答案,校正其中答案的正確性。
時間表格
前期構思的時間比較多,但是在編碼和測試中還是花費了不少的時間。
由於採用的c語言,在字串的處理和記憶體管理上花費了較多的時間。
|
PSP2.1 |
Personal Software Process Stages |
Time |
|
Planning |
計劃 |
|
|
· Estimate |
· 估計這個任務需要多少時間 |
20h |
|
Development |
開發 |
|
|
· Analysis |
· 需求分析 (包括學習新技術) |
6h |
|
· Design Spec |
· 產生設計文檔 |
1h |
|
· Design Review |
· 設計複審 (和同事審核設計文檔) |
1h |
|
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
0.5h |
|
· Design |
· 具體設計 |
2h |
|
· Coding |
· 具體編碼 |
7h |
|
· Code Review |
· 代碼複審 |
1h |
|
· Test |
· 測試(自我測試,修改代碼,提交修改) |
4h |
|
Reporting |
報告 |
|
|
· Test Report |
· 測試報告 |
1h |
|
· Size Measurement |
· 計算工作量 |
0.5h |
|
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出流程改善計劃 |
0.5h |
| |
合計 |
24.5 |
題目分析和思路
主要問題:
1.算式查重
非等價去重
如果兩個運算式的數和操作符都一樣,我們認為這兩個運算式重複。
2.對大量資料的支援,支援1w個算式,考慮到查重需要順序檢索,使用結構體和鏈表3.答案校對需要支援對中綴運算式的計算 1)中綴運算式轉尾碼運算式——調度場演算法 2)尾碼運算式的計算4.真分數的四則運算(a!=0,b!=0) 擷取運算元:a,b,m,n 計算結果:k,l(k/l的形式) 1)加減法:m/a + n/b -> (bm+an)/ab 乘法:m/a × n/b ->mn/ab 除法:m/a ÷ n/b ->mb/na(n!=0) 2)輾轉相除法求得最大公約數,化簡分數(k/l)
if(k>l) x=gcd(k,l);else x=gcd(l,k);
int gcd(int k, int l){ if(k%l==0) return l; else return gcd(l,k%l);} 另:另記得處理化簡之後分母為1的情況5.括弧問題——產生帶括弧的算式 左括弧:第一個數/每一個操作符(不含最後一個),若沒有產生過左括弧,隨機一次是否產生左括弧。 右括弧:每一個操作符,若產生過左括弧沒有產生過右括弧,隨機一次是否產生右括弧。 結尾處:若已經有左括弧但是沒有右括弧,則補上右括弧。 備忘:先檢測右括弧,後檢測左括弧。6.c語言帶來的需要注意的問題:c風格式字串處理,記憶體管理。 代碼中遇到的問題 1.產生過程中的算式結果合法性檢查花費了大量的時間。很多時間花在對產生到一半的運算式進行處理使其成為能夠計算的運算式。 2.處理c風格式字串與生俱來的麻煩,這點在上一點中也有很大影響。 3.記憶體管理問題。為了簡化代碼,構寫了不少函數,傳參和傳回值基本採用char*類型,釋放記憶體的過程中產生了不少問題。 效能分析
ArithmeticProducer.exe -r 50 -n 20000
|
名稱 |
非獨佔樣本數 |
獨佔樣本數 |
非獨佔樣本數百分比 |
獨佔樣本數百分比 |
|
- ArithmeticProducer.exe |
1,159 |
624 |
100.00 |
53.84 |
|
+ produce |
969 |
532 |
83.61 |
45.90 |
|
+ _strcmp |
18 |
18 |
1.55 |
1.55 |
|
+ gcd |
18 |
18 |
1.55 |
1.55 |
|
+ calc |
152 |
16 |
13.11 |
1.38 |
|
+ convert |
25 |
13 |
2.16 |
1.12 |
|
+ transToVulgarFrac |
59 |
8 |
5.09 |
0.69 |
|
+ getRand |
16 |
7 |
1.38 |
0.60 |
|
+ getGcd |
22 |
4 |
1.90 |
0.35 |
|
+ _RTC_CheckEsp |
2 |
2 |
0.17 |
0.17 |
|
+ getIntResult |
109 |
2 |
9.40 |
0.17 |
|
+ @ILT+230 |
1 |
1 |
0.09 |
0.09 |
|
+ @ILT+240 |
1 |
1 |
0.09 |
0.09 |
|
+ _RTC_CheckStackVars |
1 |
1 |
0.09 |
0.09 |
|
+ checkRange |
91 |
1 |
7.85 |
0.09 |
|
+ __tmainCRTStartup |
1,159 |
0 |
100.00 |
0.00 |
|
+ main |
1,159 |
0 |
100.00 |
0.00 |
|
+ mainCRTStartup |
1,159 |
0 |
100.00 |
0.00 |
其中produce()是用於產生算式的函數。
從上述效能分析資料來看,佔據CPU時間最多的produce()函數,佔比高達45.90%。
其它函數中,CPU時間主要耗費在計算上(gcd()用於遞迴計算最大公約數,clac()用於計算尾碼運算式的值,convert()用於將中綴運算式轉換為尾碼運算式以便計算)。
根據分析資料,produce()函數有很大的最佳化空間。
關於四則運算運算式產生和答案校正的筆記