作業所屬課程 | 軟工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);//處理輸入的檔案路徑,進行檔案流操作
};
效能改進
可見佔用率最大的為unordered_map迭代器的呼叫。
本人能力有限,不知該如何改進。
消耗最大的函式:
單元測試
-測試一:
原文件為老師提供文件orig.txt,被測試文件為orig_0.8_del.txt
結果:
-測試二:
被測試文件為空文件
結果:
異常處理
從命令列輸入的引數不足或過多時,輸出錯誤原因並退出程式。
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;
}