軟工網絡 16我的做業2

軟工網絡 16我的做業2html


1. 地址


2.我的的PSP表格。

PSP2.1 我的開發流程 預估耗費時間(分鐘) 實際耗費時間(分鐘)
Planning 計劃 30 55
Estimate 明確需求和其餘相關因素,估計每一個階段的時間成本 1000 1650
Development 開發 180 200
Analysis 需求分析 (包括學習新技術) 180 190
Design Spec 生成設計文檔 40 40
Design Review 設計複審 40 60
Coding Standard 代碼規範 15 15
Design 具體設計 30 30
Coding 具體編碼 60 100
Code Review 代碼複審 30 30
Test 測試(自我測試,修改代碼,提交修改) 40 60
Reporting 報告 60 60
測試報告 30 30
計算工做量 30 30
過後總結,並提出過程改進計劃 20 20

三、解題思路描述。

  1. 題目要求:
    • 統計字符數
    • 統計有效行數
    • 統計單詞數
    • 統計詞頻並輸出前十個單詞
  2. 解題過程:
    一、統計字符數
    忽略漢字,空格、字母與數字的ASCII碼值範圍在32-126,換行符ASCII碼值爲10,水平製表符ASCII碼值爲9。
    利用InputStreamReader輸入流從文件中讀取單個字符,定義一個字符計數器。循環讀取單個字符,判斷該字符的ASCII碼值範圍,知足條件,計數器加1。返回結果。
    二、統計有效行數
    利用輸入流從文件中讀取一行,判斷是否爲有效行數,有無字符串,知足條件則行數計數器加1。
    三、統計單詞數
    利用輸入流從文件中讀取一行字符串,將其分割成單詞,存入表中。返回表格的長度。
    四、統計詞頻並輸出前十個單詞
    創建集合map,逐個讀取單詞表中的單詞,判斷該詞是否已存入集合,有則將該單詞對應的value(即出現的次數)加1,沒有就將該單詞存入集合。將集合元素按照頻數排序,最後進行輸出結果。

四、設計實現過程

代碼組織:將幾個功能封裝在幾個函數中,再進行調用。
一、統計字符數
將要統計的文件的路徑作爲參數傳入函數中,再按照解題思路中利用字符流逐個讀取字符進行判斷和統計。
設計函數num_of_char以下:git

private static int num_of_char(String filename2) {
        File file =new File(filename);
        InputStreamReader r=null;//輸入流讀取單個字符
        int c_num=0;//字符計數器
        try {
            r=new InputStreamReader(new FileInputStream(file));
            int tempchar;//存放單個字符
            try {
            while((tempchar=r.read()) !=-1) {
      if((tempchar >31&&tempchar<127)||tempchar==10||tempchar==9) {     //讀取的字符不包括漢字,但有包括換行符(10)和空格符
                        c_num++;
                    }
                }
                r.close();//關閉資源
            } catch (IOException e) ;
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在");
        }
        return c_num++; 
    }

二、統計有效行數
統計文件的路徑做爲傳入參數,利用BufferedReader讀取一行文件內容,判斷是否爲空,不然將計數器加一。程序員

private static int num_of_line(String filename2) throws IOException {
          File file =new File(filename);
          int l_num=0;//行數計數器 
          BufferedReader r=null;
          r=new BufferedReader(new FileReader(file));
          String s=null;
          while((s=r.readLine())!=null) {//讀到一行,計數器加1
                l_num=l_num+1;
          }  
          r.close();
        return  l_num;
    }

三、統計單詞數
利用List存放文本的全部有效單詞。統計文件的路徑做爲傳入參數,利用BufferedReader讀取一行文件內容,利用正則表達式"\\s*[^0-9a-zA-Z]+"分割過濾除字母和數字之外的字符串。將全部字符串轉爲小寫。進一步判斷字符串是否含有數字(設計函數isNumberic(String str)),有數字,若知足以4個英文字母開頭,跟上字母數字符號的格式(利用正則表達式),就將其加入單詞表中;字符串中沒有數字,例如:I,am,you等單詞,也加入到單詞表中。最後返回單詞表的長度,即爲單詞總數。正則表達式

