第四次我的做業

第四次做業:結對編程

GIT地址 git地址
結對夥伴 曲晨陽201831061313
夥伴博客 夥伴博客地址

one、題目的分析

一、要求分析

此次做業的的題目是設計一個叫作word count的軟件,來實現如下基礎功能,和若干附加功能。git

a) 統計字符數github

b) 統計單詞數編程

c) 統計最多的10個單詞及其詞頻
如下是需求分析流程圖和函數介紹
數組

二、模塊分析函數

1、文件初步處理

第一步咱們應該要把文件裏面的文本給讀取出來,咱們想出來的辦法就是把整個文本讀取儲存到一個string str裏面性能

fstream fs("example.txt");
stringstream ss;
ss << fs.rdbuf();
string str = ss.str();
cout << str << endl;
    void getinstr(stringstream &s)
{
    str = s.str();
}

2、統計字符數

把文本存到字符串以後就方便字符的統計單元測試

//統計字符數
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';
}

3、存放有效單詞,並計數

而後再對文本字符串進行遍歷,遇到空格或者逗號句號,就中止,而後把前面的部分存入另外一個字符串,而後一個文本就被分紅了若干個字符串,存入一個string a[]裏面。測試

string b[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++;
        }
    }

以後就是對存放好的字符串數組挨個判斷是否爲有效單詞,並把大寫字母轉換成小寫,並存入用於存放單詞的數組string。
這裏須要兩個函數設計

判斷字符串a是不是有效單詞,如果,返回1,不是返回0.3d

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

turn(string)函數
把string裏面的每一個大寫字母轉換成小寫以便後續的剔除重複單詞,和計算頻數

void turn(string& a)
{
    int n = 0;
    while (a[n] != '\0')
    {
        if ('A' <= a[n] && a[n] <= 'Z')
            a[n] = a[n] + 32;
        n++;
    }
}

`
存放有效單詞的循環

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

其中count就爲有效單詞數

4、統計單詞出現的頻數,而且輸出前10個高頻單詞

對上面處理好的有效單詞數組進行遍歷,若是在計數單詞數組中已經出現了,則相應的計數數組+1,若未出現過,則加入計數單詞數組,相應的計數數組設爲1.

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

而後對計數數組進行遍歷,記下最大10個數的序號就好。

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

5、運行結果


two、測試及改善

1、如下是對代碼的性能分析




2、如下是單元測試

three結對感想

(1)首先此次結對編程讓我充分體會到團體的力量,若是是我單打獨鬥必定不會這麼快就完成這個任務,當我初次看到這個任務時,我是十分頭疼的,可是夥伴的出現不只分擔了編程技術,還讓我內心十分踏實至少不是單打獨鬥了。 (2)經過此次和夥伴的合做,我學到了一點就是,我在對變量起名時應該更加註意,不該該只用a,b,等等,而且應該添加必定的註釋,此次的註釋大可能是我夥伴辦完加註的。 (3)關於函數的獨立性,應該避免一個函數實現多個功能,函數的雜糅會加劇後期測試的麻煩程度,

相關文章
相關標籤/搜索