使用JAVA編程語言,獨立完成一個包含3到5個數字的四則運算練習,軟件基本功能要求如下:
- 程序可接收一個輸入參數n,然后隨機產生n道加減乘除練習題,每個數字在 0 和 100 之間,運算符在3個到5個之間。
- 為了讓小學生得到充分鍛煉,每個練習題至少要包含2種運算符。同時,由於小學生沒有分數與負數的概念,你所出的練習題在運算過程中不得出現負數與非整數,比如不能出 3/5+2=2.6,2-5+10=7等算式。
- 練習題生成好后,將你的學號與生成的n道練習題及其對應的正確答案輸出到文件“result.txt”中,不要輸出額外信息,文件目錄與程序目錄一致。
- 當程序接收的參數為4時,以下為輸出文件示例。
2018010230
13+17-1=29
11*15-5=160
3+10+4=1
15/5+3-2=4
Github項目地址:
需求分析:
- 通過程序接受一個數字,產生N道加減乘除練習題。
- 判斷傳入參數是否合法
- 每個數字在0-100之間,運算符3-5個
- 運算過程不能出現負數和非整數
- 計算練習題
- 所有信息輸出到txt文件
功能設計:
- 編寫主函數
- 編寫輸入是否合法函數
- 隨機生成運算式
- 編寫計算運算式函數
- 結果寫入txt輔助類
設計實現:
- 編寫主函數並通過命令行接收參數
- 判斷傳入參數是否合法
- 隨機選擇加減乘除運算符
- 根據產生運算符的個數生成一定運算數的運算式並存入List集合
- 當隨機產生的運算符是“/”時,判斷被除數是否能整除除數,如果不能,隨機產生能夠被整除的除數。
- 遍歷List集合通過函數計算集合中每個運算式的結果
- 編寫寫入txt文件函數
測試運行:
核心代碼:
隨機產生num個運算式,並將產生的運算式存入List集合
char[] operator=new char[]{'+','-','*','/'};
Random random=new Random();
ArrayList<String> expression=new ArrayList<String>();
for(int i=0;i<num;i++){
int n=random.nextInt(3)+3; //3-5個運算符
int[] number=new int[n+1];
String ex=new String();
for(int j=0;j<=n;j++){
number[j]=random.nextInt(100)+1; //4-5個數字
}
for(int j=0;j<n;j++){
int s=random.nextInt(4);//隨機選擇某個運算符
ex+=String.valueOf(number[j])+String.valueOf(operator[s]);///5+4+6+9
if(s==3){number[j+1]=decide(number[j],number[j+1]);}
}
ex+=String.valueOf(number[n]);
expression.add(ex);
}
當被除數不能整除除數時,隨機生成能夠整除的除數
/**
* 隨即取x,y為1-100之間,x可以整除y的y值
* @param x
* @param y
* @return
*/
private static int decide(int x,int y){//通過遞歸實現整除
Random random=new Random();
if(x%y!=0){
y=random.nextInt(100)+1;
return decide(x,y);
}
else{
return y;
}
}
通過javascript的eval函數計算字符串內的運算式
/**
* 計算每個等式的結果,並返回運算式
* @param arrayList
* @return arrayList
*/
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
private static ArrayList<String> calculate(ArrayList<String> arrayList){
ArrayList<String> ArithExpress=new ArrayList<String>();
for(String ax:arrayList){
try {
ax=ax+"="+jse.eval(ax);
System.out.println(ax);
ArithExpress.add(ax);
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return ArithExpress;
}
總結:
本程序的主要難點在於運算式的隨機生成和運算式的計算,后者借助於Javascript的eval函數通過求解字符串內的運算式得到解決,編程重點解決隨機生成運算式部分
PSP:
PSP | 任務內容 | 計划完成需要的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
計划 | 10 | 12 | |
Estimate | 需求分析,函數實現 | 10 | 10 |
開發 | 30 | 30 | |
Analysis | 需求分析 | 5 | 10 |
Design Spec | 設計 | 5 | 5 |
Design Review | 設計復審 | 2 | 2 |
Design | 具體設計 | 5 | 5 |
Coding | 具體編碼 | 20 | 20 |
Code Review | 代碼復審,查找語法錯誤 | 2 | 2 |
Test | 測試 | 5 | 5 |
報告 | 10 | 10 | |
Test Report | 經測試,程序編譯正確,運行結果正確,完全符合要求 | 2 | 2 |
Size Measurement | 由於程序功能較為簡單,需求分析的工作量很小,故本次實驗的主要工作主要在於編程 | 2 | 2 |
Postmortem | 對於此程序,計算部分還有大的改進空間,可以采用將中綴表達式轉換為后綴表達式,通過正則判斷運算符優先級來實現算式的結果,而不是另辟他法調用Javascript函數 | 2 | 2 |