任務:實現一個自動生成小學四則運算題目的命令行程序。
一、時間預估及實際花費時間
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
計划 |
|
· Estimate |
· 估計這個任務需要多少時間 |
15h |
Development |
開發 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
2h |
· Design Spec |
· 生成設計文檔 |
0.5h |
· Design Review |
· 設計復審 (和同事審核設計文檔) |
0.5h |
· Coding Standard |
· 代碼規范 (為目前的開發制定合適的規范) |
1h |
· Design |
· 具體設計 |
3h |
· Coding |
· 具體編碼 |
3h |
· Code Review |
· 代碼復審 |
1h |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
3h |
Reporting |
報告 |
|
· Test Report |
· 測試報告 |
1h |
· Size Measurement |
· 計算工作量 |
1h |
· Postmortem & Process Improvement Plan |
· 事后總結, 並提出過程改進計划 |
0.5h |
|
合計 |
16.5h |
二、項目分析與設計
這項任務要求我們能夠隨機,不重復的生成小學四則運算表達式。在生成的同時能夠計算出這些表達式的標准答案,並能對已有的作答文件進行對錯判斷。
從項目的需求進行如下分析:
1.既然是隨機生成表達式,必然會用到隨機型變量。
2.對標准答案有需求,所以計算表達式是一個重要的模塊。
3.對錯評判涉及到兩個文件內容的比較。

由項目需求及分析可作出如下大致的設計方案:
1.可構造一個表達式類,類中主要有隨機生成表達式的方法。
2.需要一個計算表達式的函數。而中綴表達式通常需要轉換為后綴表達式然后再進行計算,這就設計到了兩個函數。
3.項目需要進行文件的讀寫,每次運行時要檢查文件的狀態,在進行新的生成時要清空上一次數據。
使用較多的中綴表達式轉后綴表達式函數:
public static ArrayList toBehind(string mid) { ArrayList arr=new ArrayList(); int top=-1; char p=' '; char[] a=new char[10]; int math = 0; Boolean sign = false; for(int i=0;i<mid.Length;i++) { Boolean continuesign = false; p=mid[i]; //取表達式中一個元素 while(p>='0'&&p<='9') //如果是運算數則直接輸出 { if (sign) { math = math * 10 + (p - '0'); continuesign = true; break; } else { math = p - '0'; sign = true; continuesign = true; break; } } if (continuesign) continue; if (sign) { arr.Add(math); math = 0; sign = false; } switch(p) { case '#' : while(top>=0) arr.Add(a[top--]); return arr; case ')' : while (a[top]!='(') { arr.Add(a[top]); top--; } top--; //放棄讀到的')',並且棧頂‘(’退棧 break; default : if(top==-1) { a[++top]=p; break; } if(Program.adv(a[top],p)==1) // 若當前運算符優先級低則取代棧頂運算符,原運算符出棧 { arr.Add(a[top]); a[top]=p; } else //若當前運算符優先級高於棧頂運算符,進棧 a[++top]=p; break; } } return null; }
三、性能分析圖
為了了解這個程序的性能,使用了VS的性能分析工具,得到了以下兩張性能分析圖。
四、測試實例
1/4 ÷ 3/9
4/7 × 1/3
2/5 ÷ 4/6
4 + 8 + 2
5/6 + 5/8
(5 × 4) × 1 × 8
2 × 9 + (4 × 3)
2/4 + 5/7
8/9 × 1/3
3 + (2 × 5)
在Answers.txt能夠准確得出答案:
3/4
4/21
3/5
14
11/24
160
30
1'3/14
8/27
13
五、個人項目總結
通過這次個人項目,我學到了很多經驗和教訓:
- 簡單的題目往深處去探討往往並不簡單。這次個人項目的生成四則運算表達式看似很簡單,實際上蘊含着查重,分數等諸多復雜的問題,需要我們做好充分的設計。
- 設計對於一個項目十分重要。以前經常喜歡拿到題目,構思好算法就直接碼代碼。結果在過程中才發現自己寫的代碼邏輯不盡人意。
- 麻雀雖小,五臟俱全。這雖然僅是一個為期一周的個人項目,卻包含了項目的各個要素。諸如設計,測試等步驟必不可少,否則便會遇到難以預料的問題。