1. 程式人生 > >201571030314《小學生四則運算練習軟件》結對項目

201571030314《小學生四則運算練習軟件》結對項目

amp getch lpad port design 取圖 times 隨機 過程

結對編程實現小學生四則運算練習軟件

前言:按照結對編程的原則,我和鄰宿舍的小夥伴進行了兩人結對編程,我們開發的結對項目的是小學生四則運算練習軟件,具體就是隨機生成n道題,供學生答題並返回正誤記錄答題結果,進行多輪。具體需求分析以及功能設計與實現如下。

github代碼地址:https://github.com/mqqgd/Experiment2

一、需求分析

本次實驗采用結對編程方式,設計開發一個小學生四則運算練習軟件,使之具有以下功能:

  • 由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;
  • 題庫文件可采用實驗二的方式自動生成,也可以手工編輯生成,文本格式如下:

技術分享圖片

  • 程序為用戶提供三種進階四則運算練習功能選擇:百以內整數算式(必做)、帶括號算式、真分數算式練習;
  • 程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例如下:

技術分享圖片

  • 程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示最後一次測試的結果,並詢問用戶可否進行新一輪的測試;
  • 測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。
  • 程序人機交互界面是GUI界面(WEB頁面、APP頁面都可),界面支持中文簡體(必做)/中文繁體/英語,用戶可以進行語種選擇。

二、功能設計與實現

  • 軟件設計類圖

技術分享圖片

  • 核心功能代碼展示

技術分享圖片
import java.util.Random;

public class GetRandomDigit {
    private Random random;
    public GetRandomDigit(){
        random=new Random();
    }
    int oprator(){
        return random.nextInt(4)+1;
    }
    int Time(){
        return random.nextInt(3)+3;
    }
    int randomDigit(){
        
return random.nextInt(100); } int probabilityQuestion(){ return random.nextInt(200); } int BracketsIndex(int time){ return random.nextInt(time-2); } } 隨機出題
隨機出題 技術分享圖片
public class LinkSql {
    private static final String url = "jdbc:mysql://127.0.0.1:3306/mqqgd";   
    private  static final String user = "root";  
    private  static final String password = "root";
    private static ResultSet ret = null;
    private  static final String name = "com.mysql.jdbc.Driver";
    public Connection conn = null;  
    public PreparedStatement pst = null; 
    public  LinkSql() {  
        try {  
            Class.forName(name);//指定連接類型  
            conn = DriverManager.getConnection(url, user, password);//獲取連接             
            System.out.println("數據庫鏈接成功");
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    
    public void changeMySqlDate(String sql) {
        try {
            pst=conn.prepareStatement(sql);
            pst.executeUpdate();
            System.out.println("接收到修改數據庫命令"+sql);
        } catch (SQLException e) {
            // TODO Auto-generated catch block 
            e.printStackTrace();
        }
    }
    public ResultSet selectSqlDate(String sql) {
        try {
            System.out.println("接收到查詢數據庫命令"+sql);
            pst=conn.prepareStatement(sql);
            ret = pst.executeQuery();
            return ret;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } 
    }
    public void closeMySql() {
        try {  
            this.conn.close();   
        } catch (SQLException e) {  
            e.printStackTrace();  
        }
    }
    @SuppressWarnings("static-access")
    public void closeChart() {  
        try {    
            this.pst.close();
            this.ret.close();
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    } 
}

鏈接數據庫
鏈接數據庫 技術分享圖片
import java.util.HashMap;  
import java.util.Stack;    
public class ArithmeticResult {  
    public Double Result(String formula) {  
        Stack<Double> s1 = new Stack<Double>();
        Stack<String> s2 = new Stack<String>();
        HashMap<String, Integer> hashMap = new HashMap<String, Integer>();  
        hashMap.put("(", 0);  
        hashMap.put("+", 1);  
        hashMap.put("-", 1);  
        hashMap.put("×", 2);  
        hashMap.put("÷", 2);  
        for (int i = 0; i < formula.length();) {  
            StringBuffer digit = new StringBuffer();  
            char c = formula.charAt(i);  
            while (Character.isDigit(c) || c == ‘.‘) {  
                digit.append(c);  
                i++;  
                c = formula.charAt(i);  
            }  
            if (digit.length() == 0) {  
                switch (c) {  
                case ‘(‘: {  
                    s2.push(String.valueOf(c));  
                    break;  
                }  
                case ‘)‘: {  
                    String stmp = s2.pop();  
                    while (!s2.isEmpty() && !stmp.equals("(")) {  
                        double a = s1.pop();  
                        double b = s1.pop();  
                        double sresulat = calcDouble(b, a, stmp);  
                        s1.push(sresulat);  
                        stmp = s2.pop();  
                    }  
                    break;  
                }  
                case ‘=‘: {  
                    String stmp;  
                    while (!s2.isEmpty()) {  
                        stmp = s2.pop();  
                        double a = s1.pop();  
                        double b = s1.pop();  
                        double sresulat = calcDouble(b, a, stmp);  
                        s1.push(sresulat);  
                    }  
                    break;  
                }  
                default: {  
                    String stmp;  
                    while (!s2.isEmpty()) {  
                        stmp = s2.pop();  
                        if (hashMap.get(stmp) >= hashMap.get(String.valueOf(c))) {  
                            double a = s1.pop();  
                            double b = s1.pop();  
                            double sresulat = calcDouble(b, a, stmp);  
                            s1.push(sresulat);  
  
                        } else {  
                            s2.push(stmp);  
                            break;  
                        }  
  
                    }  
                    s2.push(String.valueOf(c));  
                    break;  
                }  
                }  
            } else {  
                s1.push(Double.valueOf(digit.toString()));  
                continue;  
            }  
            i++;  
        }  
        return s1.peek();  
    }  
  
    public double calcDouble(double a, double b, String stmp) {  
        double res = 0f;  
        char s = stmp.charAt(0);  
        switch (s) {  
          case ‘+‘:
            res = a + b;  
            break;  
          case ‘-‘:  
            res = a - b;  
            break;  
          case ‘ב:
            res = a * b;  
            break;  
          case ‘÷‘:
            res = a / b;  
            break;  
        }  
        return res;
    }    
}  

計算過程
計算過程 技術分享圖片
//從這裏開始  
        CategoryPlot plot=chart.getCategoryPlot();//獲取圖表區域對象  
        CategoryAxis domainAxis=plot.getDomainAxis();         //水平底部列表  
        domainAxis.setLabelFont(new Font("黑體",Font.BOLD,14));         //水平底部標題  
        domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,12));  //垂直標題  
        ValueAxis rangeAxis=plot.getRangeAxis();//獲取柱狀  
        rangeAxis.setLabelFont(new Font("黑體",Font.BOLD,15));  
        chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 15));  
        chart.getTitle().setFont(new Font("宋體",Font.BOLD,20));//設置標題字體  
            
        //到這裏結束,雖然代碼有點多,但只為一個目的,解決漢字亂碼問題  
        //這裏也可以用chartFrame,可以直接生成一個獨立的Frame
        frame1=new ChartPanel(chart,true);          
           
    }  
    
    private CategoryDataset getDataSet() {  
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
        System.out.println(times);
        for(int i=0;i<times;i++){
            System.out.println("lalal");
            dataset.addValue(result[i],"第"+(i+1)+"輪","第"+(i+1)+"輪");
        }
        return dataset;   
    }
    
    public ChartPanel getChartPanel(){  
        return frame1;  
    }  
}  

