Github地址連接:https://github.com/J777lh7/201571030133-201571030102html
結對夥伴的博客連接:http://www.cnblogs.com/yuan1229/p/8716855.htmljava
個人學號:201571030133git
結對夥伴的學號:201571030102github
一、需求分析:編程
(1)由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;app
(2)題庫文件可採用實驗二的方式自動生成,也能夠手工編輯生成,文本格式以下:ide
(3)程序爲用戶提供三種進階四則運算練習功能選擇:百之內整數算式(必作)、帶括號算式、真分數算式練習;學習
(4)程序容許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例以下:測試
(5)程序記錄用戶答題結果,當程序退出再啓動的時候,可爲用戶顯示最後一次測試的結果,並詢問用戶能否進行新一輪的測試;ui
(6)測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。
(7)程序人機交互界面是GUI界面(WEB頁面、APP頁面均可),界面支持中文簡體(必作)/中文繁體/英語,用戶能夠進行語種選擇。
二、 軟件設計
三、 核心功能代碼展現
(1)gui界面部分代碼:
1 package yn; 2 import java.awt.event.*; 3 import java.awt.*; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 import java.util.ArrayList; 9 10 import javax.swing.*; 11 public class calculate extends JFrame 12 { 13 public BinaryTree bTree; 14 public static final int DEFAULT_WIDTH = 1000; 15 public static final int DEFAULT_HEIGHT = 1000; 16 private JButton button1; 17 private JButton button2; 18 private JButton button3; 19 private JLabel label1; 20 private JLabel label2; 21 private JLabel label3; 22 23 private JTextArea textArea1; 24 private JTextField field; 25 int cnt=0; 26 int score=0; 27 ArrayList<Integer> scores=new ArrayList<Integer>(); 28 public calculate() 29 { 30 setTitle("得分狀況"); 31 setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 32 setLocationByPlatform(true);//能夠自行設置窗口位置 33 label1 = new JLabel("顯示以下:",JLabel.LEFT); 34 label1.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); 35 label1.setBounds(200, 50, 300,45); 36 this.add(label1); 37 38 label2 = new JLabel("輸入你的答案:",JLabel.LEFT); 39 label2.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); 40 label2.setBounds(200, 600, 300,45); 41 this.add(label2); 42 43 label3 = new JLabel("",JLabel.LEFT); 44 label3.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18)); 45 label3.setBounds(200, 800, 300,45); 46 this.add(label3); 47 48 button1 = new JButton("出題"); 49 button1.setBounds(800, 200, 100,25); 50 this.add(button1); 51 button2 = new JButton("結果"); 52 button2.setBounds(800, 400, 100,25); 53 this.add(button2); 54 button3 = new JButton("總結"); 55 button3.setBounds(800, 600, 100,25); 56 this.add(button3); 57 58 textArea1 = new JTextArea(); 59 textArea1.setColumns(21); 60 textArea1.setRows(21); 61 textArea1.setBounds(200, 100, 400,400); 62 this.add(textArea1); 63 64 field = new JTextField(); 65 field.setColumns(20); 66 field.setBounds(400, 600, 300, 45); 67 this.add(field); 68 69 JPanel pan = new JPanel(); 70 add(pan); 71 72 button1.addActionListener(new ActionListener() 73 { 74 public void actionPerformed(ActionEvent event) 75 { 76 if(cnt<20) 77 { 78 question(); 79 cnt++; 80 } 81 else{ 82 button1.setText("再來一次"); 83 Start st=new Start(); 84 st.setVisible(true); 85 } 86 87 88 } 89 }); 90 91 button2.addActionListener(new ActionListener() 92 { 93 public void actionPerformed(ActionEvent event) 94 { 95 int c=0; 96 String n1 = field.getText(); 97 field.setText(null); 98 String result = bTree.CalAndVal(); 99 textArea1.append(n1); 100 101 if(n1.equals(result)) 102 { 103 textArea1.append(" 答案正確\n"); 104 score=score+5; 105 } 106 else{ 107 textArea1.append(" 答案錯誤,正確答案爲:"+result+"\n"); 108 } 109 } 110 }); 111 112 button3.addActionListener(new ActionListener() 113 { 114 public void actionPerformed(ActionEvent event) 115 { 116 scores.add(score); 117 //for(int i=0;i<scores.size();i++) 118 label3.setText("你的成績爲:"+scores + "分"); 119 Chart window=new Chart(scores); 120 window.setVisible(true); 121 122 } 123 }); 124 125 126 } 127 128 public void question() 129 { 130 131 bTree = new BinaryTree(2); 132 bTree.createBTree(); 133 textArea1.append(bTree.toString() + "=" ); 134 } 135 136 }
(2)柱狀圖代碼
1 package yn; 2 import java.awt.Color; 3 import java.awt.Graphics; 4 import java.awt.Graphics2D; 5 import java.util.ArrayList; 6 7 import javax.swing.JFrame; 8 9 public class Chart extends JFrame{ 10 11 //繪製柱形統計圖 12 ArrayList<Integer> ran=new ArrayList<Integer>(); 13 public Chart(ArrayList<Integer> scores) 14 { 15 super(); 16 getContentPane().setForeground(Color.CYAN); 17 setForeground(Color.CYAN); 18 setBackground(Color.CYAN); 19 for(int i=0;i<scores.size();i++) 20 { 21 ran.add(scores.get(i)); 22 System.out.println(scores.get(i)); 23 24 25 } 26 27 setTitle("繪製柱形圖"); 28 setSize(600, 400); 29 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 30 } 31 @Override 32 public void paint(Graphics g){ 33 int Width = getWidth(); 34 int Height = getHeight(); 35 int leftMargin = 20;//柱形圖左邊界 36 int topMargin = 50;//柱形圖上邊界 37 Graphics2D g2 = (Graphics2D) g; 38 g2.setColor(Color.WHITE);//繪製白色背景 39 g2.fillRect(0, 0, Width, Height-100);//繪製矩形圖 40 g2.setColor(Color.black); 41 for(int i=0;i<=10;i++) 42 { 43 //繪製灰色橫線和百分比 44 g2.drawString((100-10*i)+"", 15, topMargin+30*i); 45 g2.drawLine(5, topMargin+30*i, Width, topMargin+30*i);//繪製灰色橫線 46 } 47 g2.setColor(Color.BLUE); 48 for(int i=0;i<=ran.size();i++) 49 { 50 //繪製柱形圖 51 int step = (i+1)*40;//設置每一個柱形圖的水平間隔爲40 52 //繪製矩形 53 g2.fillRoundRect(leftMargin+step*2-5,(100-ran.get(i))*3+50, 40, 300-(100-ran.get(i))*3, 40, 10); 54 //列出測試輪數 55 g2.drawString("第"+(i+1)+"輪", leftMargin+step*2, 380); 56 } 57 } 58 }
(3)計時器部分代碼:
1 package yn; 2 3 import java.awt.Dimension; 4 import java.text.SimpleDateFormat; 5 import java.util.Calendar; 6 import javax.swing.JFrame; 7 import javax.swing.JLabel; 8 import javax.swing.JPanel; 9 public class TimerThread extends JFrame implements Runnable 10 { 11 private JFrame frame; 12 private JPanel timePanel; 13 private JLabel timeLabel; 14 private JLabel displayArea; 15 private String DEFAULT_TIME_FORMAT = "HH:mm:ss"; 16 private int ONE_SECOND = 1000; 17 int time = 1; boolean isRun = true; 18 public TimerThread() 19 { 20 timePanel = new JPanel(); 21 timeLabel = new JLabel("您本次用時:"); 22 displayArea = new JLabel(); 23 timePanel.add(timeLabel); 24 timePanel.add(displayArea); 25 this.add(timePanel); 26 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 27 this.setBounds(800, 100, 200, 80); 28 } 29 public void run() 30 { 31 while(isRun) 32 { 33 try { 34 displayArea.setText(+time+"s"); 35 time++; 36 Thread.sleep(1000); 37 } catch (InterruptedException e) { 38 e.printStackTrace(); 39 } 40 } 41 } 42 }
四、程序運行
五、結對的過程
提供兩人在討論、細化和編程時的結對照片(非擺拍)。
六、結對做業的PSP
PSP2.1 |
任務內容 |
計劃共完成須要的時間(min) |
實際完成須要的時間(min) |
Planning |
計劃 |
10 |
15 |
· Estimate |
· 估計這個任務須要多少時間,並規劃大體工做步驟 |
10 |
25 |
Development |
開發 |
400 |
650 |
·· Analysis |
需求分析 (包括學習新技術) |
40 |
60 |
· Design Spec |
· 生成設計文檔 |
5 |
8 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
4 |
6 |
· Coding Standard |
代碼規範 (爲目前的開發制定合適的規範) |
3 |
3 |
· Design |
具體設計 |
120 |
200 |
· Coding |
具體編碼 |
180 |
300 |
· Code Review |
· 代碼複審 |
7 |
9 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
13 |
21 |
Reporting |
報告 |
15 |
24 |
·· Test Report |
· 測試報告 |
10 |
20 |
· Size Measurement |
計算工做量 |
2 |
1 |
· Postmortem & Process Improvement Plan |
· 過後總結 ,並提出過程改進計劃 |
3 |
3 |
七、漢堡評價法給你的小夥伴一些點評(漢堡評價法:http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html)
我和結對夥伴,日常在一塊兒的時間比較多,有很好的默契。這個項目是咱們第一次合做編程,但因爲彼此的熟悉,溝通交流很是愉快,中間咱們遇到不少問題,經過一塊兒研究、討論,基本都有了解決的方法。咱們兩個的基礎都不是很好,須要上網搜索、查書、請教同窗的地方比較多,完成的較慢,也存在有些問題的解決處理不是很到位,但實驗項目仍是能夠基本完成,也很是開心。
八、結對編程真的可以帶來1+1>2的效果嗎?經過此次結對編程,請談談你的感覺和體會
經過此次結對編程,我認爲結對編程能夠給咱們帶來了1+1>2的效果。在之前的編程過程當中,因爲獨立編程,常存在思路比較侷限,對問題的發現處理不及時的問題,但在此次的結對編程中,經過與結對夥伴的分析、討論,擴展了思路,對問題有了新的理解,並能夠及時指出彼此的錯誤進行改正,讓我感覺到合做的重要性。