Gitのアドレス | https://github.com/isliudong/WordCount |
---|---|
学生に結び目作業アドレス | < コンパニオンのブログ > |
学校の生徒のジャンクション数 | 201731062214 |
個人ブログのアドレス | https://www.cnblogs.com/liudong123/ |
運用要件 | < 運用要件 > |
まず、ペアリングプロセス(写真)
二、PSP用フォーム
PSP2.1 | パーソナルソフトウェアプロセス段階 | それがかかると予想される(分) | 実際の時間がかかる(分) |
---|---|---|---|
プランニング | 計画 | 30 | 20 |
推計 | どのくらいこのタスクを推定 | 30 | 20 |
開発 | 開発(要件分析 - 特定の符号化) | 400 | 450 |
分析 | (新しい技術を学ぶ含む)の要件分析 | 200 | 200 |
デザインスペック | 設計ドキュメントの生成 | 20 | 30 |
デザインレビュー | デザインレビュー(文書を設計する監査および学生) | 30 | 40 |
標準コーディング | コード仕様(現在の開発のための規範) | 20 | 15 |
設計 | 具体的な設計 | 60 | 80 |
コーディング | 具体的なコーディング | 200 | 200 |
コードレビュー | コードレビュー | 60 | 60 |
テスト | 検査(セルフテスト、コードを変更し、コードが送信) | 120 | 120 |
報告 | レポート | 80 | 60 |
試験報告書 | テストレポート | 45 | 40 |
サイズ測定 | コンピューティングのワークロード | 20 | 25 |
死後&プロセス改善計画 | その後まとめ、およびプロセス改善計画 | 20 | 15 |
トータル | トータル | 1335 | 1375 |
第三に、基本的な問題解決のためのアイデア
1.おそらく需要を見たとき、我々はこの記事を参照すると、WORDCOUNTはTXT文書の内容の一部をカウントするために使用される同様のプログラムです。
2.プロセスは、テキストを読む必要があり、その後、正規表現の配列に分割し、分割し、次にブログのアドレスジョブ仕様によれば、アレイ内の要素のすべての要件に応じて設定され、一つ一つの機能を実現します
3.フォローアップは、いくつかの機能を実現するために先にインターフェイスの滞在するいくつかの新しい機能を実装することができる追加することも考慮に入れると
まず、確立されたコマンドラインプログラム、次に遷移は、オブジェクト指向プログラミングをします
第四に、プログラム設計(詳細)
我々は最初の実現にならなければなら後に、コマンドラインによると、私たちはデカップリングオブジェクト指向プログラミングを実装するコードだけでなく、コードを再構築しようとする、この実験は、大きく以下の統計的性質のいくつかの機能があり、その後、単語数、行の統計カウント
だけでなく、それぞれを:その回数は言葉が設計されたいくつかのカテゴリ表示された
実行(Do)クラス:
比較の種類を:
プログラムのカテゴリ:
カテゴリをお読みください。
テキストカテゴリ:
类書きます:
- ロジックプロセス設計
- インターフェースパッケージデザイン
二つの追加機能やデザインのカスタムコマンドラインパラメータ
カスタムコマンドライン
コマンドラインエントリCMD文字列引数の配列では、プログラムのメイン関数main(文字列[]引数)に格納されます。プログラムの実行順序に影響を与えることなく、入力パラメータの順序を保証するために、分岐文を使用すると決定したパラメータを保存します。それは、入力および出力のための空のパス、エラーを防止するためのユーザ入力か否かが判断されます。対象者の要件に合わせて- iと-oパラメータは、-mと-nの組み合わせでなければなりませんが、3例がありますので、改めて判断する文を分岐します。//对-l、-m、-n、-o参数识别并保存他们后面的输入值 for(int i=0;i<args.Length;i++) { if (args[i] == "-l")//路径参数 { path = args[i + 1]; i++; } else if (args[i] == "-m")//参数设定统计的词组长度 { wordlength = int.Parse(args[i+1]); i++; } else if (args[i] == "-n")//参数设定输出的单词数量 { outnum = int.Parse(args[i + 1]); i++; } else if (args[i] == "-o")//参数设定生成文件的存储路径 { outpath = args[i + 1]; i++; } }
対応するパラメータに応じて、フレーズ(-m)を生成する
Iアレイに単語の組み合わせを達成するためにループをネストし、新たな文字列が配列に格納されています。新しく生成されたフレーズの一致。ただ、見つける必要があり、文書内の単語の数を、コマンドラインパラメータは、-m、回数外側のループ数学的関係は、外側のループは数表し世代は、国境を越えたが、そこではありません停止することを意味どのように多くのフレーズを、それが内側のループを表し、フレーズに単語の組み合わせによっても計算するループに数回を必要とするサイクル数と-mパラメータの関係数学的関係を。//嵌套循环生成词组 words[0] = word[1]; for(int i=0;i<word.Length-wordlenth;i++) { for (int j = i; j <= i+wordlenth-1; j++) { words[i] = words[i] + " "+word[j]; } }
高周波出力パラメータの数(-n)倍に応じて
、我々は統計的な周波数ワードがフラットと表示され設計された比較サブクラスキーワード辞書やソート周波数仕分けのデュアル実装方式このほかのデザインなので、時間を-n -nパラメーターは、サブクラスのメソッドを達成することができ渡す必要があります。前のフレームの設計が重要な役割を果たしてきた中で、ここで言うことができます。//单词比较算法 public int compare(String str1, String str2) { int length1 = str1.Length; int length2 = str2.Length; int limit = Math.Min(length1, length2); char[] a = str1.ToCharArray(); char[] b = str2.ToCharArray(); for (int i = 0; i < limit; i++) { char c1 = (char)(a[i] >= 'a' ? a[i] : (a[i] + 32)); char c2 = (char)(b[i] >= 'a' ? b[i] : (b[i] + 32)); if (c1 != c2) { return c1 - c2; } } return length1 - length2; }
V.コードの仕様
命名時に=」意味のある名前を使用します
=「中国名の使用を禁止します
=「変数の命名法を採用こぶ
=「いくつかの複雑な機能やコードに加え、詳細な注意事項について
=「インデント改行モードなので、コードがきちんと仕様を探します
第六に、コードのピアレビュー
1.コードレビューは、我々はいくつかの名前が名前の要件に従って存在していないことがわかったので、我々は名前を修正した場合
2.機能は、我々はいくつかの小さな細部を見つけ実現し、それは数の最終カウントで、その結果、実際の数よりも多くの単語入力として空白文字されていない場合は、私は裁判官の一部、ほとんど変化を再設計されたこの場所を置きます条件
3.(面白い)があり、修復するための時間を持っていなかったいくつかの小さなバグがありますが、実際の動作には影響しません。
七、ユニットテストと例外処理
ユニットテスト:
(Compare.compareを())と比較する単語辞書比較演算子:
public class CompareTests { [TestMethod()] public void compareTest() { Compare compare = new Compare(); String[] word1 = { "as", "ae", "th", "cpig" }; String[] word2 = { "we", "are", "the", "pig" }; int t; bool k=false; for (int i = 0; i < 4; i++) { t = compare.compare(word1[i], word2[i]); if (t < 0) { k = true; } Assert.AreEqual(true,k ); } } }
テスト結果:
混合テストの文字をコピーします
テストテキスト
テストは成功です
例外処理:
ファイルの読み取りテストで
テストコードの設計:
public void ReadTextTest() { Read read = new Read(); read.ReadText("D:\a.txt", 1); for(int i=0;i<read.word.Length;i++) { Assert.AreNotEqual("", read.word[i]); } //Assert.Fail(); }
実行時エラー:
単語= Regex.Splitにあることが判明(、sr.ReadToEnd()@「\ W +」);コードの問題、正規表現によって分割関数は空の単語列があり、最初から最後までケースを分割します。
非空の配列は、図1に示す問題を解決するために、格納されたハッシュテーブルによって決定された場合。
ドキュメント・ライト・ファイル・パスは、例外処理が存在します:
コードのデザイン:
FileStream fileStream1 = new FileStream(l, FileMode.OpenOrCreate, FileAccess.ReadWrite); fileStream1.Close();//如果文件不存在会自动在该路径下创建写入文件
テストの経験:
例外処理の設計のために共有したいいくつかのポイントです:
1、2、一部の機能が呼び出され、機能テストは失敗したが、呼び出し側は、関数内で処理されることも可能です。
八、テストおよびパフォーマンスの向上
改善された支出時間:25mins
パフォーマンステスト:
パフォーマンス分析機能:
メインは、3つの部分のパフォーマンスに食べハッシュテーブル、手紙、比較や読書キャラクターを作成することです
改善点:
ナイン、プログラムコードの結果のスクリーンショットを示しています
メイン:
public static void Main(string[] args) { int wordlength=1; int outnum=0; string outpath="/"; string path=null; for(int i=0;i<args.Length;i++) { if (args[i] == "-i")//路径参数 { path = args[i + 1]; i++; } else if (args[i] == "-m")//参数设定统计的词组长度 { wordlength = int.Parse(args[i+1]); i++; } else if (args[i] == "-n")//参数设定输出的单词数量 { outnum = int.Parse(args[i + 1]); i++; } else if (args[i] == "-o")//参数设定生成文件的存储路径 { outpath = args[i + 1]; i++; } } new Do().doing(path, wordlength, outnum, outpath); }
READTEXT:
public String ReadText(String path,int wordlenth) { StreamReader sr = new StreamReader(path, Encoding.Default); while(sr.Read()!=-1) { sum++; } row= sr.ReadToEnd().Split('\n').Length; sr.BaseStream.Seek(0, SeekOrigin.Begin);//重置流指针 row = sr.ReadToEnd().Split('\n').Length;//行数统计 sr.BaseStream.Seek(0, SeekOrigin.Begin); word = Regex.Split(sr.ReadToEnd(), @"\W+");// words = new string[word.Length-wordlenth]; words[0] = word[1]; for(int i=0;i<word.Length-wordlenth;i++) { for (int j = i; j <= i+wordlenth-1; j++) { words[i] = words[i] + " "+word[j]; } } sr.BaseStream.Seek(0, SeekOrigin.Begin);//重置流指针 return sr.ReadToEnd(); }
ファイルへの書き込み:
using (StreamWriter sw = new StreamWriter(outpath)) { sw.WriteLine("单词数:" + count);//单词数 sw.WriteLine("字符数:" + zifushu); sw.WriteLine("行数:" + hangshu); sw.WriteLine("词汇量:" + cihui); sw.WriteLine("词组频统计(词频优先字典序):"); for (int i = 0; i < wd.Length; i++) { sw.WriteLine(wd[i] + ": " + hashtable[wd[i]]); } sw.Close(); Console.ReadLine(); }
ハッシュテーブルへのフレーズ:
for (int i = 0; i < read.words.Length; i++) { if (hashtable.ContainsKey(read.words[i])) { geshu = (int)hashtable[read.words[i]]; geshu++; hashtable[read.words[i]] = geshu; } else { if (read.words[i] != "")//取出split产生的空字符 hashtable.Add(read.words[i], times[i]); } }
結果を実行するためのコマンドライン:
テン、経験の概要
结对编程让我实际体会了1+1>2的效果,在一些时间很短的小项目上,结对编程的效率是远远大于单人开发的,当我们在某个具体代码实现的地方出现问题时,两个人解决问题的速度快于一个人,在我的伙伴实际编码的过程中,我会给他提出一些意见,在一个就是可以确定编码思路方向,另一个人只管实现就可以了,而且结对编程的过程中,每个代码就相当于看了两遍,这样出错的可能性大大减小。总的来说结对编程在敏捷这种思想下,是可行的。