2016012007+小學四則運算練習軟件項目報告
此次作業的源碼地址:https://coding.net/u/ClausKE/p/Calculator1/git/tree/master/
寫在前面:這次的作業完成得不易,在跟一些同學的交流中對這次作業有了更多的理解,在咨詢了一些較厲害的大佬後,我才學習到了一些新的東西,但因理解得不夠完全,只是較為基礎地完成了這次作業,不得不說,大一時候在工作室的學習到的一些東西漸漸都忘了,日後要更加努力打好基礎。
一、需求分析
1.完成一個程序,輸入參數n,隨機產生n道加減乘除練習題,每個數字在0和100之間,運算符在3個到5個之間。
2.每個練習題至少包含兩種運算符,在練習運算中不能出現負數和非整數。
二、功能設計
1)基本功能:
2)附加功能:支持有括號的運算,支持真分數的出題與運算。這部分還沒有實現,希望能在詢問同學、與同學交流過後,從同學和老師那兒獲得一些幫助。
三、設計實現
我的代碼較為簡單,實現的功能也較為基礎,包含一個Main類,負責設計生成n道題目,其中包含三個方法,分別實現生成一個符號的運算題目、生成多個符號的運算題目和對生成的題目進行計算得值。
四、算法詳解
通過比較得出被減數與減數的大小並判斷是否交換它們的值來保證不會出現負數的運算,通過對除數與被除數設定關系,保證運算中出現除法都是整除。通過了解,java中有一個eval函數能夠對加減乘除進行優先級判斷。
五、測試運行
以下是我的生成題目和其對應的計算結果:
六、代碼片段
以下代碼片段是我用來保證減法運算不會得到負數,除法運算得到的結果都是整除的。
//生成簡單的四則運算 public String Sentence1() { int x = (int) (Math.random() * 100);// 定義x為一個100內的數 int y = (int) (Math.random() * 100);// 定義y為一個100內的數 int z = (int) (Math.random() * 4);// 定義z為0或1或2或3 //用z代表符號,z=1則為減法if (z == 1) {// 如果是減法,保證減數小於被減數 if (x < y) { int temp = x; x = y; y = temp; } } //z=3為除法 if (z == 3) {// 如果是除法,保證能整除 y = (int) (Math.random() * 20) + 1; x = (int) (Math.random() * 6) * y; } //a為表達式 String a = x + symbols1[z] + y; if (symbols1[z].equals("-") || symbols1[z].equals("+")) { flag = 1; } return a; }
//進行計算 public void Sentence3() { Stack<String> num = new Stack<>(); Stack<Character> operate = new Stack<>(); int q = (int) (Math.random() * 2) + 2; String sentence = Sentence2(q);//調用方法sentence2(q),生成多個符號的運算 int l = sentence.length(); int t = 0; int rt = 0; for (int m = -1; m < l - 1; m++) { if (sentence.charAt(m + 1) == ‘+‘ || sentence.charAt(m + 1) == ‘-‘ || sentence.charAt(m + 1) == ‘*‘ || sentence.charAt(m + 1) == ‘÷‘ || m == l - 2) { if (m == -1) { operate.push(sentence.charAt(0)); } else if (m == l - 2) { num.push(sentence.substring(t)); break; } else { if (t <= m) { num.push(sentence.substring(t, m + 1)); } if (operate.empty() ) { operate.push(sentence.charAt(m + 1)); } else if ((operate.peek() == ‘+‘ || operate.peek() == ‘-‘) && (sentence.charAt(m + 1) == ‘*‘ || sentence.charAt(m + 1) == ‘÷‘)) { operate.push(sentence.charAt(m + 1)); } else { if(operate.peek()==sentence.charAt(m + 1)){ rt++; } num.push(String.valueOf(operate.pop())); operate.push(sentence.charAt(m + 1)); } } t = m + 2; } } if(rt==q+2){//符號有無重復 er=1; } while (!operate.empty()) { num.push(String.valueOf(operate.pop())); } String[] result = new String[20]; int g = 0; while (!num.empty()) { result[g] = num.pop(); g++; }
七、總結
我設計的程序用三個方法的相互調用來完成了生成的n道題目,並保證完成了基礎的作業要求。經過這次作業,我也體會到了IT行業的不易,軟件工程這個專業的不易,雖然我現在做的還只是一個小小的項目,但是我已經意識到了我要為了這份作業付出的努力,未來的編程之路也會更坎坷,需要我不斷地學習,與他人交流,向大佬還有老師們提問,借鑒他們邏輯、算法和項目實現過程中的優點。只有努力地學習,才能在未來有一份好的工作,才能為國家做出點貢獻。加油!
八、PSP展示
PSP | 任務內容 | 計劃時間(h) | 實際完成時間(h) |
planning | 計劃 | 0.5 | 1 |
estimate | 估計每個階段的時間成本,並規劃大致工作步驟 | 0.5 | 1 |
development | 開發 | 5 | 7 |
analysis | 需求分析 | 0.5 | 0.5 |
design spec | 生成設計文檔 | 0.5 | 0.5 |
design review | 設計復審 | 1 | 1.5 |
coding standard | 代碼規範 | 1 | 1 |
design | 具體設計 | 1 | 1 |
coding | 具體編碼 | 5 | 10 |
code review | 代碼復審 | 2 | 2 |
test | 測試 | 1 | 1 |
reporting | 報告 | 0.5 | 0.5 |
size measurement | 計算工作量 | 0.5 | 0.5 |
postmortem&process improvement plan | 事後總結,並提出過程改進計劃 | 1 | 1 |
2016012007+小學四則運算練習軟件項目報告