作業二

格外后悔發表於2024-03-13
作業所屬課程 軟工2024
作業要求 查重率
作業目標 積累專案經驗。體驗專案製作流程。練習計算機語法。

github連結:https://github.com/jiongand/-jiongand/tree/main/3122004482/3122004482/x64/Release

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 10 15
Estimate 估計這個任務需要多少時間 5 5
Development 開發 25 34
Analysis 需求分析 (包括學習新技術) 50 120
Design Spec 生成設計文件 5 5
Design Review 設計複審 15 15
Coding Standard 程式碼規範 (為目前的開發制定合適的規範) 5 5
Design 具體設計 15 15
Coding 具體編碼 60 90
Code Review 程式碼複審 20 34
Test 測試(自我測試,修改程式碼,提交修改) 56 66
Reporting 報告 5 5
Test Repor 測試報告 5 5
Size Measurement 計算工作量 5 5
Postmortem & Process Improvement Plan 事後總結, 並提出過程改進計劃 10 20
合計 291 439

實現過程

本次專案選取語言為c++。

此次專案需求為對兩篇文章進行查重,因此採取的查重率演算法為:查重率 = 重複字個數/檢測目標文章字數。

那麼,就自然而然的產生了兩個屬性:重複字數和目標文章字數。

又因為文章從檔案讀取,則需要實現處理檔案的函式。

查重部分,我選擇先將原文章載入unordered_map<char,int>,並記錄對應字出現個數。然後再讀取要檢測的文章,比對unordered_map內容時,記錄其重複字數和總字數,最後將查重率寫入目標文件。

於是所設計的類的原始碼如下:

class Check
{
	int same;//重複字個數
	std::unordered_map<char,int> g;
	int total;//總字數
	void load(const char* a);//將原文載入雜湊表
	void find(const char* a);//把目標文章與原文章進行比對
public:
	Check();~Check();
	bool check(const char* f, const char* c, const char* a);//處理輸入的檔案路徑,進行檔案流操作	
};

效能改進

p
可見佔用率最大的為unordered_map迭代器的呼叫。

本人能力有限,不知該如何改進。

消耗最大的函式:
q

單元測試

-測試一:
原文件為老師提供文件orig.txt,被測試文件為orig_0.8_del.txt
結果:
pp

-測試二:
被測試文件為空文件
tt
結果:
cc

異常處理

從命令列輸入的引數不足或過多時,輸出錯誤原因並退出程式。

if (argc != 4) {
		std::cout << "輸入不足或過多"<<std::endl;
		return -1;
	}

當檔案流開啟操作失敗時,輸出原因並退出程式

if (!(sample.is_open() && target.is_open() && answer.is_open())) {
		std::cout << "檔案開啟失敗。" << std::endl;
		sample.close();
		target.close();
		answer.close();
		return false;
	}

當被檢測文章字數為0時,輸出原因並退出程式

if (total == 0) {
		sample.close();
		target.close();
		answer.close();
		std::cout << "被測試文章無內容"<<std::endl;
		return false;
	}

記憶體溢位時,輸出原因並退出程式

s = new char[512];
		if (s == nullptr) {
			std::cout << "記憶體溢位。" << std::endl;
			return false;
		}

相關文章