PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | 90 | 120 |
· Estimate | · 估計這個任務須要多少時間 | 700 | 797 |
Development | 開發 | 200 | 250 |
· Analysis | · 需求分析 (包括學習新技術) | 150 | 150 |
· Design Spec | · 生成設計文檔 | 20 | 10 |
· Design Review | · 設計複審 | 10 | 18 |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 30 | 30 |
· Design | · 具體設計 | 10 | 20 |
· Coding | · 具體編碼 | 150 | 150 |
· Code Review | · 代碼複審 | 5 | 5 |
· Test | · 測試(自我測試,修改代碼,提交修改) | 5 | 15 |
Reporting | 報告 | 10 | 10 |
· Test Repor | · 測試報告 | 5 | 3 |
· Size Measurement | · 計算工做量 | 5 | 4 |
· Postmortem & Process Improvement Plan | 11 · 過後總結, 並提出過程改進計劃 | 10 | 12 |
合計 | 700 | 797 |
答:首先看到這個題目,先查閱了資料文件輸入輸出流的具體編碼要求和規定,採用一個個字符讀取的方式,統計字符數。git
第二步就是篩選單詞,將4個字母及以上的單詞保留下來,這裏還要注意開頭是數字的單詞也要篩選掉,最後要考慮全是空格的狀況,將他的ascii碼值做爲篩選條件便可篩除。github
最後一步就是統計頻數最高的10個單詞以及依次輸出他們並輸出他們的頻率。這裏查閱資料以及同窗之間相互學習瞭解到了map的用法,map的用法比較貼切本題要求,故採用map來作這道題。函數
首先寫一個getfile函數,實現對文件的讀取,用get()函數對每個字符進行讀取到程序中。性能
其次是統計函數與單詞數,寫一個函數,遇到特定字符(例如‘\n’),行數++,可是這樣作會有些特殊狀況會多加到,所以後面加了一個布爾變量來控制特殊狀況的處理。單詞數的話用vector來實現,vector是成倍開闢空間,可能會浪費一些空間,可是對於存取字符串比較好用。單元測試
最後是找出頻數最高的10個單詞並依次輸出。採用map去解決這個問題會比較快。並且map的性質符合此題要求,因此採用map來解決,最後遍歷10遍依次輸出便可。學習
經過向同窗請教得知,C++用於文件讀寫的ifstream和ofstream函數改成C語言的fopen性能會提高不少,消耗時間會下降一點。查閱相關資料後,代碼改進方面能夠改爲C語言的fopen函數時間會快一點。測試
打開文件而且統計字符函數編碼
void agefile(string filename)//打開文件統計字符函數 { char c; ifstream s(filename); if (!s) { flag1 = false; } while (s.get(c))//採用get函數讀取字符 { b[j++] = c; } if (flag1 == true) { d << "characters: " << j << endl; //輸出字符數 } else { d << "error" << endl; } }
統計頻率最高的10個單詞而且輸出單詞及頻數設計
void addword(bool flag = true, int max = -999)//統計單詞數詞頻最多的10個單詞以及輸出單詞 { bool flag2 = false; q = strmap.begin(); for (int s1 = 0; s1 < 10; s1++)//採用遍歷10次的的方式,若是不足十次bool值置false跳出循環 { flag2 = false; if (flag == false) { break; } flag = true; max = -999; while (q != strmap.end())//採用map函數進行存取遍歷 { if (q->second > max) { flag2 = true; max = q->second; a = q->first; } q++; } if (flag2 == true) { d << "<" << a << ">: " << max << endl; } q = strmap.begin(); strmap[a] = -10; for (int j1 = 0; j1 < str_shorted.size(); j1++)//判斷 { if (strmap[str_shorted[j1]] == -10) { w++; } } if (w == str_shorted.size()) { flag = false; } w = 0; } }
選取了比較極端的狀況測試。共採用5組相似極端數據測試,通過與同窗比對,沒有出現太大問題。3d
測試圖以下:
1.沒有輸入文件時形成的停滯。解決:新增布爾變量和error機制
2.文件中統計單詞數異常的問題。解決:更改了斷定機制,原先的斷定機制不足以應付全部特殊狀況。
從此次實踐中學到了比較多的東西,瞭解了程序讀寫文件的方法,程序的內測等。增強了代碼能力,缺點在於編碼的規範真的不好勁,編碼的習慣也有所不足,之後須要慢慢改正以及多加練習。