201571030106/201571030116《小學四則運算練習軟件》結對項目報告

使用JAVA編程語言,採用結對編程方式實現四則運算出題小程序,軟件基本功能要求以下:java

  • 由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分
  • 題庫文件可採用實驗二的方式自動生成,也能夠手工編輯生成
  • 程序爲用戶提供三種進階四則運算練習功能選擇:百之內整數算式(必作)、帶括號算式、真分數算式練習
  • 程序容許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖
  • 程序記錄用戶答題結果,當程序退出再啓動的時候,可爲用戶顯示最後一次測試的結果,並詢問用戶能否進行新一輪的測試
  • 測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間
  • 程序人機交互界面是GUI界面(WEB頁面、APP頁面均可),界面支持中文簡體(必作)/中文繁體/英語,用戶能夠進行語種選擇

個人隊友:git

李玉瑩同窗的園子github

Github項目地址:express

https://github.com/dushik/AthmeticPlus編程

需求分析:小程序

  • 程序人機交互界面是GUI界面,界面支持中文簡體
  • 程序可以隨機從題庫選擇試題,由用戶輸入答案,自動檢查對錯,統計成績
  • 題庫文件可基於實驗二生成,也可自定義題庫文件
  • 用戶能夠選擇三種四則運算模式:百之內整數算式(結果非負,必須整數),帶括號運算,真分數算式練習
  • 系統容許用戶進行多輪測試,並實現用戶測試測試分數的數據可視化(柱狀圖)
  • 測試時提供計時功能

功能設計:dom

  • 採用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扼殺在了搖籃中!
  • 固然,金無足赤,人無完人。每一個人都有本身的缺點和短板。只有不斷的改正,互相進步!才能提高本身!
  • 經過本次項目,極大地提高了咱們的團隊協做意識,在代碼風格,註釋習慣這方面之後會慢慢改進!

團隊協做的重要性

  • 團隊協做的效果是不言而喻的,雷鋒也說:一滴水只有放進大海里才永遠不會乾涸,一我的只有當他把本身和集體事業融合在一塊兒的時候才能最有力量。

最後,重要的事情,愉快的經歷記錄以下

相關文章
相關標籤/搜索