201671030122楊凡億 實驗二 詞頻統計軟件項目報告

項目 內容
課程名稱 2016級計算機科學與工程學院軟件工程(西北師範大學)
做業要求 實驗三 軟件工程我的項目
做業目的 1.掌握軟件項目我的開發流程
2.掌握Github上發佈軟件項目的操做方法


一.需求分析

  • 程序可讀入任意英文文本文件,即用戶須要本身輸入文件名。
  • 程序須要很壯健,能讀取容納英文原版《哈利波特》10萬詞以上的文章,即數據的存儲方式。
  • 指定單詞詞頻統計功能,即(1)用戶可輸入一個或多個單詞查詢對應的詞頻(2)並顯示對應的柱狀圖。
  • 高頻詞統計功能:用戶從鍵盤輸入高頻詞輸出的個數k,運行程序統計功能,可按文本中詞頻數降序顯示前k個單詞的詞頻及單詞。
  • 統計該文本全部單詞數量及詞頻數,並能將單詞及詞頻數按字典順序輸出到文件result.txt。


二.功能設計

  • 菜單功能。列出用戶能夠操做的命令。對於用戶輸入的無效命令應該有相應的錯誤處理能力。
  • 文件的輸入和輸出功能。在文件輸入時,若文件不存,則應有相應的錯誤處理功能。
  • 詞頻統計功能。
  • 排序功能。按值排序,按鍵排序。
  • 顯示功能。(1)顯示指定單詞的詞頻和柱狀圖,若用戶輸入無效單詞,應該有相應提示。(2)高頻詞的統計功能。


三.設計實現

(1)程序共有兩個類。html

  • Main.java是主類。主要利用switch結構對用戶輸入的命令進行判斷,並調用相應的函數。
  • function.java 主要是一些功能方法。包括:文件的讀入(input)、菜單顯示(menu)、指定單詞詞頻統計(frequency)、排序(rank)、高頻詞統計(Highwordcount)、輸出到文件result.txt(output)
  • 程序執行時,主要是在主類Main.java裏面調用function.java類裏面的方法,實現須要的功能。

(2)數據結構:用HashMap<String, Integer>存儲分詞後的單詞和對應的詞頻。
(3)整體流程圖
java


四.測試運行

  • 文件的讀入git

  • 高頻詞統計
    github

  • 指定單詞詞頻統計
    數據結構

  • 輸入到result.txt
    ide

  • 一些錯誤處理
    模塊化


五.部分代碼

  • 文件讀入並統計詞頻

try {
     FileInputStream fis = new FileInputStream(filename);
     BufferedReader br = new BufferedReader(new InputStreamReader(fis));
     String temp="";
     String info="";
     while((temp = br.readLine())!=null)
     {
         String[] str = temp.split("([^a-zA-Z])"); //過濾出只含有字母的
         for(int i=0;i<str.length;i++)
         {
             String word = str[i].trim();
             if(word.length()!=0)    //去除長度爲0的行
             staff.put(word, staff.getOrDefault(word, 0)+1);
         }
     }
     br.close();
     rank();//按值排序
     System.out.println("文件讀入成功!請繼續...");
   }catch(Exception e) {
     System.out.println("文件不存在!!!請從新確認!");
    }
  • 文件輸出到result.txt

Set<Entry<String,Integer>> mapEntries = staff.entrySet();//該方法將鍵和值的映射關係做爲對象存儲到了Set集合中
      
      List<Entry<String,Integer>> aList1 = new ArrayList<Entry<String,Integer>>(mapEntries);
      //按字典序排序
      Collections.sort(aList1, new Comparator<Entry<String,Integer>>() {
           
          @Override
          public int compare(Entry<String, Integer> ele1,
                  Entry<String, Integer> ele2) {

              return ele1.getKey().compareTo(ele2.getKey());
          }
      });

      PrintWriter out = null;
      try {
          out = new PrintWriter("result.txt");
          out.println("total: "+aList.size()); //輸出總詞數
          for(Entry<String,Integer> entry: aList1) 
          {
              out.println(entry.getKey()+"\t"+entry.getValue());
          }
      } catch (FileNotFoundException e1) 
      {
          // TODO Auto-generated catch block
          e1.printStackTrace();
      }
      out.close();
      System.out.println("已寫到result.txt  請繼續...");
  }


六.總結

  • 每一個功能的實現都在function類中,在主類裏面經過類名直接調用相應的方法實現功能,以此實現模塊化。
  • 在畫柱狀圖時,本想採用重寫paint()方法來實現,也參考了網上的一些代碼,但因爲本身知識有限,沒能實現。後面會繼續完善。
  • 對於需求分析和設計,應當重視。在這次設計中,因爲沒有作好這些,在編碼完成測試時才發現一些功能和需求不一樣,又花了一點時間修改。這要是在大項目中有點不可想象。


七.PSP

PSP 任務內容 計劃共完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 8 5
Estimate 估計這個任務須要多少時間,並規劃大體工做步驟 8 5
Development 開發 170 220
Analysis 需求分析(包括學習新技術) 20 15
Design Spec 生成設計文檔 10 12
Design Review 設計複審 11 13
Coding Standard 代碼規範(爲目前的開發制定合適的規範) 5 9
Design 具體設計 10 12
Coding 具體編碼 70 130
Code Review 代碼複審 10 15
Test 測試(自我測試,修改代碼,提交修改) 30 60
Reporting 報告 15 20
Test Report 測試報告 6 9
Size Measurement 計算工做量 5 3
Postmortem & Process Improvement Plan 過後總結,並提出過程改進計劃 5 4
  • 從表中能夠看到,在編碼和測試部分花費了很長是的時間,和預期的是計劃差距有點大。主要是對於需求沒有弄得很清楚,致使在測試階段根據測試結果又修改代碼,浪費了很時間;其次是好久沒有用到java,在編碼時又化了不少時間看書。我以前一直對需求分析和設計不是很重視,但經過此次小項目,我想對於需求分析和設計等有了更深的體會和感覺,在接下來的學習中,會按照軟件開發流程完成學習任務。

點擊此處查看源碼GitHub

相關文章
相關標籤/搜索