WordCount実装とテスト

11805 ワード

WordCount実装とテスト


一、githubアドレス


https://github.com/TCZdudu/WCProject


二、PSP表


PSP2.1
PSPステージ
推定所要時間(分)
じつじかん
Planning
けいかく
20
15
· Estimate
・このタスクにどれくらいの時間がかかるか見積もる
20
20
Development
かいはつ
700
840
· Analysis
・需要分析(新技術の習得を含む)
100
120
· Design Spec
・設計文書の生成
20
20
· Design Review
・設計再審(同僚と設計文書の審査)
10
10
· Coding Standard
・コード仕様(現在の開発に適切な仕様を制定)
20
30
· Design
・具体的な設計
100
150
· Coding
・具体的な符号化
200
240
· Code Review
・コード再審
100
120
· Test
・テスト(自己テスト、コード修正、修正提出)
150
150
Reporting
レポート作成
180
200
· Test Report
・テストレポート
100
120
· Size Measurement
・ワークロードの計算
20
20
· Postmortem & ProcessImprovement Plan
・事後総括、プロセス改善計画の提出
60
60
合計
920
1075

三、問題を解く構想

  • このタイトルを見て、まず思いついたのは、ファイルを読むことと書くことです.JAvaはファイルを読み込む方法が多く、結局BufferedReaderを選択しました.read()関数は1文字ずつ読み出し、readline()は1行ずつ読み出します.
  • 文字、単語、行などの判断について、すぐにコンパイラの中の文法分析を思い出したが、全く同じではなかった.
  • 複雑なのは、入力された異なるコマンドについて判断し、異なるコマンドに従って異なる機能を実行し、入力されたコマンドの中から異なるファイル名の役割を見つけることです.
  • 最後にjavaからexeに移行し、今まで納得できなかったが、exeでなぜjavaで書くのかをテストする.

  • 四、プログラム設計実現過程

  • コード主関数は9個あり、主に異なるコマンドごとに異なる機能である.
  • 文字、単語、行数の統計化に着手することは、ファイルから読み取った文字列に対する処理であり、通常であり、面倒ではない.
  • コード行の分解、ファイルの再帰処理、語の非アクティブ化を行う.コード行の種類は2種類///**///良い判断、本行があればコード行、/**/の間のコードもコード行として計算するので、先頭があれば末尾があり、先頭の位置を覚えてから、末尾の位置を見つけて総行数を判断することができます.空行も簡単で、記録が/**/内にない空行や{}・、前に記録した総行数でこの空行と注釈行を減じてコード行を得る.停用語は停用語の個数を統計して、減らします.
  • 機能を実現した後にコマンドを入力した解析を処理し、条件文で異なるコマンドに対応する異なる機能を実現する解析を行う.

  • 五、コード説明


    いくつかの主要な関数の実現を紹介します


    次に、停用語を取得する関数である、入力-eのときに呼び出すstoplistを先に取得する.txtの中の語は1つのlistの中で保存して、それから中の語の回数を統計します
    public static List get_stop(String args[])throws IOException{
            // “-e” , stoplist 
            List input_args = Arrays.asList(args);
            List stop_words = new ArrayList();
            if (input_args.contains("-e")) {
                int index = input_args.indexOf("-e");
                String stopFile = input_args.get(index + 1);
                BufferedReader buffer = null;
                buffer = new BufferedReader(new FileReader(stopFile));
                stop_words = getStopList(buffer);
            }
            return stop_words;
        }
    
      public static int get_stop_num(String filename,List stop_list)throws IOException{
          // 
          FileReader f_obj = new FileReader(filename);
          BufferedReader b_obj = new BufferedReader(f_obj);
          String str;
          int num_stop=0;
          while ((str = b_obj.readLine()) != null) {
              for (String s : str.split(" ")) {
                  for (String s1 : s.split(",")) {
                      if (s1.length() > 0 && stop_list.contains(s1)) {
                          num_stop++;
                      }
                  }
              }
          }
          return num_stop;
      }
    

    コード行、空白行、コメント行の数を判断します.先に注釈以外の空行を統計してから、///**/クラスのコード行を統計して、最後の総数目から空行と注釈行を減算してコード行を得る
    public static String get_line_info(String filename)throws IOException{
            // 、 、 
            int blank_line_num =0,code_line_num = 0,note_line_num = 0;
            FileReader f_obj = new FileReader(filename);
            String result;
            BufferedReader b_obj = new BufferedReader(f_obj);
            int line_num = 0;
            String str_line = null;
            while ((str_line = b_obj.readLine()) != null) {
                if (str_line.length() == 0 || str_line.equals("{" )|| str_line.equals("}")) {
                    blank_line_num++; // 
                } else {
                    for (int i = 0; i < str_line.length()-1; i++) {
                        boolean flag2=true;
                        while (str_line.charAt(i) != ' ' && str_line.charAt(i) != '\t' && flag2) {
                            if (str_line.charAt(i) == '/' && str_line.charAt(i + 1) == '/') {
                                note_line_num++; // // 
                                i = str_line.length();
                                break;
                            } else if (str_line.charAt(i) == '/' && str_line.charAt(i + 1) == '*') {
                                boolean flag=true;// /**/ 
                                for (int t = str_line.length()-1; t >= 0; t--) {
                                    while (str_line.charAt(t) != ' ' && str_line.charAt(t) != '\t'&& t>=1) {
                                        if (str_line.charAt(t) == '/' && str_line.charAt(t - 1) == '*') {
                                            t = -1;    //   1  
                                            flag =false;
                                            flag2=false;
                                            break;
                                        }
                                        else break;
                                    }
                                }
                                note_line_num +=1;
                                while (flag) {  //     
                                    if((str_line = b_obj.readLine()) != null) {
                                        note_line_num++;
                                        line_num++;
                                        for (int j = str_line.length() - 1; j >= 0; j--) {
                                            while (str_line.charAt(j) != ' ' && str_line.charAt(j) != '\t' && j >= 1) {
                                                if(str_line.charAt(0) == '*' && str_line.charAt(j - 1) == '/' && str_line.length() > 2) {
                                                    note_line_num -= 1;
                                                    j = -1;
                                                    flag = false;
                                                    break;
                                                }
                                                else if (str_line.charAt(j) == '/' && str_line.charAt(j - 1) == '*') {
                                                    j = -1;
                                                    flag = false;
                                                    break;
                                                }
                                                else break;
                                            }
                                        }
                                    }
                                }
                            }
                            else {
                                break;
                            }
                        }
                    }
                }
                line_num++;  // 
            }
            code_line_num = line_num - note_line_num -blank_line_num;  //  =   -   - 
            result = filename +", / / :"+ code_line_num +"/" + blank_line_num + "/" +note_line_num + "\r
    "; return result; }

    入力されたコマンドを判断し、異なる機能を実現
    public static void out_result(String filename,BufferedWriter file_writer,String args[],int args_len )throws IOException{
            String character_num= "",line_num="",line_info="", word_num = ""; // 
            int word_numb = -1;
            String arg;
            for (int i=0; i stop_list = get_stop(args);
                        int num_stop = get_stop_num(filename,stop_list);
                        word_numb -= num_stop;
                }
            }
            if(word_numb >=0){
                word_num = filename + ", :"+ word_numb +"\r
    "; } get_result(file_writer,character_num); get_result(file_writer,word_num); get_result(file_writer,line_num); get_result(file_writer,line_info); }

    六、設計プロセスのテスト


    無効な単語数のコードテストを取得するには、次の手順に従います。

     String str;
          int num_stop=0;
          while ((str = b_obj.readLine()) != null) {
              for (String s : str.split(" ")) {
                  for (String s1 : s.split(",")) {
                      if (s1.length() > 0 && stop_list.contains(s1)) {
                          num_stop++;
                      }
                  }
              }
          }
          return num_stop;

    フローチャートは次のとおりです.
    テストは次のとおりです.
    テスト
    入力
    予想出力
    じつしゅつりょく
    ABF
    EOF
    ABCF
    1
    0
    0
    ABCDF
    1
    0
    0
    ABCDEF
    1
    1
    1

    結果コードテストの取得:

     String character_num= "",line_num="",line_info="", word_num = ""; // 
            int word_numb = -1;
            String arg;
            for (int i=0; i stop_list = get_stop(args);
                        int num_stop = get_stop_num(filename,stop_list);
                        word_numb -= num_stop;
                }
            }
           

    フローチャートは次のとおりです.
    テストは次のとおりです.
    テスト
    入力
    予想出力
    じつしゅつりょく
    ABF
    0
    ABCG
    1
    1
    1
    ABDG
    1
    1
    1
    ABEG
    1
    1
    1
    ABFG
    1
    1
    1

    単語数を取得するコードテスト:

     int flag;
            int word_num = 0;
            boolean first_count = true;
            while((flag = b_obj.read()) != -1){
                if (first_count){
                    if(flag != ',' && flag != ' ' && flag != '
    ' && flag !='\r' && flag != '\t') word_num += 1; first_count = false; } if (flag == ',' || flag == ' ' || flag == '
    '||flag =='\r' || flag == '\t' ){ first_count = false; while((flag = b_obj.read()) != -1 ){ if (flag != ',' && flag != ' '&& flag != '
    ' && flag !='\r' && flag != '\t'){ word_num ++; break; } } } } return word_num;

    フローチャートは次のとおりです.
    テストは次のとおりです.
    テスト
    入力
    予想出力
    じつしゅつりょく
    ABH
    0
    ABCDH
    1
    1
    1
    ABCFH
    1
    0
    0
    ABCFEGH
    1
    0
    0
    ABCDCFEGH
    1
    1
    1

    参考文献

  • [1] http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
  • [2] http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
  • [3] http://blog.csdn.net/sunkun2013/article/details/13167099

  • 転載先:https://www.cnblogs.com/tangcz/p/8612122.html