天天看點

2016012084+國小四則運算練習軟體項目報告

倉庫: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.設計實作

2016012084+國小四則運算練習軟體項目報告

4.算法詳解

生成算子算符 —— 算結果并判斷合法——生成算式(加括号)——輸出

如何使用排程場算法

  1. 先随機生成一串算子(真分數或整數)和一串算符(加減乘除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

3.生成算式(加括号)

  • 情況1:如果是真分數加減直接輸出
  • 情況2:整數加減乘除

    設定2個整型priority1 ,priority2 對算子串中前後兩個算子進行優先級判斷,

    +

    -

    為低優先級0,

    ×

    /

    為高優先級1。

    如果priority1 ,priority2 為

    01

    那麼在兩端加括号,否則

    00 10 11

    則不加。

5.測試運作

2016012084+國小四則運算練習軟體項目報告

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的時候會省下大量的時間。