倉庫:https://git.coding.net/librarian1/Calculate_Operations.git
- 目錄
- 需求分析
- 功能設計
- 設計實作
- 算法詳解
- 測試運作
- 代碼展示
- 總結
- 展示PSP
1.需求分析
-
輸入n,生成n道加減乘除
要求:數範圍0~100 ,4-6個;運算符3~5個,至少2種 ;數與結果不出現負數和非整數,除數不為0。
- 附加:支援括号,大于2個但不超過運算符數 ;支援真分數的加減,自動化簡 ;真分數2-3個,3個時包括加減。
2.功能設計
-
基本功能 ✓
輸入n ,判斷合法
随機生成符合要求的算符和算子,計算結果并判斷合法(正負和分母不為0),輸出并生成檔案result.txt,判斷建立檔案 。
-
擴充功能 ✓
随機産生帶括号的正整數運算或真分數運算。
3.設計實作
4.算法詳解
生成算子算符 —— 算結果并判斷合法——生成算式(加括号)——輸出
如何使用排程場算法
- 先随機生成一串算子(真分數或整數)和一串算符(加減乘除2種以上),存入兩個連結清單
算子:A B C D
算符:x y z
2.算結果并判斷合法、化簡
-
情況1:如果是真分數加減不用加括号
逐漸計算化簡出結果,一旦過程出現負數或分母為零,則跳出
A x B y C z D (全是加減運算)
-
情況2:整數加減乘除,有優先級
逐漸計算出結果,一旦過程出現負數或分母為零,則跳出
A x B y C z D
注意:這其中會出現 A + B * C
從左至右的運算,但之後輸出算式會是 (A + B)* C
。
A + B * C
(A + B)* C
3.生成算式(加括号)
- 情況1:如果是真分數加減直接輸出
-
情況2:整數加減乘除
設定2個整型priority1 ,priority2 對算子串中前後兩個算子進行優先級判斷,
和+
為低優先級0,-
×
/
為高優先級1。
如果priority1 ,priority2 為
那麼在兩端加括号,否則01
則不加。00 10 11
5.測試運作
6.代碼展示
括号的實作
int priority1 = 0, priority2 = 0; // 加減乘除優先級
p = OperatorL.first;
q = CharaL.first;
String operation = p.data + "";
……
else //生成分數算式
{
while(!(q == null))
{
p = p.next;
String fchara = q.character;
priority1 = priority2 = 0;
if(!(q.next == null)) //如果不是最後一個算子,那麼判斷前後算子優先級
{
String lchara = q.next.character;
if(fchara == "+" || fchara == "-")
priority1 = 0;
else if(fchara == "*" || fchara == "/")
priority1 = 1;
if(lchara == "+" || lchara == "-")
priority2 = 0;
else if(lchara == "*" || lchara == "/")
priority2 = 1;
}
if(priority1 == 0 && priority2 == 1)
{
operation ="(" + operation + q.character
+ p.data + ")"; //低優先級在高優先級前,那麼兩邊加括号
}
else
{
operation = operation + q.character + p.data;
}
q = q.next;
}
7.總結:
我在設計階段大概畫出了算法流程和類,是以程式設計的時候就先生成空方法和空類的架構,再具體的子產品中輸代碼,其中需要多次調用的方法greatestcommondivisor和連結清單方法都單獨列出,使代碼簡潔。這種自上而下的程式設計确實比逐漸程式設計高效,但隻有在比較複雜和龐大的項目中才得以展現。
8.展示PSP
任務内容 | 計劃共完成需要的時間(min) | 實際完成需要的時間(min) |
---|---|---|
計劃 | 10 | |
· 估計這個任務需要多少時間,并規劃大緻工作步驟 | ||
開發 | 440 | 860 |
· 需求分析 (包括學習新技術) | 20 | 30 |
· 生成設計文檔 | ||
· 設計複審 (和同僚稽核設計文檔) | 5 | |
· 代碼規範 (為目前的開發制定合适的規範) | ||
· 具體設計 | 60 | 90 |
· 具體編碼 | 240 | 540 |
· 代碼複審 | ||
· 測試(自我測試,修改代碼,送出修改) | 120 | |
報告 | 25 | 12 |
· 測試報告 | ||
· 計算工作量 | 2 | |
· 事後總結, 并提出過程改進計劃 |
我在具體編碼的時間和測試的時間比預計高出許多,但在這一過程中算法反而不是我程式設計過程中所遇到的難題,但是因為對程式設計不熟練,出現了很多編譯錯誤,其中一個NullPointer的錯誤讓我調試了一個多小時。
同時我也體會到了注釋的重要性,如果注釋了不确定或不了解的地方,那麼debug的時候會省下大量的時間。