實現一個命令行程序,要求自動生成小學四則運算題目(加減乘除)javascript
支持多運算符html
測試結果的正確性,用戶輸入錯誤時給出正解java
統計題目正確率git
首先要可以按照按人的通常習慣,生成自左向右計算的加減乘除算式。編程
隨機生成多運算符,並隨機生成相對應個數的整數數組
利用eval
方法直接計算隨機生成的算式的值,並和用戶的輸入做比較微信
判斷正確率dom
設計測試類,利用JUnit測試整數的四則運算函數
for (i = 0; i < n; i++) { int a = random.nextInt(5) + 1;//1-5個運算符 int[] number = new int[a + 1];//建立一個number數組 String ex = new String(); for (int j = 0; j <= a; j++) {//生產a+1個數字,即2-6個數字 number[j] = random.nextInt(100) + 1;//生成1-100的整數 } for (int j = 0; j < a; j++) { int s = random.nextInt(4);//隨機生成運算符下標 ex += String.valueOf(number[j]) + String.valueOf(op[s]);//添加一對數字和運算符 } ex += String.valueOf(number[a]);//在尾端補上一個數字 System.out.println(ex + "=");
int ua = reader.nextInt();//用戶輸入答案 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine se1 = manager.getEngineByName("js"); ScriptEngine se2 = manager.getEngineByName("js"); String str=ex+"="+"="+ua;//將用戶答案邏輯式放在字符串str中 Boolean result =(Boolean)se1.eval(str);//用eval方法計算用戶答案邏輯式 String ca="="+se2.eval(ex);//生成correct_answer字符串存正確答案 jud.judgeFormula(result,ca);
https://gitee.com/thz666/20175212_tong_haozhen/blob/master/src/四則運算練習器.java單元測試
首先,對於計算正確答案,咱們想使用參考博客中的將中綴式轉化爲後綴式的方法。但通過思考發現實際操做太過冗長,編寫代碼時容易出錯
考慮到JavaScript中有eval
方法,嘗試學習使用eval
方法直接計算算式的值。
在初學eval
方法時得知,此方法用於鏈表中,網上的參考程序很難看懂並實際應用於本身的程序裏。
依葫蘆畫瓢,按照網上的參考程序引入新的包
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException;
以及使用
try { result = ( Boolean)se.eval(str); } catch (ScriptException e) { e.printStackTrace(); }
相似這種格式下使用eval
方法,但因爲不瞭解其真正的含義,修改代碼每每會出現未知的錯誤。
然後咱們選擇,讓不在鏈表中的對象使用eval
方法進行計算,以此拋棄上述格式。
使用eval
不能輸直接出算式的值,而且會提示空指針錯誤或是數據類型錯誤。
不讓eval
直接輸出算式值,而是經過
String str=ex+"="+"="+ua;//將用戶答案邏輯式放在字符串str中 Boolean result =(Boolean)se1.eval(str);//用eval方法計算用戶答案邏輯式
用eval方法來計算「用戶答案和正確答案是否相等」這樣一個 邏輯式 ,以此來避免輸出eval
結果致使的數據類型錯誤。
統計正確題目數count
時,沒法將count
從judgeFormula
中返回,count
值仍爲0
在參考學姐博客後,選擇加入以下包:
import java.text.NumberFormat;
調用該類中方法getPercentInstance
來返回當前默認語言環境的百分比格式,以下:
NumberFormat num = NumberFormat.getPercentInstance();//調用getPercentInstance方法 …… double T = (double) jud.getTrues()/n; System.out.println("正確率爲:"+num.format(T));
對於計算算式的正確答案這一問題,老師提供的參考博客中給的提示是將中綴轉化爲後綴運算,而咱們仍嫌複雜選擇了投機的eval方法,本覺得能得到方便,但在使用的規範性上遇到了極大的阻力,以致於咱們甚至花費了更多的時間學習更深的內容,有一點 殺雞用牛刀 的感受。所在以以後的學習生活中,不能被眼前的利益和甜頭衝昏頭腦,而是應該顧全大局,在謹慎評估後再作出選擇。
結對學習對於編而言的確是一個很好的方法。因特殊方法的緣由,咱們的程序編寫過程當中遇到了許多各式各樣的問題,大部分仍是超出了知識能力範圍,須要咱們摸索研究。很難想象沒有這樣一個好的結對夥伴,這個程序的實現將會有多大的難度!
最後,我但願而且有信心,經過兩我的的結對將Java學習的熱情和儲備提高一個新的臺階。