1、github連接地址java
https://github.com/Transform21/treasury/tree/master/Update_Endgit
2、結對項目報告 github
a. 需求分析:算法
在《實驗二 軟件工程我的項目》中,咱們已經實現了一個命令行四則運算出題小程序,爲了更好的達到訓練效果,咱們設計開發了一個小學生四則運算練習軟件,需求分析內容以下:編程
(1)、針對小學生這一用戶羣體,專項測試能幫助他們檢驗學習效果,同時屢次訓練也有助於更好的掌握所學內容。因而咱們設計由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計分,錯誤不計分,20道題測試結束後給出測試總分,用這樣的方式讓學生知道本身的能力水平程度。小程序
(2)、小學生運算難度是肯定並有限制的,於是設立專門針對於小學生的題庫。由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分,整數題庫示例以下圖所示:less
(3)、量變引發質變。對於小學生來講,四則運算的掌握無外乎要多多作練習,於是程序容許用戶進行多輪測試,在更好的達到訓練目的的同時,爲用戶提供多輪測試分數柱狀圖,讓用戶直觀的感覺學習效果,示例以下:eclipse
(4)、小學生計算能力的提高不光要看他的正確率,還要看他作計算題時的用時和速度,綜合結果纔是小學生能力水平體現。,於是測試設立計時功能,每一輪測試完成都會返回用戶所用答題時間。ide
(5)、爲了讓用戶有更好的體驗,程序設計人機交互界面是GUI界面,讓用戶更具界面內容提示完成測試。函數
(6)、小學生的知識結構是一點一點創建起來的,學習也有按部就班的過程,因而程序設計爲用戶提供三種進階四則運算練習功能選擇:百之內整數算式、帶括號算式以及真分數算式練習;
b.程序流程圖
c. 軟件設計:
本項目共有五個類
(1)Main( )類:用戶窗口的登陸界面;
(2)Start( )類:產生答題窗口,並設立界面各個按鈕監聽事件,
(3)Calculate_SE()類:運算式產生,產生整數運算式、分數運算式文件。
(4)Timer()類:產生計時窗口。
(5)Chart_H( )類:繪製成績柱狀圖。
d. 核心功能代碼展現:展現核心功能代碼。
關於整數和分數選題部分,咱們在界面當中設置兩個可選按鈕,當選中相應按鈕時,用戶界面顯示對應的計算式。
以整數部分爲例,當按下按鍵時設置事件監聽,獲取Calculate_SE類當中產生的計算式,爲了界面設置的簡潔,咱們用CA.IntegerQ.get(number)這一語句獲取每一條計算式,計算式都放入一個label當中,
1 //---------------------------------------整數------------------------- 2 3 JRadioButton buttonInteger=new JRadioButton("整數");//JRadioButton 4 buttonInteger.addItemListener(new ItemListener() { 5 public void itemStateChanged(ItemEvent arg0) { 6 frame2.pack(); 7 frame2.setVisible(true); 8 try { 9 CA.calaulate_AE(40); 10 } catch (IOException e) { 11 e.printStackTrace(); 12 } 13 String shizi = CA.IntegerQ.get(number); 14 NUM++; 15 label1.setText(shizi); 16 } 17 }); 18 //--------------------------------分數--------------------------------- 19 JRadioButton buttonFenshu = new JRadioButton("分數"); 20 buttonFenshu.addItemListener(new ItemListener() { 21 public void itemStateChanged(ItemEvent arg0) { 22 frame2.pack(); 23 frame2.setVisible(true); 24 try { 25 CA.fenshu(); 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 String shizi = CA.FractionQ.get(number); 30 NUM++; 31 label1.setText(shizi); 32 } 33 });
點擊提交答案的按鈕事後,所提供給用戶的功能時,(1)讓用戶看到本身的答題用時;(2)顯示用戶的作題狀態,並給出正確答案,最後統計用戶得分。
關於答題用時,咱們將計時類當中最終統計的時間每一次都存入文件當中,在最終提交答案時,讀取文件中的內容返回給timeLabel中;關於作題狀態,將text中用戶所所填寫的答案與Arraylist當中已存取的答案進行比較,若相同則狀態爲正確,若不一樣,則狀態值錯誤。
JButton buttonSubmit=new JButton("提交答案"); buttonSubmit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame2.dispose(); if(buttonInteger.isSelected()) { String question=label1.getText(); String result=text.getText(); String ifRight=""; String time; if((CA.IntegerA.get(number)).equals(result)){ ifRight="正確"; rightSum++; }else{ ifRight="錯誤"; } String message=question+", "+"你的答案:"+result+", "+"正確答案: "+CA.IntegerA.get(number)+", 狀態: "+ifRight; list.add(message); text.setText(""); } if(buttonFenshu.isSelected()) { String question=label1.getText(); String result=text.getText(); String ifRight=""; if(CA.FractionA.get(number).equals(result)){ ifRight="正確"; rightSum++; }else{ ifRight="錯誤"; } String message=question+", "+"你的答案:"+result+", "+"正確答案: "+CA.FractionA.get(number)+", 狀態: "+ifRight; list.add(message); text.setText(""); } //----------------------------------------- // temp=number-1; String score=String.valueOf(rightSum*5); newList.add(score); File file = new File("test.txt"); BufferedWriter bw = null; try { bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt", true))); bw.newLine(); bw.write(score); } catch (Exception e1) { e1.printStackTrace(); } finally { try { bw.close(); } catch (IOException e1) { e1.printStackTrace(); } } File file1 = new File("time.txt"); FileReader fr1 = null; BufferedReader br1 = null; String time=""; try { fr1 = new FileReader(file1); br1 = new BufferedReader(fr1); String line = ""; while((line = br1.readLine()) != null) { time=line; } } catch (Exception e1) { e1.printStackTrace(); } finally { try { br1.close(); fr1.close(); } catch (Exception e1) { e1.printStackTrace(); } } int size=list.size(); int errorSum=size-rightSum; JFrame resultFrame=new JFrame(); resultFrame.setTitle("運算結果"); resultFrame.setSize(500,500); resultFrame.setLocationRelativeTo(null); resultFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); resultFrame.setVisible(true); JPanel panel7 = new JPanel(); Timelabel.setText("您本輪答題用時爲:"+time); panel7.add(Timelabel); resultFrame.add(panel7,BorderLayout.NORTH); setLayout(new GridLayout(10,2,5,5)); JPanel panel=new JPanel(); Font font = new Font(Font.DIALOG, Font.PLAIN, 20); panel.add(new JLabel("作題總數: "+size+" "+"正確數:"+rightSum+" "+" 最終得分:"+rightSum*5)); setLayout(new GridLayout(100,2,5,5)); for(int i=0;i<size;i++){ panel.add(new JLabel(list.get(i))); } JPanel panel6=new JPanel(); panel6.add(buttonFenXi); panel6.add(buttonAgain); resultFrame.add(panel); resultFrame.add(panel6,BorderLayout.SOUTH); }});
1 import javax.swing.*; 2 import java.awt.HeadlessException; 3 import java.awt.BorderLayout; 4 import java.awt.FlowLayout; 5 import java.awt.Font; 6 import java.awt.event.ActionListener; 7 import java.io.BufferedReader; 8 import java.io.BufferedWriter; 9 import java.io.File; 10 import java.io.FileReader; 11 import java.io.FileWriter; 12 import java.io.IOException; 13 import java.awt.event.ActionEvent; 14 15 /** 16 * 計時器 17 */ 18 public class Timer extends JFrame { 19 20 private static final long serialVersionUID = 1L; 21 private static final String INITIAL_LABEL_TEXT = "00:00:00 000"; 22 // 計數線程 23 private CountingThread thread = new CountingThread(); 24 // 記錄程序開始時間 25 private long programStart = System.currentTimeMillis(); 26 // 程序一開始就是暫停的 27 private long pauseStart = programStart; 28 // 程序暫停的總時間 29 private long pauseCount = 0; 30 private JLabel label = new JLabel(INITIAL_LABEL_TEXT); 31 private JButton startPauseButton = new JButton("開始"); 32 private JButton resetButton = new JButton("清零"); 33 String time; 34 private ActionListener startPauseButtonListener = new ActionListener() { 35 public void actionPerformed(ActionEvent e) { 36 if (thread.stopped) { 37 pauseCount += (System.currentTimeMillis() - pauseStart); 38 thread.stopped = false; 39 startPauseButton.setText("暫停"); 40 } else { 41 pauseStart = System.currentTimeMillis(); 42 thread.stopped = true; 43 startPauseButton.setText("繼續"); 44 } 45 } 46 }; 47 private ActionListener resetButtonListener = new ActionListener() { 48 public void actionPerformed(ActionEvent e) { 49 pauseStart = programStart; 50 pauseCount = 0; 51 thread.stopped = true; 52 label.setText(INITIAL_LABEL_TEXT); 53 startPauseButton.setText("開始"); 54 } 55 }; 56 public Timer(String title) throws HeadlessException { 57 super(title); 58 setDefaultCloseOperation(EXIT_ON_CLOSE); 59 setLocation(300, 300); 60 setResizable(false); 61 62 setupBorder(); 63 setupLabel(); 64 setupButtonsPanel(); 65 startPauseButton.addActionListener(startPauseButtonListener); 66 resetButton.addActionListener(resetButtonListener); 67 thread.start(); // 計數線程一直就運行着 68 } 69 // 爲窗體面板添加邊框 70 private void setupBorder() { 71 JPanel contentPane = new JPanel(new BorderLayout()); 72 contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 73 this.setContentPane(contentPane); 74 } 75 // 配置按鈕 76 private void setupButtonsPanel() { 77 JPanel panel = new JPanel(new FlowLayout()); 78 panel.add(startPauseButton); 79 panel.add(resetButton); 80 add(panel, BorderLayout.SOUTH); 81 } 82 // 配置標籤 83 private void setupLabel() { 84 label.setHorizontalAlignment(SwingConstants.CENTER); 85 label.setFont(new Font(label.getFont().getName(), label.getFont().getStyle(), 40)); 86 this.add(label, BorderLayout.CENTER); 87 } 88 89 private class CountingThread extends Thread { 90 91 public boolean stopped = true; 92 93 private CountingThread() { 94 setDaemon(true); 95 } 96 97 @Override 98 public void run() { 99 while (true) { 100 if (!stopped) { 101 long elapsed = System.currentTimeMillis() - programStart - pauseCount; 102 label.setText(format(elapsed)); 103 time=label.getText(); 104 File f=new File("time.txt"); 105 BufferedWriter bw; 106 try { 107 bw = new BufferedWriter(new FileWriter(f)); 108 bw.write(time); 109 bw.close(); 110 } catch (IOException e) { 111 // TODO Auto-generated catch block 112 e.printStackTrace(); 113 } 114 } 115 116 try { 117 sleep(1); // 1毫秒更新一次顯示 118 } catch (InterruptedException e) { 119 e.printStackTrace(); 120 System.exit(1); 121 } 122 } 123 } 124 125 // 將毫秒數格式化 126 private String format(long elapsed) { 127 int hour, minute, second, milli; 128 129 milli = (int) (elapsed % 1000); 130 elapsed = elapsed / 1000; 131 132 second = (int) (elapsed % 60); 133 elapsed = elapsed / 60; 134 135 minute = (int) (elapsed % 60); 136 elapsed = elapsed / 60; 137 138 hour = (int) (elapsed % 60); 139 140 return String.format("%02d:%02d:%02d:%03d", hour, minute, second, milli); 141 } 142 } 143 }
e. 程序運行截圖:
(1) 首先進入用戶的登陸窗口,用戶須要輸入姓名學號等信息。
(2)用戶登陸後,進入正式的答題界面,在這一界面當中,用戶每進行一輪測試,在下一輪當中都會顯示上一輪用戶的成績。
用戶須要根據需求點擊所須要訓練的內容。
(3)在用戶答題至第二十題時,答題結束,提示用戶將答案提交。
(4)提交答案後咱們能夠看到生成的用戶作題結果。
(5)優化後的題目分析狀態圖。
(6)根據用戶多輪測試,將用戶測試數據顯示到柱狀圖當中。
f.編程時的結對照片。
g.這次結對做業的PSP。
PSP2.1 | 任務內容 | 計劃完成的時間(min) | 實際完成須要的時間(min) |
---|---|---|---|
PLanning | 計劃 | 60 | 80 |
Estimate | 估計這個任務須要多少時間,並規劃大體工做步驟 | 30 | 40 |
Developmet | 開發 | 480 | 520 |
Analysis | 需求分析(包括學習新技術) | 30 | 40 |
Design Spec | 生成設計文檔 | 10 | 15 |
Design Revie | 設計複審(和同事審覈設計文檔) | 20 | 30 |
Coding Standard | 代碼規範 | 30 | 40 |
Design | 具體設計 | 45 | 60 |
Coding | 具體編碼 | 240 | 300 |
Code Review | 代碼複審 | 30 | 30 |
Test | 測試(自我測試,修改代碼,提交修改) | 20 | 30 |
Reporting | 報告 | 30 | 40 |
Test Report | 測試報告 | 20 | 20 |
Size Measurement | 計算工做量 | 5 | 5 |
Postmortem & Process Improvement Plan | 過後總結,並提出過程改機計劃 | 20 | 30 |
h. 請使用漢堡評價法給你的小夥伴一些點評。
關於個人小夥伴嘛,她是一個很認真的女孩,對於項目的每一部分她都十分仔細,老是迎難而上,遇到問題不是焦躁而是冷靜沉着的解決每一次困難,她的動手能力很強,作事從不拖沓,在咱們作項目的過程當中當我遇到其餘事情時我總會想着先將問題放一放,殊不知編程是一個持續的過程,間斷後第二次又要從新梳理思路,無形中浪費不少時間。她也是一個頗有主見的女孩兒,當咱們想法出現碰撞時,她總能按照本身的想法去嘗試每個可能,最終找到解決辦法。整個項目分爲五個模塊,運算式是在第一次做業的基礎上完成的,對比來講,小夥伴的第一次做業代碼比我工整許多,有更強的可擴展性,因此在運算式產生部分咱們選擇了她的代碼,在編寫完界面以後調用產生運算式的算法,加入計時器和柱狀圖,完成了咱們一開始的想法,總之,很開心的一次合做,期待下一次~
i. 結對編程真的可以帶來1+1>2的效果嗎?經過此次結對編程,請談談你的感覺和體會。
對於這個不用說,答案必定是確定的,在整個過程當中咱們大概用了接近三天的時間完成,兩我的合做真的節省了很多時間,在一個問題不會的時候總有一我的能夠和你一塊兒商量,比起一我的效率高不少,畢竟一我的調代碼調不出來是真的很絕望的,多一我的幫忙在給出想法的同時無形中提升了本身的能力,很喜歡這樣的編程方式,兩我的一塊兒看代碼改代碼,相比起一我的編碼時的枯燥,兩我的合做完成一個任務時取得的成就感十分讓人開心。對於咱們此次的合做,我把它當作一個學習的機會,學習他人優勢,看到本身的不足,讓本身一步步成長。
對於JAVA:算起來JAVA真的有很長時間都沒有碰過了,一開始真的讓我很痛苦,但就像老師說的那樣,忘記不該該看成理由,當把一件本身認爲困難的事努力作到時,對我來講也許就是一個很大的進步吧,如今本身的寫代碼水平還很堪憂,也許別人花費一兩個小時的任務我須要花費十個小時來完成,雖然最後都能完成,可是時間成本真的大不少,都是很差好學習造的孽呀o(╥﹏╥)o。這學期對我來講比較特殊,要複習考研,時間十分緊張,但卻依然要抽工夫完成這些,如今看來最好的辦法就是好好花功夫把JAVA再溫習一遍了,還好以前有基礎,過程也不是很困難,我想也只有這樣本身才能節省更多時間去複習了。
關於學習畫類圖時用到的兩個博客,記錄下來留着下次用~
https://blog.csdn.net/u012714280/article/details/51678503
https://blog.csdn.net/wanmeirongyan100/article/details/51601570
一張無心看到的頗有意思的插圖~