1、課程名稱:html
2016級計算機科學與工程學院軟件工程(西北師範大學)java
2、課程要求:git
實驗四 軟件工程結對項目github
3、實驗內容:編程
任務1:點評隊友博客,並給出所點評做業的博客、github連接地址,點評內容和點評心得數組
1)你的博文結構安排的比較好,博文內容也寫的很好,在PSP中你在開發和具體編碼時花費了較多的時間,我我的以爲一方面是由於你對軟件開發不太瞭解,具體操做不太熟悉,另外一方面有多是由於對Java有些遺忘,以致於在編碼時花費了較多的時間,在實現某些功能時忘記了一些控件的操做,好比在柱狀圖的顯示方面,咱們都作的不太好,Java裏自己就有畫圖功能,這個咱們都忘記使用了,但願下次做業咱們均可以更好的改進。數據結構
2)你在編寫代碼時,將功能類和測試類分開這個作法很好,可是若是能夠將每個功能都分爲一個類,這樣在從此擴展功能時我以爲會比較方便。其次就是咱們都應該在人機交互方面作相應的改進。以上就是個人建議,但願在以後的結對項目中咱們能夠作的更好。框架
經過對我隊友博文的閱讀和點評,我瞭解到了本身的不足,看到了她作的好的地方,好比:她在編寫代碼時,將功能類和測試類分開編寫,而我在編寫代碼之初是寫在一個類裏面的,後來才改正過來的;而且她的博文內容很是符合做業要求,設計實現模塊也作得很好,這對我來講仍是很欠缺的,因此在從此的學習中我要多向她學習。ide
任務2:給出結對項目源碼在Github的倉庫主頁連接地址,並編寫博客文檔學習
根據實驗四 軟件工程結對項目的要求,本次項目採用兩人合做方式,設計開發一個英文文本統計分析軟件,其基本功能要求以下:
(1)實現 實驗2要求的功能;
(2)單詞頻數可視化柱狀圖要求是如下樣式:
(3)統計該文本行數及字符數;
(4)各類統計功能均提供計時功能,顯示程序統計所消耗時間(單位:ms);
(5)可處理任意用戶導入的任意英文文本;
(6)人機交互界面要求GUI界面(WEB頁面、APP頁面均可);
(7)附加分功能:統計文本中除冠詞、代詞、介詞以外的高頻詞;
(8)附加分功能:統計前10個兩個單詞組成的詞組頻率。
1.讀寫文件功能:對文件進行讀取和存放,這是英文文本統計分析軟件的基本功能;
2.用戶輸入功能:用戶能夠輸入想要查詢的單詞或文本,來查詢單詞或文本的個數以及想進行何種操做;
3.統計功能:用戶能夠統計文本行數及字符數,還能夠統計文本中除冠詞、代詞、介詞以外的高頻詞;
4.排序功能:降序排序和按字典順序排序;
5.顯示功能:顯示單詞頻數可視化柱狀圖,顯示文本行數及字符數,顯示文本中除冠詞、代詞、介詞以外的高頻詞;
6.計時功能:顯示程序統計所消耗時間;
7.人機交互功能:能夠用 GUI界面實現人機交互功能。
(1)Main.java:初始化登錄界面,從指定文件讀入單詞並統計詞頻,在該界面用戶能夠點擊按鈕進行如下操做:查看前N個高頻詞、查詢指定單詞詞頻、執行詞頻寫入文件、查看文本行數和單詞數;
(2)HighFrequencyWords.java:這個類實現了顯示文本中除冠詞、代詞、介詞以外的高頻詞,以及執行該操做所需的時間的功能;
(3)PrintToFile.java:這個類實現了文本按字典順序輸出到result.txt文件,以及執行該操做所需的時間的功能。在該類中先按字典順序排序,再寫入result.txt文件;
(4)WordCountStatistics.java:這個類實現了統計指定單詞詞頻的功能,以及執行該操做所需的時間的功能。在該類中先初始化統計指定單詞詞頻界面,再查詢並顯示指定單詞詞頻;
(5)HighFrequencyWords.java:這個類實現了繪製柱形圖的功能;
2.數據結構:
本次結對項目採用TreeMap存儲從文本讀入的數據,用LinkedList進行詞頻排序,用字符數組String進行文本中冠詞、代詞、介詞的存儲。
3.程序流程圖:
登錄界面的顯示:
前k個單詞詞頻及單詞的顯示:
統計指定單詞的詞頻及柱狀圖的顯示:
詞頻寫入文件的顯示:
行數單詞數的顯示:
顯示文本中除冠詞、代詞、介詞以外的高頻詞,以及執行該操做所需的時間部分的代碼
inputButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (event.getSource()==inputButton) { long start = System.currentTimeMillis(); String n=number2.getText(); int wordNum=Integer.parseInt(n); String print = ""; if (!n.isEmpty()) { String str = "above, over,in,of,at,on,behind,during,from,into, onto,inside,outside,to,without," + "throughout,out,she,he,its,we,them,your,i,you,my,myeself,a,an,the"; String s[] = str.split(","); ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet()); //按詞頻排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue() - o1.getValue(); } }); int j=0; int i=0; while (j<wordNum) { boolean flag = true ; String tmpString = list.get(i).getKey(); for (String string : s) { if(tmpString.equals(string)) { flag = false; } } if(flag) { print += list.get(i).getKey()+ ": " +list.get(i).getValue()+" "; j++; } i++; } JOptionPane.showConfirmDialog(null,print+"\n"+"所用時間:"+(System.currentTimeMillis() - start)+"ms","結果",JOptionPane.DEFAULT_OPTION); } } else { JOptionPane.showConfirmDialog(null, "請輸入要查詢的信息!","提示",JOptionPane.DEFAULT_OPTION); } } });
繪製柱狀圖部分的代碼
public void paint(Graphics g) { int Width = getWidth(); int Height = getHeight(); int leftMargin = 50;//柱形圖左邊界 int topMargin = 50;//柱形圖上邊界 Graphics2D g2 = (Graphics2D) g; int ruler = Height-topMargin; int rulerStep = ruler/20;//將當前的高度平分爲20個單位 g2.setColor(Color.WHITE);//繪製白色背景 g2.fillRect(0, 0, Width, Height);//繪製矩形圖 g2.setColor(Color.LIGHT_GRAY); for(int i=0;i<rulerStep;i++){ g2.drawString((30000-1500*i)+"個", 8, topMargin+rulerStep*i);//繪製Y軸上的數據 } g2.setColor(Color.PINK); int m=0; for (Entry<String, Integer> entry : map.entrySet()) { int value =entry.getValue(); int step = (m+1)*40;//設置每隔柱形圖的水平間隔爲40 g2.fillRoundRect(leftMargin+step*2,Height-value/50-5, 40, value, 40, 10);//繪製每一個柱狀條 g2.drawString(entry.getKey(), leftMargin+step*2, Height-value/50-5); //標識每一個柱狀條 m++; } }
一、在作本次結對項目時,我和隊友首先根據老師給出的代碼規範參考資料肯定了本次項目的代碼規範,好比基本的縮進、命名和註釋的規範,閱讀了對方的代碼,按照制定的規範對對方的代碼進行了改進。
二、接下來咱們倆一塊兒對本次實驗進行了需求分析,明確了在本次結對項目中咱們須要在上一次的基礎之上再完成的功能有:統計該文本行數及字符數、提供計時功能、可處理任意用戶導入的任意英文文本、實現人機交互界面、統計文本中除冠詞、代詞、介詞以外的高頻詞。肯定了項目的基本框架,項目該如何開展和大致的用時時間,按照該計劃咱們填寫了粗略的PSP表;
三、而後咱們開始着手編程。首先咱們進行了分工,我作柱狀圖的統計和附加功能一,我隊友作行數及字符數的統計 、計時功能和處理任意用戶導入的任意英文文本的部分。因此在本次結對項目中,咱們建立了五個類:Main.java:初始化登錄界面;HighFrequencyWords.java:顯示文本中除冠詞、代詞、介詞以外的高頻詞,以及執行該操做所需的時間;PrintToFile.java:按字典順序輸出到result.txt文件,以及執行該操做所需的時間;WordCountStatistics.java:統計指定單詞詞頻,以及執行該操做所需的時間;HighFrequencyWords.java:繪製柱形圖;
四、整個項目完成後,咱們兩人共同根據代碼規範進行復審,對多餘的語句進行簡化;
五、最後咱們根據完成該項目實際狀況填寫PSP實際所用時間;
六、撰寫報告文檔。
在作本次結對項目時,我和隊友的想法既有相同的時候,但同時也有碰撞的時候,在這個時候咱們一般是採用誰對就聽誰的策略。經過此次結對項目,我瞭解到團隊合做的重要性,以及在團隊合做時咱們應該注意的諸多事項,知道了在作一個團隊項目時,雙方交流、溝通的重要性,雙方合做的重要性。
任務內容 | 計劃完成時間(min) | 實際完成時間(min) |
---|---|---|
計劃 | 10 | 7 |
規劃工做步驟 | 10 | 7 |
開發 | 255 | 264 |
需求分析 | 10 | 9 |
生成文檔 | 5 | 10 |
設計複審 | 15 | 10 |
代碼規範 | 20 | 15 |
具體編碼 | 180 | 200 |
代碼複審 | 15 | 10 |
測試 | 10 | 10 |
報告 | 15 | 12 |
測試報告 | 5 | 7 |
計算報告量 | 5 | 2 |
過後總結 | 5 | 3 |
從上表中能夠看出,在開發和具體代碼的編寫時,咱們花費了較多的時間,一方面有多是由於這是咱們第一次作結對項目,還不太熟悉,另外一方面有多是由於咱們對於有些功能的實現方面有困難:好比在繪製柱狀圖來進行單詞的統計,用GUI界面實現人機交互,以及完成附加功能一中的統計文本中除冠詞、代詞、介詞以外的高頻詞等,因此在開發和具體代碼的編寫時咱們花費了較多的時間。儘管在完成這些部分時咱們都作的很是吃力,可是最終咱們仍是作出告終果。在此次結對項目中,我是真的認識到了本身在編程方面的不足,在從此的學習中要更加努力才行。
點擊源碼,查看所有代碼!