//統計單詞數
    private static int num_of_word(String filename) throws IOException {
        int w_num=0;
        File file =new File(filename);
        BufferedReader rf=null;
        
        rf=new BufferedReader(new FileReader(file));
        String s;
        while((s=rf.readLine())!=null) {
            String regex="\\s*[^0-9a-zA-Z]+";//正則表達式,過濾除字母和數字意外的特殊符號
            String[] s2=s.split(regex);//分割字符串
            
            for (String str : s2) {
                String string=str.toLowerCase();//將單詞轉爲小寫
                if(isNumberic(string)) {//判斷字符串中有數字 
                     if(string.length()>3) {//有數字,判斷單詞長度超過或等於4
                        if (string.matches("[a-zA-Z]{4,}[a-zA-Z0-9]*")) {//判斷單詞是否爲4個字母加上數字,知足條件添加進表
                        lists.add(string);
                    }
                }
            }
            else//字符串中沒有數字
            {
                lists.add(string);
            }
            }   
        }
        rf.close();
        w_num=lists.size();
        return w_num;
    }

判斷字符串中是否有數字函數編程

public static boolean isNumberic(String str) {
        boolean re=false;
         for(int i=0;i<str.length();i++){
                if(Character.isDigit(str.charAt(i))){
                    re = true;
                    break;
                }
            }
            return re;
        
    }

四、統計詞頻並輸出頻數前10的單詞數組

  • 統計詞頻wro_fre()

將完成的單詞表list逐一取出單詞,存入集合wordMap中,其中集合的key值爲單詞,value值爲單詞出現的頻數。當集合中不存在這個單詞時,就將其add入集合中;若存在,就將該單詞的頻數即value加一。網絡

//利用Map集合統計詞頻
     public static void word_fre(){
         int value;
         for (String word : lists) {
            if(wordMap.containsKey(word)) {
              value=wordMap.get(word);
              value++;
              wordMap.put(word, value);
              }
            else {
                wordMap.put(word, 1);
            }
         }
         
     }
  • 集合排序輸出sortWord()
    將單詞集合利用覆蓋Collection.sort()方法來進行集合鍵值對的排序。最後返回詞頻前10個單詞的字符串數組。
//將map集合進行排序並返回前10個單詞的字符串數組
   public static String[] sortWord() {
       List<Map.Entry<String, Integer>> wordlist = new ArrayList<Map.Entry<String, Integer>>(wordMap.entrySet());
       Collections.sort(wordlist, ((o1, o2) -> o2.getValue().compareTo(o1.getValue()))); //排序  
       String[] str=new String[10];
       int i=0;
       
       for (Map.Entry<String, Integer> entry : wordlist) {
       //拼接字符串key+value
           if(i!=10) { 
           str[i]="<"+entry.getKey()+">"+":"+entry.getValue();
           i++;
           }
           else {
               break;
           }
       }   
       return str;
       
       
   }

五、寫出文件
利用FileWrite進行寫出操做。函數

//path:寫出文件的路徑;content:寫出的內容
 public static void writetofile(String path, String content) throws IOException  {
         FileWriter fw = new FileWriter(new File(path));
         fw.write(content);
         fw.write("\n"); 
         fw.close();  
        }

五、單元測試

對於各個功能模塊分別提供一些測試樣例進行測試。其中功能可基本實現。但寫出文件模塊沒法將結果完成寫出,每次都只能顯示一個。單元測試


測試樣例有:



學習

代碼覆蓋率:


六、效能分析

利用JProfiler

7.結合在構建之法中學習到的相關內容與我的項目的實踐經歷,撰寫解決項目的心路歷程與收穫。

答:

  • 本次的做業對於編程不太好的我來講是一個挑戰。因爲我的能力有限,花費了不少時間在設計和實現代碼,耗時也費力,只能實現簡單的統計字符和行數的功能,效律低下。在網上查詢了不少相似題目的代碼,繁雜且難以吸取化爲己用,同時我也請教同窗,在其幫助下,我才能克服情緒化,完成此次的做業。
  • 此次的做業更多的是讓咱們親身感覺學習軟件工程中的一些重要思想。如錯誤處理並設計單元測試、效能分析、接口封裝、psp等。這些能夠更好的幫助程序員和團隊完成軟件的開發。一個完整的項目解決,必定要先思考分析完整後,再進行動手,否則會得不償失,反而花費更多時間。之後的項目開發必定要流程規範。
  • 在閱讀構建之法的時候,書中提出了一系列程序員存在的問題。從本身身上看,發現這些問題在本身身上常常出現。編碼前,只是查閱一下網上的資料稍做思考,直接就開始打代碼。沒有構思的過程,寫出的程序很亂,常常會出現錯誤,將不少時間花在沒必要要的小錯誤上。固然我編寫的程序仍存在着不少不盡如人意的地方,測試和代碼設計也有必定的缺憾和漏洞,這些都是我在從此學習中要去學習改進的地方。
相關文章
相關標籤/搜索