個人項目實戰-四則混合運算 coding.net源碼地址 :https://git.dev.tencent.com/qyj814/fours.git 一.實驗要求 基本任務: 使用JAVA編程語言,獨立完成一個3到5個運算符的四則運算練習的軟體。 軟體基本功能要求如下: 程式可接收一個輸入參數n,然 ...
個人項目實戰-四則混合運算
coding.net地址 :https://git.dev.tencent.com/qyj814/fours.git
一.實驗要求
基本任務:
使用JAVA編程語言,獨立完成一個3到5個運算符的四則運算練習的軟體。
軟體基本功能要求如下:
- 程式可接收一個輸入參數n,然後隨機產生n道加減乘除(分別使用符號+-*÷來表示)練習題,每個數字在 0 和 100 之間,運算符在3個到5個之間。
- 每個練習題至少要包含2種運算符。同時,由於小學生沒有分數與負數的概念,你所出的練習題在運算過程中不得出現負數與非整數,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
- 練習題生成好後,將你的學號與生成的n道練習題及其對應的正確答案輸出到文件“result.txt”中,不要輸出額外信息,文件目錄與程式目錄一致。
- 當程式接收的參數為4時,以下為一個輸出文件示例。
2018010203
13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
軟體附加功能要求如下:(請有餘力的同學完成)
- 支持有括弧的運算式,包括出題與求解正確答案。註意,算式中存在的括弧數必須大於2對,且不得超過運算符的個數。
- 擴展程式功能支持真分數的出題與運算(只需要涵蓋加減法即可),例如:1/6 + 1/8 + 2/3= 23/24。註意在實現本功能時,需支持運算時分數的自動化簡,比如 1/2+1/6=2/3,而非4/6,且計算過程中與結果都須為真分數。
二.操作步驟
首先,分析題意,做基本的需求分析,總體設計等;其次,根據詳細設計編寫代碼併進行測試;最後,上傳文件到coding.net上。
三.代碼分析
主要文件
1.創建整數核心代碼
public String[] createProblem(){ Random random = new Random(); int operatorCount =3 + random.nextInt(3); //隨機操作符的個數(3-5個) int operand[] = new int[operatorCount + 1]; //操作數個數 int[] operatorIndex = index(operatorCount, 4, random); for(int i = 0; i < operatorCount + 1; i++){ operand[i] = random.nextInt(101);//隨機生成(0-100)之間的數 } String formula = stitchingFormula(operatorCount, operand, operatorIndex); //計算結果 Calculator calculator = new Calculator(); int res = calculator.algorithm(formula); String formulaRes[] = new String[2]; if (res > 0){ formulaRes[0] = formula; formulaRes[1] = String.valueOf(res); }else { return createProblem(); } return formulaRes; }View Code
2.創建分數核心代碼
public String[] createProblem(){ Random random = new Random(); int operatorCount = 1 + random.nextInt(3); //操作符的個數(1-3)個 CreateInteger create = new CreateInteger(); int[] operatorIndex = create.index(operatorCount,2, random); //操作符的下標 //生成第一個操作數 int[] coprimeNumber1 = createCoprimeNumbers(random); int x = coprimeNumber1[0]; int y = coprimeNumber1[1]; String s = x + "/" + y; for(int i=0; i < operatorCount; i++){ //生成剩下的操作數 int[] coprimeNumber = createCoprimeNumbers(random); int numx = coprimeNumber[0]; int numy = coprimeNumber[1]; String currentOpreator = OPERATOR[operatorIndex[i]]; if(currentOpreator.equals("+")){ //加法 int count = 0; if(x * numy + y * numx > y * numy) { numx = y - x - 1; numy = y; if(numx <= 0) numx = 1; numy = 2 * y; } x = x * numy + y * numx; y = y * numy; int greatFactor = greatFactor(numx,numy); numx /= greatFactor; //最終結果化簡 numy /= greatFactor; } else { //減法 if(x * numy - y * numx < 0){ numx = x -1; numy = y; if(numx <= 0) numx = 1; numy = 2*y; } x = x * numy - y * numx; y = y * numy; int greatFactor = greatFactor(numx,numy); numx /= greatFactor; //最終結果化簡 numy /= greatFactor; } String num = numx + "/" + numy; s += currentOpreator + num; } int greatFactor = greatFactor(x,y); x /= greatFactor; //最終結果化簡 y /= greatFactor; String res = shamToProperFraction(x, y); s += "="; String formulaRes[] = {s, res}; return formulaRes; }View Code
3.計算核心代碼
private int calculate(int a, int b, String stmp) { //計算a stmp b的值 int res = 0; //存結果 char s = stmp.charAt(0); switch (s) { case '+': { res = a + b; break; } case '-': { res = a - b; //產生負數就不合格 break; } case '*': { res = a * b; break; } case '÷': { if(b==0) return -1; else if(a%b!=0) //產生小數就不合格 return -2; else res = a / b; break; } } return res; }View Code
4.生成問題並輸出到文件核心代碼
public void generateProblem(int num) throws IOException { //項目根目錄生成文件 File file = new File("./result.txt"); if(file.exists()) { file.delete(); file.createNewFile(); } FileOutputStream fileOutput = new FileOutputStream(file); PrintStream filePrintStream = new PrintStream(fileOutput); Random random = new Random(); CreateFraction createFraction = new CreateFraction(); CreateInteger createInteger = new CreateInteger(); String[] problem = new String[2]; filePrintStream.println("2017012454"); for(int i = 1; i <= num; i++){ int choose = random.nextInt(2); //選擇生成分數還是整數 if (choose == 0){ problem = createInteger.createProblem(); }else { problem = createFraction.createProblem(); // problem = createInteger.createProblem(); } outputFile(problem, filePrintStream); // System.out.println(i); } fileOutput.close(); filePrintStream.close(); System.out.println("文件創建成功 "); }View Code
四.PSP分析
PSP2.1 | 任務內容 | 計劃共完成需要的時間(h) | 實際完成需要的時間(h) |
Planning | 計劃 | 3 | 5 |
Estimate | 估計這個任務需要多少時間,並規劃大致工作步驟 | 0 | 0 |
Development | 開發 | 60 | 83 |
Analysis | 需求分析 (包括學習新技術) | 0 | 0 |
Design Spec | 生成設計文檔 | 0 | 0 |
Design Review | 設計覆審 (和同事審核設計文檔) | 0 | 0 |
Coding Standard | 代碼規範 (為目前的開發制定合適的規範) | 0 | 0 |
Design | 具體設計 | 0 | 0 |
Coding | 具體編碼 | 0 | 0 |
Code Review | 代碼覆審 | 0 | 0 |
Test | 測試(自我測試,修改代碼,提交修改) | 0 | 0 |
Reporting | 報告 | 5 | 7 |
Test Report | 測試報告 | 0 | 0 |
Size Measurement | 計算工作量 | 0 | 0 |
Postmortem & Process Improvement Plan | 事後總結, 並提出過程改進計劃 | 0 | 0 |
五.心得體會
這個項目我用了兩個周末四天,外加兩周內零零散散的時間,一共用了八十多個小時,即使這樣,我的代碼還是有很多不足,比如說:生成整數問題時例子太少(由於本人實在寫不下去了,都快寫吐了)。要說我這兩周寫代碼以來最大的體會,就是感覺自己知識學的還是不到位,遇到不懂的問題就得上網去查,一查又浪費了很多時間;寫出來的代碼也不是準確的,debug又花好多時間;總而言之,做完這個項目讓我覺得我要好好學習了。