軟工實踐1816-第二次作業
阿新 • • 發佈:2018-09-20
無法打開 開發 問題 i++ The ble () rac https
Github項目地址
https://github.com/ljjy/personal-project
PSP表格
PSP2.1 | Personal Software Process Stages | 預計耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
·Estimate | · 估計這個任務需要多少時間 | 600 | 800 |
Development | 開發 | ||
·Analysis | · 需求分析 (包括學習新技術) | 120 | 180 |
·Design Spec | · 生成設計文檔 | 20 | 20 |
·Design Review | · 設計復審 | 30 | 20 |
·Coding Standard | · 代碼規範 (為目前的開發制定合適的規範) | 30 | 20 |
·Design | · 具體設計 | 60 | 40 |
·Coding | · 具體編碼 | 240 | 360 |
·Code Review | · 代碼復審 | 60 | 60 |
·Test | · 測試(自我測試,修改代碼,提交修改) | 60 | 120 |
Reporting | 報告 | ||
·Test Repor | · 測試報告 | 60 | 60 |
·Size Measurement | · 計算工作量 | 20 | 20 |
·Postmortem & Process Improvement Plan | · 事後總結, 並提出過程改進計劃 | 60 | 90 |
合計 | 700 | 990 |
解題思路:
實現基本功能:
- 統計文件的字符數:按行讀入字符串,記錄每行的字符串長度,最後再加上換行符的個數,得到總字符數。
- 統計文件的有效行數: 因為是按行讀入字符串,對每一行進行遍歷,如果到行尾還沒有遇到非空白字符,就說明該行是非有效行數,反之就是有效行數。
- 統計文件的單詞總數: 因為是按行讀入字符串,對每一行進行遍歷,在確定前四個連續字符是字母的情況下,接著往後遍歷字符直到遇到分割符、換行符等,這就找到了一個單詞,然後從剛剛遇到的分割符後一個字符開始,繼續遍歷。
- 統計文件中單詞詞頻: 創建一顆字典樹,把每個單詞按字典序插入樹中,字典樹結點包含3個變量,該單詞個數,該單詞本身,該結點的子結點。然後遍歷單詞數組,同時維護一個大小為10的優先隊列(單詞個數小的排在隊列前面,單詞個數一樣的,單詞字典樹大的排在前面)。
具體實現:
部分代碼
trie_node* FrequentWordCount()
{
int flag = 1;
sort(Words,Words+ct);
trie root = create_trie_node();
for(int i=0;i<ct;i++)
{
trie_insert(root,Words[i]); //建立字典樹
}
for(int i=0;i<ct;i++) //遍歷單詞數組
{
int ct = trie_search(root,Words[i]); //搜索該單詞
fqtWord.c = ct;
fqtWord.word=Words[i];
if(q.size()<10) //維護優先隊列
{
q.push(fqtWord);
}
else
{
q.push(fqtWord);
q.pop();
}
}
while(!q.empty()) //倒序保存優先隊列
{
fqtWord = q.top();
str[d] = fqtWord.word;
ans[d] = fqtWord.c;
d++;
q.pop();
}
return root;
}
性能測試:
- 我感覺是因為在FrequentWordCount中是通過遍歷單詞數組的方式通過查找字典樹來確認詞頻,導致多次查找相同的單詞。
- 解決方法:通過遍歷字典樹來確認詞頻,減少不必要的重復。同時利用字典樹的先序遍歷即是字典序的特點,可以很容易地做到按字典序排列的要求。
單元測試:
TEST_CLASS(Up_low_wordEuqalText)
{
public:
TEST_METHOD(TestMethod1)
{
// TODO: 在此輸入測試代碼
int count_up = CharacterCount("test1.txt"); //全小寫文件
int count_low = CharacterCount("test2.txt"); //大小寫混雜文件
Assert::IsTrue(count_up == count_low); // 兩個返回值應該相等,測試通過
}
};
異常處理:
文件打不開
if (!file.is_open()) { cout << "文件無法打開" << endl; //return 0; }
總結與感悟
- 雖然作業完成的很糟糕,但是暴露出許多的問題值得自己警惕,懶散拖延,遇到難題不愛問人,自己的學習之路還有很長,接下來的日子繼續努力吧!
軟工實踐1816-第二次作業