20175212童皓楨 結對編程項目-四則運算 第一週

20175212童皓楨 結對編程項目-四則運算 第一週

需求分析

  • 實現一個命令行程序,要求自動生成小學四則運算題目(加減乘除)javascript

  • 支持多運算符html

  • 測試結果的正確性,用戶輸入錯誤時給出正解java

  • 統計題目正確率git

設計思路

  • 首先要可以按照按人的通常習慣,生成自左向右計算的加減乘除算式。編程

  • 隨機生成多運算符,並隨機生成相對應個數的整數數組

  • 利用eval方法直接計算隨機生成的算式的值,並和用戶的輸入做比較微信

  • 判斷正確率dom

  • 設計測試類,利用JUnit測試整數的四則運算函數

UML類圖

輸入圖片說明

關鍵代碼

  • 如何生成符合要求格式的運算式
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);

Junit測試

輸入圖片說明

運行過程截圖

輸入圖片說明

代碼託管地址

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結果致使的數據類型錯誤。

  • 問題4

統計正確題目數count時,沒法將countjudgeFormula中返回,count值仍爲0

  • 問題4及解決方法

在參考學姐博客後,選擇加入以下包:

import java.text.NumberFormat;

調用該類中方法getPercentInstance來返回當前默認語言環境的百分比格式,以下:

NumberFormat num = NumberFormat.getPercentInstance();//調用getPercentInstance方法
……
double T = (double) jud.getTrues()/n;
        System.out.println("正確率爲:"+num.format(T));

結對總結及評價

  • 對於計算算式的正確答案這一問題,老師提供的參考博客中給的提示是將中綴轉化爲後綴運算,而咱們仍嫌複雜選擇了投機的eval方法,本覺得能得到方便,但在使用的規範性上遇到了極大的阻力,以致於咱們甚至花費了更多的時間學習更深的內容,有一點 殺雞用牛刀 的感受。所在以以後的學習生活中,不能被眼前的利益和甜頭衝昏頭腦,而是應該顧全大局,在謹慎評估後再作出選擇。

  • 結對學習對於編而言的確是一個很好的方法。因特殊方法的緣由,咱們的程序編寫過程當中遇到了許多各式各樣的問題,大部分仍是超出了知識能力範圍,須要咱們摸索研究。很難想象沒有這樣一個好的結對夥伴,這個程序的實現將會有多大的難度!

  • 最後,我但願而且有信心,經過兩我的的結對將Java學習的熱情和儲備提高一個新的臺階。

    結對照片

輸入圖片說明

參考和引用

相關文章
相關標籤/搜索