第四次做業:結對編程

第四次做業:結對編程

Git項目地址 項目地址
姓名 曲晨陽
學號 201831061313
結對夥伴 潘偉鍵
夥伴博客地址 https://www.cnblogs.com/pwj1278634240/
學號 201831061312

1.結對編程照片

2.PSP表格

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

3.解題過程

Wordcount需求描述:

統計input.txt中的如下幾個指標

1.統計文件的字符數:
只須要統計Ascii碼,漢字不需考慮
空格,水平製表符,換行符,均算字符
英文字母:A-Z,a-z
字母數字符號:A-Z,a-z,0-9
分割符:空格,非字母數字符號
例;file123是一個單詞,123file不是一個單詞。file,File和FILE是同一個單詞輸出的單詞統一爲小寫格式

2.統計文件的單詞總數,單詞:至少以4個英文字母開頭,跟上字母數字符號,單詞以分隔符分割,不區分大小寫。

3.統計文件的有效行數:任何包含非空白字符的行,都須要統計。

4.統計文件中各單詞的出現次數,最終只輸出頻率最高的10個。頻率相同的單詞,優先輸出字典序靠前的單詞。

輸出的格式爲
· characters: number

· words: number

· lines: number

· <word1>: number

· <word2>: number

· ...

解題思路:

題目要求統計一個文本文檔中的字符數,單詞數等,咱們的思路是先把文檔中的字符所有取出來,存在一個string類的字符串裏,而後再進行計數等操做。
在解題過程當中,我和個人搭檔首先進行了分工,我負責寫出main函數和計算字符的函數,個人搭檔潘偉鍵負責寫出單詞統計和輸出十個高頻詞彙的函數。
分工完成後,我和偉鍵同時進行編碼活動,這個過程不是獨立的,在編代碼時咱們常常交流,互相給出意見,這樣最終的代碼吻合度高,開發效率也很不錯。

思路圖:

詳細代碼:

  1. 判斷是否是有效單詞
  2. 把大寫字母轉換成小寫字母
  3. 把儲存在string裏的字符轉換爲單詞
  4. 統計字符數

總代碼:ios

#include <string>
    #include <fstream>
    #include <sstream>
    #include <iostream>

    using namespace std;

    //寫入文件
    ofstream tongji("output.txt", ios::app);

    class word_count
    {
    private:
        string str;

    public:
        //輸出原文
        void output()
        {
            cout << "原文:" << endl;
            cout << str << endl;
        }
        //統計字符數
        int countzifu()
        {
            int i = 0;
            int sum = 0;
            while (str[i] != '\0')
            {
                if (str[i] <= 126 && str[i] >= 32 || str[i] == 10 || str[i] == 13)
                sum++;
                i++;
            }
            return sum;
            cout << endl << "字符個數:" << sum << endl;
            tongji << "字符個數:" << sum << '\n';
        }
        //將文件中的字符存入一個string字符串
        void getinstr(stringstream &s)
        {
            str = s.str();
        }

        //判斷是否是有效單詞
        int judgeword(string a)
        {
            int i = a.size(), n;
            if (i < 4)
            {
                return 0;
            }
            for (n = 0; n < 4; n++)
            {
                if (a[n] < 65 || 91 <= a[n] && a[n] < 96 || a[n]>123 && a[n] < 127)
                    return 0;
            }
            return 1;
        }

        //把大寫字母轉化爲小寫字母
        void turn(string& a)
        {
            int n = 0;
            while (a[n] != '\0')
            {
                if ('A' <= a[n] && a[n] <= 'Z')
                    a[n] = a[n] + 32;
                n++;
            }
        }

        //輸出前十個高頻詞彙
        void tenword(string a[500], int n)
        {
            int j, k, p = 0, t = 0, i;
            string b[500];
            int count[500];
            int count1[500];
            int count3[500];
            for (k = 0; k < n; k++)
            {
                count[k] = 1;
                for (j = 0; j < n; j++)
                {
                    if (b[j] == a[k])
                    {
                        count[j]++;
                        break;
                    }
                }
                if (j == n)
                {
                    b[p] = a[k];
                    p++;
                }
            }
            for (k = 0; k < n; k++)
            {
                count1[k] = count[k];
                count3[k] = k;
            }

            for (i = 0; i < n - 1; ++i)
            { // 二重循環完成選擇排序
                k = i;
                for (j = i + 1; j < n; ++j) {
                    if (count1[k] < count1[j]) k = j;
                }
                if (k != i) {
                    t = count1[k];
                    count1[k] = count1[i];
                    count1[i] = t;
                    t = count3[i]; // 輔助數組同步操做
                    count3[i] = count3[k];
                    count3[k] = t;
                }
            }
            for (k = 0; k < 10; k++) {
            cout << '<' << b[count3[k]] << ">: " << count[count3[k]] << endl;
            tongji << '<' << b[count3[k]] << ">: " << count[count3[k]] << '\n';
            }
        }


        //把string a轉化爲單詞
        int readword()
        {
            int n = 0;
            int i = 0;
            int j = 0;
            int count = 0;
            string b[500];
            string c[500];
            while (str[i] != '\0')
            {
                if (str[i] != 32 && str[i] != 44 && str[i] != 46)
                {
                    b[n] = b[n] + str[i];
                    i++;
                }
                else
                {
                    n++;
                    i++;
                }
            }

            for (j = 0; j < n; j++)
            {
                if (judgeword(b[j]) == 1)
                {
                    turn(b[j]);
                    c[count] = b[j];
                    count++;
                }
            }
            tenword(c, count);
            return  count;
        }

    };

    int main()
    {
        int a;
        fstream wordfill("input.txt");//打開文檔文件
        stringstream ss;
        ss << wordfill.rdbuf();
        word_count count1;
        ofstream tongji("output.txt", ios::app);//寫入文件

        count1.getinstr(ss);//將文件中的字符存入一個string字符串

        count1.output();//輸出原文

        a = count1.countzifu();//調用統計字符函數
        cout << endl << "字符個數:" << a << endl;
        tongji << "字符個數:" << a << '\n';

        a = count1.readword();//調用單詞統計函數
        cout << "單詞個數:" << a << endl;
        tongji << "單詞個數:" << a << '\n';

        tongji.close();
    }

代碼複審:

我和個人同伴把寫好的函數合併起來,而後共同封裝成一個wordcount類,其中發現了一些輸出錯誤,進行了改正。git

運行截圖:


4.性能分析及單元測試:

- 性能分析:


github

- 單元測試:
編程

5:小結:

此次做業能夠說是第二次做業的一次升級,使用第二次學習的工具,經過結對編程的方式完成這個題目,個人結對搭檔潘偉鍵很是認真負責,寫的代碼很完美,都完成了要求的功能,最後在單元測試上面卡了好久好久,最後詢問了同窗才得以解決,在第二次做業時就沒有學好,在之後的做業中還要更加認真去學習。數組

相關文章
相關標籤/搜索