軟件工程實踐第二次做業

第二次軟件工程實踐做業

1、Github連接

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

2、解題思路描述

答:首先看到這個題目,先查閱了資料文件輸入輸出流的具體編碼要求和規定,採用一個個字符讀取的方式,統計字符數。git

第二步就是篩選單詞,將4個字母及以上的單詞保留下來,這裏還要注意開頭是數字的單詞也要篩選掉,最後要考慮全是空格的狀況,將他的ascii碼值做爲篩選條件便可篩除。github

最後一步就是統計頻數最高的10個單詞以及依次輸出他們並輸出他們的頻率。這裏查閱資料以及同窗之間相互學習瞭解到了map的用法,map的用法比較貼切本題要求,故採用map來作這道題。函數

3、設計實現過程

首先寫一個getfile函數,實現對文件的讀取,用get()函數對每個字符進行讀取到程序中。性能

其次是統計函數與單詞數,寫一個函數,遇到特定字符(例如‘\n’),行數++,可是這樣作會有些特殊狀況會多加到,所以後面加了一個布爾變量來控制特殊狀況的處理。單詞數的話用vector來實現,vector是成倍開闢空間,可能會浪費一些空間,可是對於存取字符串比較好用。單元測試

最後是找出頻數最高的10個單詞並依次輸出。採用map去解決這個問題會比較快。並且map的性質符合此題要求,因此採用map來解決,最後遍歷10遍依次輸出便可。學習

4、改進思路

經過向同窗請教得知,C++用於文件讀寫的ifstream和ofstream函數改成C語言的fopen性能會提高不少,消耗時間會下降一點。查閱相關資料後,代碼改進方面能夠改爲C語言的fopen函數時間會快一點。測試

5、代碼說明

打開文件而且統計字符函數編碼

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;
    }
}

6、單元測試

選取了比較極端的狀況測試。共採用5組相似極端數據測試,通過與同窗比對,沒有出現太大問題。3d

測試圖以下:

7、異常處理

1.沒有輸入文件時形成的停滯。解決:新增布爾變量和error機制

2.文件中統計單詞數異常的問題。解決:更改了斷定機制,原先的斷定機制不足以應付全部特殊狀況。

8、項目收穫

從此次實踐中學到了比較多的東西,瞭解了程序讀寫文件的方法,程序的內測等。增強了代碼能力,缺點在於編碼的規範真的不好勁,編碼的習慣也有所不足,之後須要慢慢改正以及多加練習。

相關文章
相關標籤/搜索