201571030106/201571030116《小學四則運算練習軟件》結對項目報告
阿新 • • 發佈:2018-04-01
開發 lock == try gen min 輸入 bug ron
使用JAVA編程語言,采用結對編程方式實現四則運算出題小程序,軟件基本功能要求如下:
- 由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分
- 題庫文件可采用實驗二的方式自動生成,也可以手工編輯生成
- 程序為用戶提供三種進階四則運算練習功能選擇:百以內整數算式(必做)、帶括號算式、真分數算式練習
- 程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖
- 程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示最後一次測試的結果,並詢問用戶可否進行新一輪的測試
- 測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間
- 程序人機交互界面是GUI界面(WEB頁面、APP頁面都可),界面支持中文簡體(必做)/中文繁體/英語,用戶可以進行語種選擇
我的隊友:
李玉瑩同學的園子
Github項目地址:
https://github.com/dushik/AthmeticPlus
需求分析:
- 程序人機交互界面是GUI界面,界面支持中文簡體
- 程序能夠隨機從題庫選擇試題,由用戶輸入答案,自動檢查對錯,統計成績
- 題庫文件可基於實驗二生成,也可自定義題庫文件
- 用戶可以選擇三種四則運算模式:百以內整數算式(結果非負,必須整數),帶括號運算,真分數算式練習
- 系統允許用戶進行多輪測試,並實現用戶測試測試分數的數據可視化(柱狀圖)
- 測試時提供計時功能
功能設計:
- 采用java Swing編程實現人機交互界面的設計
- 編寫運算式生成類
- 編寫運算式計算類
- 編寫真分數運算類
- 編寫文件操作讀寫類
- 編寫數據可視化實現類
設計實現:
類圖:
- 運算式的生成基於實驗二,改進完成帶括號的運算,真分數運算。使得主程序通過參數的不同來調用不同的方法生成不同的題庫
- 成績的存儲采用文件的寫操作,將每次測試結果以追加的方式寫入txt文件,保證不覆蓋以前的成績
- 柱狀圖的繪制采用jFreeChart圖表繪制類庫實現,查看成績時通過讀取保存成績txt文件的最後五行實現最近五次成績的柱狀顯示
- 文件操作類的功能應包括,按行寫入文件,按行通過追加的方式寫入文件,按行讀取文件,按行讀取文件的最後四行內容
- 普通運算式計算類的功能包括,中綴表達式轉後綴,計算後綴表達式
- 分數運算式計算類的功能包括,分數的通分,分數的加操作,分數的減操作,分數的乘操作,分數的除操作
測試運行:
核心代碼:
隨機產生num個真分數運算式,計算結果,使得結果非負,並存入題庫文件
/**
* 生成具有真分數運算式數的非負運算式
* @param num
*/
public void generateExpressionC(int num){
char[] operator=new char[]{‘+‘,‘-‘};
ArrayList<String> expression=new ArrayList<String>();
for(int i=0;i<num;i++){
int n=random.nextInt(3)+2; //3-5個運算符
ProperFraction[] proList=new ProperFraction[n+1];
for(int j=0;j<=n;j++){
proList[j]=new ProperFraction();
}
char[] symbol=new char[n];
String ex=new String();
for(int j=0;j<n;j++){
char sm=operator[random.nextInt(2)];
ex+=proList[j].toString()+sm;
proList[0]=proper.calProperFraction(proList[j], proList[j+1],sm);
}
ex+=proList[n]+"="+proList[0].toString();
if(proList[0].getNuma()/proList[0].getNumb()<0){
i--;
}
else{
expression.add(ex);
}
}
doFile.WriteToFile("ArithmeticExpression.txt",expression);
}
讀取文件最後N行
public ArrayList<String> readLastNLine(String path, long numRead)
{
File file=new File(path);
ArrayList<String> result = new ArrayList<String>();
long count = 0;
if (!file.exists() || file.isDirectory() || !file.canRead()){
return null;
}
RandomAccessFile fileRead = null;
try{
fileRead = new RandomAccessFile(file, "r");
long length = fileRead.length();
if (length == 0L){
return result;
}
else{
long pos = length - 1;
while (pos > 0){
pos--;
fileRead.seek(pos);
if (fileRead.readByte() == ‘\n‘){
String line = fileRead.readLine();
result.add(line);
count++;
if (count == numRead){
break;
}
}
}
if (pos == 0){
fileRead.seek(0);
result.add(fileRead.readLine());
}
}
}
catch (IOException e){
e.printStackTrace();
}
finally{
if (fileRead != null){
try{
fileRead.close();
}
catch (Exception e){
}
}
}
return result;
}
通過標準答案和測試結果,計算正確的題數
/**
* 通過標準答案和測試結果,計算正確的題數
* @param resHm
* @param ansHm
* @return
*/
private static int critical(HashMap<Integer, String> resHm,HashMap<Integer, String> ansHm){
int count=0;
for(Map.Entry<Integer, String> resentry:resHm.entrySet()){
String resvalue = resentry.getValue() == null?"":resentry.getValue();
String ansvalue = ansHm.get(resentry.getKey())==null?"":ansHm.get(resentry.getKey());
if(resvalue.equals(ansvalue)){
count++;
}
}
return count;
}
總結:
本程序的主要難點在於生成不同類型的運算式用以滿足用戶需求,基本上是實驗二的拓展部分,即對於真分數四則運算的設計實現
PSP:
PSP | 任務內容 | 計劃完成需要的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
計劃 | 50 | 50 | |
Estimate | 需求分析,函數實現 | 50 | 50 |
開發 | 100 | 100 | |
Analysis | 需求分析 | 5 | 10 |
Design Spec | 設計 | 30 | 30 |
Design Review | 設計復審 | 30 | 30 |
Design | 具體設計 | 30 | 30 |
Coding | 具體編碼 | 30 | 30 |
Code Review | 代碼復審,查找語法錯誤 | 2 | 2 |
Test | 測試 | 5 | 5 |
報告 | 30 | 30 | |
Test Report | 經測試,程序符合實驗要求,但嚴重脫離實際應用 | 20 | 20 |
Size Measurement | 主要工作量應該在GUI編程這塊 | 20 | 20 |
Postmortem | 此程序,確確實實的花了不少時間在Swing編程這塊,也是由於第二個程序完成的太過倉促,在計算,生成,擴展功能這塊完全重寫了之前的。對於java的GUI界面編程到此為止吧,以後不會改進這個沒有多大用處的程序 | 20 | 20 |
對合作者的評價:
- 和李玉瑩同學的合作過程是非常愉快的過程,算是互相學習吧,她耐心,踏實。在編程的過程中發現了好幾處不容易發現的錯誤,及早地將程序中的BUG扼殺在了搖籃中!
- 當然,金無足赤,人無完人。每個人都有自己的缺點和短板。只有不斷的改正,互相進步!才能提升自己!
- 通過本次項目,極大地提升了我們的團隊協作意識,在代碼風格,註釋習慣這方面以後會慢慢改進!
團隊協作的重要性
- 團隊協作的效果是不言而喻的,雷鋒也說:一滴水只有放進大海裏才永遠不會幹涸,一個人只有當他把自己和集體事業融合在一起的時候才能最有力量。
最後,重要的事情,愉快的經歷記錄如下
201571030106/201571030116《小學四則運算練習軟件》結對項目報告