繪制柱狀圖
繪制柱狀圖 技術分享圖片
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Tongji extends JFrame{
    PieChart pic;
    int time;
    int [] result;
    public Tongji(int[] result,int time){
        this.time=time;
        this.result=result;
        setFrame();
    }
    
    //登陸界面
    private void setFrame(){
        System.out.println(time);
        pic=new PieChart(result,time);
        this.setTitle("您最終的得分統計");
        this.setSize(600,400);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setVisible(true);
        this.add(pic.getChartPanel());
        
    }
}

統計分數
統計分數

  • 測試運行

1.登錄界面

技術分享圖片

2.數據庫

技術分享圖片

技術分享圖片

3.做題界面

技術分享圖片

技術分享圖片

技術分享圖片

4.答題結束時,自動顯示柱狀圖

技術分享圖片

三、結對過程

我的小夥伴:馬蘭

她的學號:201571030316

她的博客地址:http://www.cnblogs.com/mqqgd/p/8708953.html

以下就是我們討論時的照片啦~

技術分享圖片

四、PSP

PSP2.1

任務內容

計劃共完成需要的時間(min)

實際完成需要的時間(min)

Planning

計劃

20

16

· Estimate

· 估計這個任務需要多少時間,並規劃大致工作步驟

20

16

Development

開發

1838

1736

·· Analysis

需求分析 (包括學習新技術)

20

20

· Design Spec

· 生成設計文檔

25

25

· Design Review

· 設計復審 (和同事審核設計文檔)

10

10

· Coding Standard

代碼規範 (為目前的開發制定合適的規範)

3

3

· Design

具體設計

300

240

· Coding

具體編碼

1440

1400

· Code Review

· 代碼復審

10

8

· Test

· 測試(自我測試,修改代碼,提交修改)

30

30

Reporting

報告

33

30

·· Test Report

· 測試報告

3

2

· Size Measurement

計算工作量

10

8

· Postmortem & Process Improvement Plan

· 事後總結 ,並提出過程改進計劃

20

20

五、用漢堡評價法給小夥伴的點評

我的小夥伴是一個學習能力很強的人,在整個合作過程中合作非常愉快,她的優點是想到什麽了就會去做去學,很細心。剛開始拿到這個題目,兩個人都比較苦惱,不知道如何去實現,後來小夥伴給的建議是分工合作,突然有了緊迫感,我們查閱了相關的資料,感覺時間越來越近的時候就會督促她。當正式著手去做的時候並沒有按之前分工好的去做,因為兩人的編程能力都不是很強(她比我好很多),而是把彼此的想法都提出來進行了匯總,最後一起一步一步進行了實現。她是一個很有趣的人,在合作的過程中也不會感到乏味。在寫這篇博客的時候,有遺漏的地方她也會提醒我加上。

六、結對編程真的能夠帶來1+1>2的效果嗎?通過這次結對編程,請談談你的感受和體會

這次與另外同學的結對編程,發現自己某些方面的不足,某些考慮不全面,結對小夥伴都可以一針見血的指出,同時兩個人同時編程感覺更高效考慮的更全面,如果是很多人同時開發,幾個人之間的溝通就成很大問題,不一定就有結對編程的效率高。真正體會到1+1>=2的效果了,在項目進行的初期階段分工明確,使得我們互相督促,之後因為程序的問題,然後就一起做並解決問題。由於是鄰舍,討論問題也很方便,一人在負責自己分工的同時,另一人則也出謀劃策,遇到困難的地方在彼此的幫助下也都迎刃而解了。在這次項目的過程中,我們也通過不斷的請教大神,學到了很多東西, 通過這次的結對項目覺得終於完成了一次又有趣又有成就感的項目。

201571030314《小學生四則運算練習軟件》結對項目