項目 | 內容 |
---|---|
做業所屬課程 | 軟件工程-羅傑 |
做業要求 | 結對項目 |
項目地址 | 最長單詞鏈 |
項目地址git
PSP2.1 | Person Software Process Stages | 預計耗時(min) | 實際耗時(min) |
---|---|---|---|
Planning | 計劃 | 1900 | |
· Estimate | · 估計這個任務須要多少時間 | 1900 | |
Development | 開發 | 1600 | |
· Analysis | · 需求分析 (包括學習新技術) | 300 | |
· Design Spec | · 生成設計文檔 | 100 | |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 30 | |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 30 | |
· Design | · 具體設計 | 180 | |
· Coding | · 具體編碼 | 600 | |
· Code Review | · 代碼複審 | 180 | |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180 | |
Reporting | 報告 | 300 | |
· Test Report | · 測試報告 | 180 | |
· Size Measurement | · 計算工做量 | 60 | |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 60 | |
合計 | 1900 |
Information Hiding(信息隱藏)即限制其餘模塊對本模塊內包含信息的訪問,使得該模塊的內部結構和信息,對於外部是不可見的,從而實現信息隱藏。
Interface Design(接口設計)接口是使不一樣模塊之間相鏈接的部分,各模塊之間經過接口實現交流和訪問。
Loose Coupling(鬆耦合)模塊間的耦合度是指模塊之間的依賴關係,鬆耦合能夠實現依賴最小化,使模塊更靈活。github
計算模塊一個Core類,提供四個接口方法
1.int static gen_chain_word(char* words[], int len, char* result[], char head, char tail,2. bool enable_loop);
2.int static gen_chain_char(char* words[], int len, char* result[], char head, char tail, bool enable_loop);
3.bool static has_circle(char words[], int len);
4.int static readfile(char path, char words[]);
第一和第二個接口尋找符合要求的最長路徑,第三個接口判斷字符串數組是否有環,有環返回true,無環返回false,第四個接口讀取文件並返回字符串數組。
以上四個接口調用了3個私有函數:
1.int LONG(WORD wod, int len, char *result[], int H, int T, char _h, char _t, int mark);
2.int nocircle(WORD words[], int len);
3.int in_array(char arr, int len, char cc);
typedef struct struct1 {
char h;
char t;
char word;
}Word, *WORD;
LONG函數第一個參數是字符串數組轉化爲自定義結構體數組,第二個參數是結構體數組大小,H爲1,表明有-h參數,爲0,表明無-h參數,T參數同理;_h表明首字母,_t表明尾字母,且僅僅當其爲'a'-'z'時才起做用,不然報錯,mark爲0標記求最長單詞數,爲1標記求最多字符數。
nocircle傳入字符數組,及長度,如有環返回0,不然返回1
in_array尋找字符cc在字符數組arr中的下表,若找到,返回下標,不然返回-1。算法
單元測試部分代碼以下:編程
int len1 = 10, len2 = 11; char *list1[10] = {"app","pdfcde","hefarry","yakorm","morning","ed","dail","left","pd","dot" }; char *list2[11] = { "app","pdfcde","pd","die","early","ear","yet","tail","rabbittall","tab","leaf" }; TEST_METHOD(TestMethod1) { // TODO: 在此輸入測試代碼 int ans_len = 5; char *ans[5] = { "app","pdfcde","ed","dail","left" }; char *result[5]; int len = 0; len = Core::gen_chain_word(list1, len1, result, '\0', '\0', false); Assert::AreEqual(len, ans_len); Assert::AreEqual(strcmp(longchar(result, len), longchar(ans, ans_len)), 0); Assert::IsFalse(Core::has_circle(list1,len1)); } TEST_METHOD(TestMethod6) { int ans_len = 3; char *ans[3] = { "hefarry","yakorm","morning" }; char *result[3]; int len = 0; len = Core::gen_chain_char(list1, len1, result, '\0', '\0', false); Assert::AreEqual(len, ans_len); Assert::AreEqual(strcmp(longchar(result, len), longchar(ans, ans_len)), 0); Assert::IsFalse(Core::has_circle(list1, len1)); }
測試的思路是在測試模塊中list裏保存全部的單詞,用result存輸出的結果,調用core計算模塊中gen_chain_word和gen_chain_char接口,將返回值存入len中,最後把返回到result中的結果和預期的ans進行比對。針對每個接口,經過-h、-t、-r參數的組合來編造相應的測試用例。數組
咱們分析到的異常有單詞的格式錯誤,好比單詞內出現非法字符;當沒有-r參數時,單詞表內存在單詞環;參數賦值出現異常,好比h和t參數的賦值傳入非英文字符;單詞表內全部單詞沒法構成單詞鏈以及單詞表爲空時的異常處理。app
cout << "Error: "; switch (n) { case 1: cout << "wrong format after -h!"; break; case 2: cout << "wrong format after -t!"; break; case 3: cout << "wrong format in argvs!"; break; case 4: cout << "file doesn't exsits!"; break; case 5: cout << "error when read file!"; break; case 6: cout << "There exists circle(s),check words again!"; break; case 7: cout << "error when write data!"; break; case 8: cout << "number of words larger than 10000!"; break; case 9: cout << "number of words larger than 100!"; break; default:break; } exit(0); 1 wrong format after -h! 2 wrong format after -t! 3 wrong format in argvs! 4 file doesn't exsits! 5 error when read file! 6 There exists circle(s),check words again! 7 error when write data! 8 number of words larger than 10000! 9 number of words larger than 100!
根據命令行地址參數,讀取文件信息,轉化爲字符串數組。根據字符串數組構造出自定一的結構體數組。首先判斷字符串nocicle()函數判斷是否能成環,若能成環且命令行不含-r參數,則報錯,不然,進入LONG()函數尋找符合要求的最長單詞鏈。
nocicle函數的具體實現思想:先將首尾字母相同的字符串剔除,對剩下的字符串數組進行判斷,記錄下26個字母做爲剩下字符串數組的首尾字母出現的次數(並去除從未在首尾部出現過的字母),若某一字母在剩下的字符串的首部出現次數爲0或者尾部出現次數爲0,則將該字母來源的字符串從字符串數組中剔除,將該字母從字母數組中剔除,重複操做,知道字符串數組無變化;根據這個方法,能夠想象每次剔除鏈端字符串及其離環或者鏈中心最遠一端的字母,知道最後無鏈端存在,若存在環,則最後字符串數組大小大於0,不然爲0。
LONG函數具體實現思想:2626n的數組存字符串(n表示有多少個字符串對應首字母相同,尾字母相同),[x][y][z]爲下標,x爲首部字母減去'a',y爲尾字母減去‘a’,z根據字符串長度由大到小排序,從橫縱座標最大的[x][y]開始訪問,每次訪問[x][y][top],top從小到大,訪問一次[x][y],top就+1,left[x][y]-1,不然top-1,left[x][y]-1,其中left[..][..]記錄對應下標還能訪問的剩下字符串個數,保證每次訪問剩下的首尾字母相同的字符串時訪問長度最長的那個;而後訪問[y][..]那一行,從右往左,訪問left[..][..]大於0的top位字符串,依次下去知道left[y][..]都爲0,一個長鏈結束。接着回退到父節點的[x][<y],訪問最近的left[x][<y]大於0的top位字符串,若left[x][<y]都等於0,則再次回退到祖父節點的left[<.][<.],依次下去訪問,直到left[.][<.]不爲0,繼續訪問其後繼節點,造成新的長鏈。ide
在結對編程前,咱們先一塊兒閱讀分析題目要求,預估了做業的難度,而後對實現所用的算法進行探討。在編程過程當中,一個駕駛員,一個領航員,他負責代碼的編寫和實現,我主要負責編寫測試數據,幫助測試和糾正。當遇到瓶頸時,一塊兒線上或線下交流討論。
兩人討論照片以下:
函數
結對編程的優勢:兩人結對,互相督促,減小懈怠;在遇到問題時,相互交流,一塊兒討論,有利於找到更好的解決方法,發掘更好的思路;結對編程能夠保證代碼質量更高。
結對編程的缺點:要求兩人有共同的時間和空間坐下來一塊兒工做;當想法或思路不一樣時,容易產生分歧,不利於效率的提高。
本人的優缺點:交流相對主動,比較細心謹慎,態度誠懇;編程能力弱
隊友的優缺點:動手編程能力強,算法掌握得熟練,作事效率高;更喜歡獨立做業,交流不夠主動。oop
PSP2.1 | Person Software Process Stages | 預計耗時(min) | 實際耗時(min) |
---|---|---|---|
Planning | 計劃 | 1900 | 2070 |
· Estimate | · 估計這個任務須要多少時間 | 1900 | 2070 |
Development | 開發 | 1600 | 1920 |
· Analysis | · 需求分析 (包括學習新技術) | 300 | 420 |
· Design Spec | · 生成設計文檔 | 100 | 100 |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 30 | 30 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 30 | 30 |
· Design | · 具體設計 | 180 | 200 |
· Coding | · 具體編碼 | 600 | 720 |
· Code Review | · 代碼複審 | 180 | 180 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 180 | 240 |
Reporting | 報告 | 300 | 150 |
· Test Report | · 測試報告 | 180 | 60 |
· Size Measurement | · 計算工做量 | 60 | 60 |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 60 | 30 |
合計 | 1900 | 2070 |