第一次個人編程作業


github鏈接

一、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.對程序進行測試,測試過程中遇到輸入的路徑打不開的現象,發現路徑中包含了中文,改為英文后此問題便沒再發生

總結:學了許多知識,但離完全攻下此題還有很大的差距,還要再努力呀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM