個人作業1——四則運算題目生成程序


題目描述:##

從《構建之法》第一章的 “程序” 例子出發,像阿超那樣,花二十分鍾寫一個能自動生成小學四則運算題目的命令行 “軟件”,滿足以下需求:

除了整數以外,還要支持真分數的四則運算,真分數的運算,例如:1/6 + 1/8 = 7/24
運算符為 +, −, ×, ÷
並且要求能處理用戶的輸入,並判斷對錯,打分統計正確率。
要求能處理用戶輸入的真分數, 如 1/2, 5/12 等
使用 -n 參數控制生成題目的個數,例如執行下面命令將生成10個題目
Myapp.exe -n 10

分析:##

從題目出發,程序實現的要求

  • 自動生成題目
  • 支持整數,真分數(實現中,也有假分數)
  • 支持加減乘除
  • 判斷對錯並統計正確率

題目中要求用控制台實現,雖然簡單,但是我認為這種方式有以下幾點比較不好的地方(當然下面的我的這個實現完全可以是控制台的).

  • 只能從截圖中看到實現結果;
  • 不能讓看博客之人直接感受效果,需要導入代碼;
  • 不方便操作。

所以我用比較直觀的形式體現,使用簡單的web頁面操作,可以有一個直觀的效果,最后會附上頁面鏈接。

實現步驟:##

  • 根據用戶輸入的參數(整數n),生成n道簡單的分數運算題
  • 獲取用戶輸入的答案
  • 進行答案校驗,生成結果集
  • 把結果返回給用戶

主要程序的實現還是比較簡單的,並不需要什么算法。

  • 首先建立一個分數類Fraction,屬性包含分子分母,方法包含加減乘除,每個方法傳入的參數為分數對象,方法的返回值是另一個實體類CalculationResult計算結果類(我簡單稱為結果類)。
  • 建立結果類,屬性包含生成的運算題目(也就是式子不包含正確結果),運算的正確結果,以及返回給用戶的消息(對還是錯,正確答案是多少)。為了實現方便我把結果的正確確率也封裝成了這個結果類的一個屬性,雖然這樣是不太合理的。至此就把涉及到的實體類建立完成。

Fraction類

CalculationResult類

  • 接着就是隨機生成式子和加減乘除,既然是兩個分數,那就是隨機生成4個數,前面兩個組成一個分數,后面兩個組成另一個分數,這邊要控制一下分母的隨機數不能為0(還有一種情況會疏忽的就是:如果是除法運算,第二個分數的分子也不能為零)。封裝成兩個分數對象,在隨機生成操作符。這里使用char字符數組char[] op={'+','-','','/'};然后根據式子char randowOp=op[(int)(Math.random()4)];得到隨機字符,再用分支結構switch case進行兩個選擇的運算分數的計算,當然要先定義一個用來裝結果的 List〈CalculationResult〉 list,根據傳入的n來決定循環操作幾次,把每次操作的結果add到list中這樣就ok。
/*分支結構  f,f1為分數對象*/
switch(randowOp){
    case '+':{ list.add(f.getAddResult(f1)); break;}
    case '-':{ list.add(f.getSubResult(f1)); break;}
    case '*':{ list.add(f.getMulResult(f1)); break;}
    case '/':{ list.add(f.getDivResult(f1)); break;}
}

  • 核心的是表達式和結果的控制,結果為分數時必須要化為最簡分數。比如4/2,必須結果為2,18/4必須化簡為9/2。這里我用的是,分子分母分別除以他們的最大公約數
/*
   求兩個數最大公約數
*/
public static int gcd(int m,int n){        
    int k=m>n?n:m;  
    int s = 1;  
    for(int i = 2;i <=k;i ++){  
       for(int j = 2;j <= i;j++){  
           if(m % j == 0 && n % j == 0){  
               m = m / j;  
               n = n / j;  
               s = s * j;  
            }  
        }     
    }  
    return s;           
}


  • 然后把分子分母重新組合成字符串,這里如果結果分母為1,則只顯示分子,如果分子為0,則直接為0,如果兩個數相等,則直接顯示1。

以上為核心的java操作,接下來是頁面的邏輯操作過程。

  • 首先生成簡單的表單,接收用戶輸入的參數(當然只能是數字)
  • 根據參數n,生成結果List list。把這個list顯示到頁面
  • 用戶輸入答案后,再用一個表單接收用戶的答案,然后用答案個正確答案匹配,當然要trim()一下用戶答案。然后填寫前面提到的結果對象的用戶返回信息,把flag給set。如果答案正確,則flag="正確",如果答案錯誤則flag="錯誤 正確答案為***"。再通過正確的題數乘1.0/總題數求出正確率(當然要用%形式,所以結果要乘100+"%"轉化為字符串)也set到結果集中,然后在把這個這個結果集add到list中返回到頁面顯示。這樣就ok

下面是一些截圖:
(開始頁面)

(生成的題目)

(判斷正誤,與正確率)

附上具體的網頁鏈接:我也自己試試

實驗總結:##

我覺的這種實現方式並不好,存在的問題是什么呢?最重要的問題是當需要生成的題目多了,速度就會很慢,加上答案校驗等等,我這個差的服務器就可能崩了,如果訪問人數多了,根本沒有效果,所以請試效果的朋友,輸入的數字小一些,哈哈(偷笑)。然后由於涉及括號等的操作比較復雜,這個簡單的實驗就沒有使用,而且如果這些也要自己生成計算,那么問題就大了,速度就非常慢了。比較理想的方法,應該是建立題庫,把題庫塞入數據庫中,兩個字段可能就ok,字段一:題目;字段二:答案。

這樣的好處有什么呢?

  • 不需要自己隨機生成式子和計算,這部分是程序主要的耗費時間
  • 可以計算非常復雜的公式,再多括號也不用擔心。
  • 速度快,出題時只需要隨機讀取數據庫條數,封裝對象。

沒有找到題庫,所以朋友可以試試.......!

代碼倉庫:https://github.com/hts-technology/hts.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM