非不認真,非不努力,奈什麼時候間所剩無幾,未能提交最完美的做業git
https://github.com/awfsgdf/coyg
雖然咱們GitHub項目的tag提交時間很晚,但實際上咱們很早就開始寫代碼了,只是沒有注意到做業要求github
Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|
計劃 | 60 | 60 |
· 估計這個任務須要多少時間 | 60 | 60 |
開發 | 1400 | 1810 |
· 需求分析 (包括學習新技術) | 120 | 60 |
· 生成設計文檔 | 120 | 30 |
· 設計複審 (和同事審覈設計文檔) | 60 | 30 |
· 代碼規範 (爲目前的開發制定合適的規範) | 20 | 10 |
· 具體設計 | 120 | 240 |
· 具體編碼 | 720 | 1080 |
· 代碼複審 | 120 | 60 |
· 測試(自我測試,修改代碼,提交修改) | 120 | 300 |
報告 | 180 | 180 |
· 測試報告 | 60 | 60 |
· 計算工做量 | 60 | 60 |
· 過後總結, 並提出過程改進計劃 | 60 | 60 |
合計 | 1640 | 2050 |
咱們應用了信息隱藏:設置類的private參數;接口設計:儘可能知足能夠在任何環境調用;鬆耦合:因爲GUI沒有作出來因此沒有實現。編程
先把以a-z開頭的單詞分別存在26個向量中,把以a-z結尾的單詞分別存在26個向量中,以這52個向量來保存圖的信息,而後根據圖的信息和輸入的參數計算出能夠做爲遍歷開始的點的集合,而後依次以這個集合裏的點做爲DFS的起點,進行深度優先搜索,找出最長單詞鏈。其中有些細節這裏再也不詳述,代碼註釋寫的比較清楚。數組
在沒有環的圖中,因爲圖的結構比較簡單,我認爲爆搜所有路徑是一種奢侈,因而採用了相似剪枝的方法,省去了大量確定得不到最長路徑的遍歷,運行時間比較短。在有環的途中,無奈本人學藝不精,找不到更高效的方法,只能DFS爆搜,可是我發現個人爆搜過程嚴重超時,通過查找資料和分析代碼,我發現個人DFS的問題在於它傳入的無用的參數太多了,因而我把一些變量設置爲類變量,再也不做爲參數傳入,只是在調用尋找最長鏈的函數中聲明一個類對象,這樣修改以後跑同一份代碼的時間居然縮短爲原來的十分之一(從十分鐘縮短到到一分鐘)。由此我瞭解到,函數傳入的參數過多確實會嚴重影響運行效率。下圖爲改進以後的DFS函數爆搜100個點帶環圖最長單詞鏈的性能分析圖。函數
優勢是在編譯的時候就能夠檢查程序的正確性,並且經過這種方法保證了程序的正確性;缺點是無法自由地控制契約是否生效,並且對於存在大量輸入輸出的函數會拖慢運行速度。
咱們應用的方法是對每一個模塊都作正確性測試,以提高整個工程的正確性。oop
單元測試獲得的測試覆蓋率截圖以下所示
(注:此部分覆蓋截圖和測試樣例代碼由個人隊友提供)
性能
char* input[4] = { (char*)"END", (char*)"OF", (char*)"THE", (char*)"WORLD" }; char* result[4] = { 0 }; gen_chain_word(input, 4, result, 0, 0, false); char* input1[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox",(char*) "Dog", (char*)"Moon", (char*)"Leaf",(char*)"Trick",(char*) "Pseudopseudohypoparathyroidism" }; char* result1[11] = { 0 }; gen_chain_word(input1, 11, result1, 0, 0, false); char* input2[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result2[11] = { 0 }; gen_chain_char(input2, 11, result2, 0, 0, false); char* input3[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result3[5] = { 0 }; gen_chain_word(input3, 5, result3, 0, 0, true); char* input4[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result4[5] = { 0 }; gen_chain_char(input4, 5, result4, 0, 0, true); char* input5[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result5[11] = { 0 }; gen_chain_word(input5, 11, result5, 'a', 0, false); char* input6[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result6[11] = { 0 }; int len = gen_chain_char(input6, 11, result6, 'a', 0, false); char* input7[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result7[11] = { 0 }; gen_chain_word(input7, 11, result7, 0, 'n', false); char* input8[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result8[11] = { 0 }; gen_chain_char(input8, 11, result8, 0, 'n', false); char* input9[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result9[5] = { 0 }; gen_chain_word(input9, 5, result9, 't', 0, true); char* input10[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result10[5] = { 0 }; gen_chain_char(input10, 5, result10, 't', 0, true); char* input11[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result11[5] = { 0 }; gen_chain_word(input11, 5, result11, 0, 'n', true); char* input12[5] = { (char*)"Element", (char*)"heaven", (char*)"Table",(char*) "Teach", (char*)"Talk" }; char* result12[5] = { 0 }; gen_chain_word(input12, 5, result12, 0, 'n', true); char* input13[5] = { (char*)"aa", (char*)"aaa", (char*)"aaaa", (char*)"aaaaa", (char*)"a" }; char* result13[5] = { 0 }; gen_chain_word(input13, 5, result13, 0, 0, true);*/ char* input14[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result14[11] = { 0 }; gen_chain_word(input14, 11, result14, 'a', 'k', false); char* input15[11] = { (char*)"Algebra", (char*)"Apple", (char*)"Zoo", (char*)"Elephant", (char*)"Under", (char*)"Fox", (char*)"Dog",(char*) "Moon",(char*) "Leaf",(char*)"Trick", (char*)"Pseudopseudohypoparathyroidism" }; char* result15[11] = { 0 }; gen_chain_word(input15, 11, result15, 's', 's', false);
異常處理函數 | 功能 | 異常樣例 |
---|---|---|
void check_h_and_t(char head, char tail, bool have_head, bool have_tail); | 檢查是否存在head開頭和tail結尾的單詞 | 輸入的單詞列表爲{"hello", "world" , "yes"},而命令行窗口輸入的參數包含-h a -t b |
void check_file(); | 檢查輸入單詞文件的路徑是否正確 | 輸入的文件路徑錯誤或者沒有路徑指定文件 |
void check_loop(bool enable_loop, int size); | 檢查輸入的單詞列表有無環是否和-r參數匹配 | 輸入的單詞列表爲{"hello", "olleh", "yes"},而命令行窗口輸入的參數不包含-r |
void check_null(char *word); | 檢查傳入的char *word[]裏是否有空指針 | 輸入的單詞列表char *[]在下標0到下標len-1這些元素之間有空指針 |
void check_char(int i); | 檢查傳入的單詞列表裏是否都是英文單詞 | 輸入的單詞列表爲{"h3llo","w0rld", "yes"} |
void check_void(int len); | 輸入的單詞列表的單詞數量是否小於2 | 輸入的單詞列表爲{"hello"} |
void check_2(); | 檢查搜索到的單詞鏈的單詞數量是否小於2 | 搜索到的單詞鏈爲{"hello"} |
void check_same(); | 檢查輸入的單詞列表中是否有重複的單詞 | 輸入的單詞列表爲{"hello", "hello"} |
int find_arg(int argc, char *argv[], arg &w, arg &c, arg &h, arg &t, arg &r, char &head, char &tail); | 檢查傳入的參數組合是否出錯,若是出錯,以int形式返回錯誤的類型以便分狀況報錯 | 輸入的參數不包含-w且不包含-c,返回int類型數據4 |
參數的定義和做業要求一致,當參數輸入不符合邏輯時會報相應錯誤,例如-w和-c同時出現,-w和-c同時未出現,-h參數錯誤,-t參數錯誤,源文件不存在等等。單元測試
如下是命令行運行.exe文件的截圖。
學習
結對不是一個容易的過程,因爲種種緣由,我和隊友沒有很長的時間能夠結對編程,所以程序的代碼部分是我一人編寫,只是在最後兩天編寫測試用例、對接GUI的時候咱們一塊兒結對編程了一段時間,可是因爲除了編寫代碼以外的後續工做開展的太晚致使咱們最終提交的項目並不完美,可是我已經對本身滿意。在寫此次做業的過程當中,我既體會到了單人爆肝的辛苦,也體會到告終對編程的樂趣,能夠說作此次做業的過程是一種歷練。
測試
結對編程的優勢:
1)能夠互相督促,不會縱容某一方拖延
2)一邊寫代碼一邊有人監督不易出錯
3)兩我的能夠常常交流,分享知識。
結對編程的缺點:
1)可能仍是會讓人不太適應吧。
個人優勢:
1)比較認真
2)比較刻苦
3)比較愛學習
個人缺點:
1)沒有給予隊友足夠幫助
個人結對對象優勢:
1)比較刻苦
2)作事比較有條例
3)求知慾比較強
個人結對對象缺點:
比較不守時,沒有按時完成任務。
表格見上文。