福大軟工1816 · 第二次做業 - 我的項目

Github項目地址:(https://github.com/913680749/personal-project/tree/master/Cplusplus/031602133)node

1.PSP 表

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

2. 解題思路

總的功能大體就是統計單詞,字符和行數還要輸出最高頻的10個。統計的功能可能不會太難實現,可是輸出最高頻的10個單詞和以命令行運行並輸入到文件有點小煩。之前都沒碰見過,又要去自學新的東西了。上網搜了些資料,加上室友的幫助也總算完成了。計數部分沒什麼,關鍵是利用freopen函數進行文件的輸入與輸出,還有map函數的應用,算是解決了最頭疼的問題。

[freopen參考資料] (http://www.javashuo.com/article/p-uttsotmx-gg.html)
[map函數參考資料] (https://blog.csdn.net/gududanxing/article/details/11069919)git

3.設計實現

>Charconversion()函數用於實現英文的大小寫轉換
>Countchar()函數用於實現有效字符統計
>Countword()函數用於實現有效單詞統計
>Scan()和Print()函數則分別實現文件的輸入和輸出
>Countmaxword()函數用於實現最大頻數詞的統計輸出

4.性能改進

作出這題來感受都不容易了,改進的話有餘力再說吧,帶一張運行結果圖
github

5.部分代碼說明

void Wordinsert(string s)                   /*  向字典樹裏面插入單詞  */
{   
    int len = s.size(), flg;
    node *p;
    p = &root;
    rep(i, 0, len)
    {
        flg = Charconversion(s[i]);
        if (p->next[flg] == NULL)
        {
            p->next[flg] = new node(); p->next[flg]->gs = 0;
        }
        p = p->next[flg];
        if (i == len - 1) { p->gs++; }
    }
}

利用字典樹不只能夠節約空間還能夠大幅度縮短期複雜度編程

int Countword()
{
    int tp = 0;
    rep(i, 0, linenum)
    {
        bool f = 1; int lim = line[i].size();
        rep(j, 0, lim)
        {
            if (is_efct_char(line[i][j]))
            {
                string str = ""; str += line[i][j];
                rep(k, j + 1, lim)
                {
                    if (is_efct_char(line[i][k]))str += line[i][k], j = k;
                    else { j = k;  break; }
                }
                bool f = 0;; int siz = str.size() - 1;
                rep(k, 0, siz) {
                    if (str[k] >= '0'&&str[k] <= '9' && (str[k + 1]<'0' || str[k + 1]>'9'))f = 1;
                }
                if (!f)                   /*  對其是不是有效單詞進行判斷  */
                {                                                           
                    tp++;
                    Wordinsert(str);                      /* 利用前面的插入函數向字典樹中插入單詞,字典樹不只能夠節約空間還能夠大幅度縮短期複雜度 */ 
                }
            }
        }
    }
    return tp;
}

本來沒有引用字典樹只用map函數的時候編完之後運行會比較耗費時間,在查閱資料和舍友的提議下借鑑並使用了字典樹,勉強算是一個亮點吧。函數

6.單元測試

7.代碼覆蓋率

總體看來覆蓋率是挺高的,甚是欣慰。性能

8. 心得體會

老實說,已經開始後悔沒退選了,我的編程基礎能夠說至關的不咋地,作這一個做業都累了半死,對接下來的日子感到深深的擔心。不過總的來講的話感受我花的編碼時間比較久。並且若是直接一整套代碼打下來我應該也不至於用這麼久,可是又要封裝,又要單元測試啥七的八的都要去學,也花了很多時間。並且以前也沒用過github,操做啥的都會比較生疏。
相關文章
相關標籤/搜索