一、PSP表格
(2.1)在開始實現程序之前,在附錄提供PSP表格記錄下你估計將在程序的各個模塊的開發上耗費的時間。(3')
(2.2)在你實現完程序之后,在附錄提供的PSP表格記錄下你在程序的各個模塊的開發上實際花費的時間。(3')
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | ||
· Estimate | · 估計這個任務需要多少時間 | 30 | 30 |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 90 | 150 |
· Design Spec | · 生成設計文檔 | 0 | 0 |
· Design Review | · 設計復審 | 0 | 0 |
· Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 0 | 0 |
· Design | · 具體設計 | 30 | 60 |
· Coding | · 具體編碼 | 180 | 240 |
· Code Review | · 代碼復審 | 10 | 30 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 20 | 30 |
Reporting | 報告 | ||
· Test Repor | · 測試報告 | 20 | 20 |
· Size Measurement | · 計算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后總結, 並提出過程改進計划 | 5 | 5 |
· 合計 | 390 | 570 |
二、計算模塊接口
(3.1)計算模塊接口的設計與實現過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?說明你的算法的關鍵(不必列出源代碼),以及獨到之處。(18')
敏感詞類MGC://存儲輸入的敏感詞信息,按詞存儲
包括:敏感詞序號,敏感詞本身的字符串,長度(utf-8碼的長度,一個漢字占3個字節),敏感詞類型(中文|英文),敏感詞總數
行類HANG://存儲需要檢測的文本,按行存儲
包括:行序號,行本身的字符串;長度(同上),行總數
答案類ANS://將得到的結果按行存儲
包括:敏感詞序號,行序號,對應行的字段定位(便於輸出問題字段),答案總條數
檢測函數search://對敏感詞檢測,是程序的核心算法,也是難度最高,占用資源最多的部分
void search(MGC &M,HANG &H)//輸入對應的敏感詞和行,不破壞行和詞本身,檢測到敏感字段即存入答案類
{
int i = 0, j = 0, head;
if (M.k == 1)//敏感詞為漢字
{
//連續3個字節相同,則進行匹配;若敏感詞長度為n字節,則需匹配n/3次才算完成
for (; j < H.l; j++) if (H.s[j] == M.w[i]&& H.s[j+1] == M.w[i+1]&& H.s[j+2] == M.w[i+2])
{
if (i == 0) head = j;//第一次匹配時,對文章對應位置定位
i += 3;
j += 2;
if (i == M.l)//匹配完成,記錄信息,從當前位置繼續查找該敏感詞
{
i = 0;
Ans[Ans_num].mgc_num = M.num;
Ans[Ans_num].hang_num = H.num;
Ans[Ans_num].h = head;
Ans[Ans_num++].e = j;
}
}
}
else//敏感詞為英文
{
//不區分大小寫,相同則匹配;若敏感單詞長度為m字節,則匹配m次
for (; j < H.l; j++) if ((H.s[j] == M.w[i]) || (H.s[j] - M.w[i] == 32 && M.w[i] <= 'Z') || (M.w[i] - H.s[j] == 32 && M.w[i] >= 'a'))
{
if (i == 0) head = j;
i++;
if (i == M.l)//匹配完成,記錄信息,從當前位置繼續查找該敏感詞
{
i = 0;
Ans[Ans_num].mgc_num = M.num;
Ans[Ans_num].hang_num = H.num;
Ans[Ans_num].h = head;
Ans[Ans_num++].e = j;
}
}
}
}
輸出函數ANS_print: //輸出優先級:將答案類ANS輸出到指定路徑,行序號優先;同行時按敏感詞序號優先;對於行號和詞號一致的語句,看兩者在對應行的出現順序
思路:
分別讀入敏感詞文件f1、待檢測文本f2,存儲到對應的類中;
檢測函數search:我的做法是將字符串的ASCII碼與敏感詞的ASCII碼進行匹配(雖然能很快查找到正常情況下的敏感字段,但對同音字和拆邊旁的情況存在很大的困難)能找到多少找多少,存入對應的類中
最后由對應的函數將結果輸出
流程圖:
(3.2)計算模塊接口部分的性能改進。記錄在改進計算模塊性能上所花費的時間,描述你改進的思路,並展示一張性能分析圖(由VS 2019、JProfiler或者Jetbrains系列IDE自帶的Profiler的性能分析工具自動生成),並展示你程序中消耗最大的函數。(12')
以上是用范例測試后得到的結果,其中檢測函數search占了40%以上的cpu時間,占比最大;另外輸入數據的處理也要花費不少的cpu時間;
結果與預想差不多,畢竟整個程序的核心算法就是敏感詞的檢測函數search,並且按我的算法,search的時間復雜度與(敏感詞數*文本行數)成正比,當樣例的敏感詞數增加時,search消耗的cpu占比或許再度增加;
雖然占比較高,但實質消耗的時間相對合理,也沒有改進的思路,故沒對其進行改進;
(3.3)計算模塊部分單元測試展示。展示出項目部分單元測試代碼,並說明測試的函數,構造測試數據的思路。並將單元測試得到的測試覆蓋率截圖,發表在博客中。(12')
測試1:(即作業給出的范例)
輸入對應的3個地址:
我輸出的答案:
示例給出的答案:
(我只找出了400個,主要是目前的進展對同音字和邊旁還不能很好的解決)
測試2:分別給出(敏感詞a,文章b, 答案c)
測試3:分別給出(敏感詞a,文章b, 答案c)
(3.4)計算模塊部分異常處理說明。在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發布在博客中,並指明錯誤對應的場景。(6')
//讀入敏感詞文件f1,並放入敏感詞類的數組(Mgc[])中
cin >> dz;
ifstream f1(dz);
if (!f1) cout << "open error!" << endl;
。。。。。
當讀入文件出現問題時,輸出
open error!
例如:
當輸入正確的路徑時,不會報錯:
三、心得
(4.1)在完成本次作業過程的心得體會(3')
開發思路及遇到的困難:
1.用c++讀寫文件時遇到困難,學習了fstream等知識,掌握基本的讀寫文件流;
2.用DevC++和VS測試txt文件的讀寫功能時,發現中文的亂碼現象;經學習和查閱資料,問題在於txt文件默認用utf-8編碼,而Windows控制台默認用ANSI(GBK)編碼,故控制台會出現中文的亂碼,雖不影響該次作業生成的txt文件結果,但給開發、測試及維護過程造成了許多的不方便;
解決方法:將VS設置成utf-8編碼,並且在main函數開始處加入語句:system("chcp 65001"),語句功能為將控制台修改為utf-8編碼;使程序全程使用utf-8編碼,便於編寫和維護;
3.對程序進行測試,測試過程中遇到輸入的路徑打不開的現象,發現路徑中包含了中文,改為英文后此問題便沒再發生
總結:學了許多知識,但離完全攻下此題還有很大的差距,還要再努力呀