2016012098+小學四則運算練習軟件項目報告
項目地址:https://git.coding.net/meiyoupiqidefan/Four-Operations.git
目錄:
一、需求分析
二、功能設計
三、設計實現
四、算法詳解
五、測試運行
六、粘貼代碼
七、總結
八、展示PSP
————————————————————————————
一、需求分析
由於每次出題的數目不定,所以要求題數參數n由控制臺輸入
小學生水平有限,故每個數字在 0 和 100 之間,運算符在3個到5個之間。
為了讓小學生得到充分鍛煉,每個練習題至少要包含2種運算符。同時,由於小學生沒有分數與負數的概念,所出的練習題在運算過程中不得出現負數與非整數。
————————————————————————————
二、功能設計
基本功能:
實現3~5個運算符的,兩位數以內的,不含小數點的加減乘除四則運算
擴展功能:
支持有括號的運算式
擴展程序功能支持真分數加減法的出題與運算
支持運算時分數的自動化簡
————————————————————————————
三、設計實現
設計包括你會有哪些類,這些類分別負責什麽功能,他們之間的關系怎樣?你會設計哪些重要的函數,關鍵的函數是否需要畫出流程圖?函數之間的邏輯關系如何?
一個類,Main類,實現基本功能的所有要求
Main類下有3個函數:main,evaluateExpression,processOneOperator
main: 生成四則運算式子
evaluateExpression:計算後綴表達式
processOneOperator:對操作符棧頂的一個操作符進行計算
————————————————————————————
四、算法詳解
請描述你生成題目與解答題目用到的算法,並說明在求解題目時你是如何使用調度場算法 或其他算法來處理不同運算符的優先級的?
利用了棧,調度場算法等
調度場算法思想:
從左到右遍歷中綴表達式的每個數字和符號,若是數字就輸出,即成為後綴表達式的一部分;若是符號,則判斷其與棧頂符號的優先級,優先級不高於棧頂符號則棧頂元素一次出棧並輸出,並將當前符號進棧,一直到最終輸出後綴表達式為止。
逆波蘭表達式求值:
從左到右遍歷後綴表達式的每個數字和字符,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧進行運算,運算結果進棧,一直到最終獲得結果。
一個棧存放數字,一個棧存放操作符
————————————————————————————
五、測試運行
你的程序必須是可運行的,請展示程序的運行截圖,包括題目要求實現功能對應的運行截圖。這些截圖說明你的程序確實完成了項目需求,如果程序實現了擴展需求,也請大方秀出來。
————————————————————————————
六、粘貼代碼
粘貼自己覺得比較獨特的或滿意的代碼片段,用博客園正確的代碼控件來顯示。(提示:要有必要的註釋說明,提示:不要貼所有代碼!不符合規定的要倒扣分)
1 //生成算術式 2 int size = list.size(); 3 String[] array = (String[]) list.toArray(new String[size]); 4 5 Random random = new Random(); 6 String str =""; 7 int[] number=new int[6]; 8 boolean flag2 = true; 9 while (flag2) { 10 int[] index = null; 11 int op_number = random.nextInt(3) + 3; // 3-5個運算符,運算符個數 12 index = new int[op_number]; 13 for (int j = 0; j < op_number; j++){ 14 index[j] = random.nextInt(4); 15 number[j] = random.nextInt(100); 16 str += number[j]+array[index[j]]; 17 } 18 // 隨機選擇運算符 19 for (int j = 1; j < op_number; j++) { 20 if (index[0] != index[j]) 21 flag2 = false; 22 } 23 str=str+random.nextInt(100); 24 }
// 後綴表達式 for (int i = 0; i < result.size(); i++) { if (result.get(i).equals("+") || result.get(i).equals("-")) { // 若字符串為"+"或者"-",則執行棧中已存數據的加減乘除計算 while (!operatorStack.isEmpty() && (operatorStack.peek() == ‘+‘ || operatorStack.peek() == ‘-‘ || operatorStack.peek() == ‘*‘ || operatorStack .peek() == ‘/‘)) { processOneOperator(operandStack, operatorStack); } operatorStack.push(result.get(i).charAt(0));// 將操作符壓入操作符棧中 } else if (result.get(i).equals("*") || result.get(i).equals("/")) { // 若字符串為"*"或者"/",則執行棧中已存數據的乘除計算 while (!operatorStack.isEmpty() && (operatorStack.peek() == ‘*‘ || operatorStack.peek() == ‘/‘)) { processOneOperator(operandStack, operatorStack); } operatorStack.push(result.get(i).charAt(0)); } else { // 若遇到的是操作數,則將操作數直接壓入操作數棧中 operandStack.push(Integer.parseInt(result.get(i))); } } // 對棧中數據進行計算,直到棧為空為止 while (!operatorStack.isEmpty()) { processOneOperator(operandStack, operatorStack); } // 此時操作數棧中的棧頂元素也就是計算結果 return operandStack.pop(); }
————————————————————————————
七、總結
你設計的程序如何實現軟件設計的‘模塊化‘原則。
模塊化:模塊化是以分治法為依據。簡單說就是把軟件整體劃分,劃分後的塊組成了軟件。這些塊都相對獨立,之間用接口(協議)通信,每個塊完成一個功能,多個塊組合可以完成一系列功能。
模塊化目的:降低軟件的復雜性,提高工作效率,提高軟件質量
我的模塊化:將功能分為3個函數,main函數用於生成四則運算式子;evaluateExpression函數用於計算後綴表達式;processOneOperator用於對操作符棧頂的一個操作符進行計算。再通過main函數調用evaluateExpression函數,evaluateExpression函數規定優先級,分解成簡單的兩個數字,一個操作符的運算,以實現全部的計算功能。
————————————————————————————
八、展示PSP
這個環節重要的是讓自己看到自己的估計和實際消耗時間,哪個環節耗時最多,哪個環節估計和實踐相差巨大?為什麽?
PSP |
任務內容 |
計劃共完成需要的時間(min) |
實際完成需要的時間(min) |
Planning |
計劃 |
10 |
12 |
Estimate |
估計這個任務需要多少時間,並規劃大致工作步驟 |
5 |
10 |
Development |
開發 |
5*60 |
3*60 |
Analysis |
需求分析 (包括學習新技術) |
10*60 |
8*60 |
Design Spec |
生成設計文檔 |
30 |
50 |
Design Review |
設計復審 (和同事審核設計文檔) |
20 |
1*60 |
Coding Standard |
代碼規範 (為目前的開發制定合適的規範) |
10 |
10 |
Design |
具體設計 |
30 |
45 |
Coding |
具體編碼 |
10*60 |
10*60 |
Code Review |
代碼復審 |
30 |
40 |
Test |
測試(自我測試,修改代碼,提交修改) |
2*60 |
1*60 |
Reporting |
報告 |
2*60 |
60 |
Test Report |
測試報告 |
1*60 |
30 |
Size Measurement |
計算工作量 |
20 |
20 |
Postmortem & Process Improvement Plan |
事後總結, 並提出過程改進計劃 |
30 |
20 |
在技術學習和具體編碼環節花費時間比較多,我在一開始設計思路的時候,有一些具體的函數不會使用,也學習了調度場算法,從吸收到掌握花費了比較多的時間,在具體的編碼上也是一邊寫一邊改,所以也不好說一些具體的時間分配是什麽樣的。但是大體上說,估計用的時間和實際使用的情況差不多,我想,課本上的psp相關內容和老師推薦博客給予了很大幫助。
這次的任務,花費了不少時間,只有去實踐才能進步,查缺補漏,鍛煉自我。
2016012098+小學四則運算練習軟件項目報告