項目地址git
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
.Estimate | 估計這個任務須要多少時間 | 2000 | |
Development | 開發 | ||
.Analysis | 需求分析 (包括學習新技術) | 220 | |
.Design Spec | 生成設計文檔 | 160 | |
.Design Review | 設計複審 (和同事審覈設計文檔) | 140 | |
.Coding Standard | 代碼規範 (爲目前的開發制定合適的規範) | 40 | |
.Design | 具體設計 | 400 | |
.Coding | 具體編碼 | 400 | |
.Code Review | 代碼複審 | 250 | |
. Test | 測試(自我測試,修改代碼,提交修改) | 220 | |
Reporting | 報告 | ||
.Test Report | 測試報告 | 200 | |
.Size Measurement | 計算工做量 | 30 | |
·Postmortem & Process Improvement Plan | 過後總結, 並提出過程改進計劃 | 50 | |
Sum | 合計 | 2110 |
在類的內部提供若干方法,屬性爲類內私有,調用者調用函數的時候輸入合法的參數便可。github
首先是對輸入文本的處理,將輸入的一個個單詞看成圖上的一個個點進行處理,採用鄰接矩陣來儲存邊與邊之間的距離,距離爲被指向單詞的長度。以後先對全部的單詞進行拓撲排序,排序後能夠知道這個圖是否是有環的(若是有環那麼排序後頂點的數量將少於圖自己點的數量),從而採用兩種不一樣的方法處理。若是圖是無環的,那麼就用動態規劃的算法來求出最長的路徑長度和路徑,若是要指定首字母,那麼就在選擇起點的時候選擇符合的首字母做爲起點;若是要指定尾字母,那麼就對找到的路徑從頭開始檢查,由於是無環的圖,因此當找到指定的尾字母后,至多還有其後面的單詞也爲一樣的尾字母,這樣就找到了符合要求的單詞鏈。若是圖是有環的,那麼就用DFS搜索每一個點做爲起點的最長路徑而後排序比較便可,若是指定首字母就選擇符合要求的起點;若是指定尾字母就看符合要求的尾字母的鏈那個最長便可。算法
-該圖爲自動生成的,和隊友的差很少編程
咱們小組開始沒有對搜索進行優化,因此說有時候進行了大量的無用搜索。咱們主要對這個拓撲排序進行了優化,減小了不少沒必要要的搜索。其次就是在處理-r參數時,咱們先判斷了圖,若是沒有環,仍然調用拓撲排序來作。這樣就減小了不少時間開銷。咱們這個改進大概總共花費了6個小時吧函數
優勢:保證了雙方的代碼質量
缺點:並非全部程序設計語言都有斷言機制。oop
沒有封裝成core接口,因此測試很差作。
TEST_METHOD(TestMethod1) { string xx = "test.txt"; ProcessNoRing p = ProcessNoRing(xx); p.init(); p.getWord(xx); Assert::AreEqual(2, p.wordNum); }
後續會改進性能
-輸入文件不存在單元測試
例如輸入111.txt,可是在這個目錄下沒有這個文件,會報錯:open file failed!!!學習
-輸入的單詞數量過多測試
例如輸入五百個以上不一樣的單詞的文件,會報錯:too many words!!!
-輸入了有環的指令但圖中沒有環
報錯:topologicalSort successed! 表示能夠拓撲排序,圖中無環
-輸入了無環的指令但圖中有環
報錯:topologicalSort failed! 表示不能夠拓撲排序,圖中有環
-輸入的首字母有除了字母以外的字符出現
報錯:illegimate input as first char X(表示錯誤的字符)
-輸入的尾字母有除了字母以外的字符出現
報錯:illegimate input as last char X(表示錯誤的字符)
-輸入的某個單詞自身首尾相同
不會報錯,不會自身成環
-輸入單個字母的單詞
不會報錯,視爲正常單詞
這個主要就是運用狀態機的知識來處理這個命令行參數。
主要函數有下面三個
void FirstState(char *argv[]); void SecondState(char *argv[]); void ThirdState(char *argv[]);
這個主要就是識別到-r進入第一個狀態,而後識別到-h或者-t進入第二個狀態,最後-w,-c進入第三個狀態。
在這個過程當中,咱們會把一些參數轉爲bool型變量。
void FirstState(char *argv[]) { if (strcmp(argv[ArgvCnt], "-w") == 0 || strcmp(argv[ArgvCnt], "-c") == 0) { process = strcmp(argv[ArgvCnt], "-w") == 0 ? 0 : 1; ArgvCnt++; ThirdState(argv); } else if (strcmp(argv[ArgvCnt], "-h") == 0 || strcmp(argv[ArgvCnt], "-t") == 0) { ProStart = strcmp(argv[ArgvCnt], "-h") == 0; ProEnd = strcmp(argv[ArgvCnt], "-t") == 0; ArgvCnt++; if (strlen(argv[ArgvCnt]) == 1 && isalpha(argv[ArgvCnt][0])) { StartWord = argv[ArgvCnt][0]; EndWord = argv[ArgvCnt][0]; ArgvCnt++; SecondState(argv); } else { ErrorPrint(argv); } } else { ErrorPrint(argv); } }
部分函數如上所示。
int EnalbleLoop; //是否容許單詞環 (0不容許,1容許) int process; //處理單詞的方式 (0爲單詞數量,1爲單詞字母數) int ProStart; //是否指定首字母(0不指定,1指定) char StartWord; //首字母 int ProEnd; //是否指定尾字母(0不指定,1指定) char EndWord; //尾字母 string fileName; //文件路徑
如上所示,這個界面模塊和計算模塊主要就是經過這幾個全局變量進行對接,命令行的參數已經徹底轉化爲咱們所需的參數,直接調用便可。
咱們結對編程大多時候就坐在一塊兒寫,偶爾經過QQ共享屏幕來一塊兒完成。在思考方面,主要是各自上網蒐集方法,我搜了無環的狀況,他搜了有環的狀況。而後他寫了命令行輸入的部分,我寫了處理輸入文件的部分,以後我完成了無環的部分,他完成了有環的部分,中間也一塊兒討論並告訴對方實現的原理。在結對的過程當中,咱們的確發現了對方編程時的bug,也統一了編程的風格,而且互相瞭解了對方完成模塊的實現過程。
結對編程的優勢:可讓兩我的互相監督對方,使得被監督者能被迫的專一,而且能夠及時發現被監督者的bug
結對編程的缺點:兩我的一塊兒幹一件事情,使得花費的時間變多,而且可能會閒聊。
-優勢1:開朗有熱情
-優勢2:隨和有耐心
-優勢3:踏實且認真
-缺點0:在時間規劃上過於理想
-優勢1:不懂就問積極上網查找方法
-優勢2:積極交流
-優勢3:勇敢的發現bug
-缺點0:喜歡拖沓,實現部分功能便跑去作其餘事情,不能一氣呵成
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
.Estimate | 估計這個任務須要多少時間 | 2000 | |
Development | 開發 | ||
.Analysis | 需求分析 (包括學習新技術) | 220 | 250 |
.Design Spec | 生成設計文檔 | 160 | 120 |
.Design Review | 設計複審 (和同事審覈設計文檔) | 140 | 120 |
.Coding Standard | 代碼規範 (爲目前的開發制定合適的規範) | 40 | 30 |
.Design | 具體設計 | 400 | 300 |
.Coding | 具體編碼 | 400 | 500 |
.Code Review | 代碼複審 | 250 | 200 |
. Test | 測試(自我測試,修改代碼,提交修改) | 220 | 260 |
Reporting | 報告 | ||
.Test Report | 測試報告 | 200 | 100 |
.Size Measurement | 計算工做量 | 30 | 20 |
·Postmortem & Process Improvement Plan | 過後總結, 並提出過程改進計劃 | 50 | 30 |
Sum | 合計 | 2110 | 1930 |