201571030314《小學生四則運算練習軟件》結對項目
結對編程實現小學生四則運算練習軟件
前言:按照結對編程的原則,我和鄰宿舍的小夥伴進行了兩人結對編程,我們開發的結對項目的是小學生四則運算練習軟件,具體就是隨機生成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《小學生四則運算練習軟件》結對項目