軟工做業——結對編程

1、開頭要求

GitHub地址
個人夥伴的地址html

2、PSP表格

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

3、程序的實現

一、解題思路

對這個問題的大體解題階段:

拿到這個題目的時候,由於他要實現的功能相對較多。因此,我先對每個要實現的功能設計了函數。

因此,我先對每個要實現的功能設計了函數。下面是一些我認爲相對來講比較麻煩的功能的實現:

(1):對文件中出現的規定字符串的統計

(2):統計文件中出現的規定字符串評率最大的10個字符串。

二、封裝爲類

一共兩個類:
基類:
class word_count 
{
public:
    void f_open();/*打開文件函數*/
    void count_acill();/*統計文件中出現的acill 碼*/
    void count_aphabet();/*統計文件中出現的字母*/
    void count_Enum();/*統計文件中出現的字母*/
    void count_seperetors();/*統計文件中出現的分割符號*/
    void count_line();/*存儲文件中的每一行的字符串*/
    void display_1();
protected:
    ifstream f_in;
private:
    int acill;
    int aphabate;
    int Enum;
    int seperetors;
    string line_count[MAX];
    string line_count_all[MAX];
};

繼承類:node

class word_count2 :public word_count
{
public :
    void read_str();
    void store_str(string s);
    void display();
    void count_limit();
    void ruin_node();
private:
    count_str *first, *rear;
};

4、代碼複審

(1)自我複審

寫了一點代碼,我發現對於像我如今這個階段。完整的寫一段代碼花費時間更多的是在後面的修改代碼上面。緣由是:首先,本身寫代碼用的算法都是已經存在,沒有說本身設計一個算法去寫一段代碼。其次,本身對不少語法不熟悉,每次編譯的時候沒有問題可是運行就會出錯。最後,對整段代碼的分析不到位,得不到本身想要的結果。
此次寫代碼,在寫函數統計文件中出現的頻數最大的10個字符串的時,就遇到了一個讓我很惱火的問題。在這裏我也花費了不少的時間去修改。可是最後我仍是放棄了重寫一段代碼來代替他。    
   未修改前的思路:

修改後的思路:

(2)同伴複審

通過了此次同伴複審後,我發覺有一個同伴來審查本身寫的代碼會提升本身寫代碼的效率。
###(1)提升本身代碼的運行可信度。
此次寫函數統計指定字符的時候,我忘記了"123file"這一類不是單詞,不能被寫入。
起始代碼是這樣的:
void word_count2::read_str()
{
    char ch;//收集每個文件中字符
    string str_1;//記錄每個規定的字符
    long pos;//記錄f_in的位置
    int fir = 0;//判斷第一個字符是否爲字母
    f_in.clear();
    f_in.seekg(0, ios::beg);

    while (!f_in.eof())
    {
                int read=0;
        f_in.get(ch);
        
                
    
                read++;
                int k;
                f_in.seekg(pos);
                //f_in.get(ch);
                
                for ( k = 1; k < 4; k++)
                    {
                        read++;
                        f_in.get(ch);
                        if ( ch<'A' || (ch > 'Z'&& ch < 'a') || ch>'z' ) break;
                    }
                if (k == 4)
                {
                    f_in.get(ch);
                    while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch)|| ( '0' <= ch && ch <= '9'))
                    {
                        f_in.get(ch);
                        read++;
                    }
                    pos = f_in.tellg();
                    f_in.seekg(pos - read);
                    getline(f_in, str_1, ch);
                    store_str(str_1);
                    f_in.seekg(pos);

                }
        

            }
        
    }
}
通過個人好夥伴的提醒我就有修改了代碼,以下:
void word_count2::read_str()
{
    char ch;//收集每個文件中字符
    string str_1;//記錄每個規定的字符
    long pos;//記錄f_in的位置
    int fir = 0;//判斷第一個字符是否爲字母
    f_in.clear();
    f_in.seekg(0, ios::beg);

    while (!f_in.eof())
    {
        f_in.get(ch);
        fir++;
        if (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch))
        {
            
            int read=1;//記錄規定字符創的長度。
                        //-------------------------------------------------->增長代碼
            if (fir == 1)
            {
                pos = f_in.tellg();
                
            }
            else
            {

                pos = f_in.tellg();
                f_in.seekg(pos-1);//獲得上一個字符
                f_in.get(ch);
            }
            
            if (('0' <= ch && ch <= '9') || ch== '" ')
            {
                f_in.seekg(pos);
                f_in.get(ch);
                while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch) || ('0' <= ch && ch <= '9'))
                {
                    f_in.get(ch);
                }
            }//-------------------------------------------------------------------------------------------------------------------
            else
            {
                read++;
                int k;
                f_in.seekg(pos);
                //f_in.get(ch);
                
                for ( k = 1; k < 4; k++)
                    {
                        read++;
                        f_in.get(ch);
                        if ( ch<'A' || (ch > 'Z'&& ch < 'a') || ch>'z' ) break;
                    }
                if (k == 4)
                {
                    f_in.get(ch);
                    while (('a' <= ch && 'z' >= ch) || ('A' <= ch && 'Z' >= ch)|| ( '0' <= ch && ch <= '9'))
                    {
                        f_in.get(ch);
                        read++;
                    }
                    pos = f_in.tellg();
                    f_in.seekg(pos - read);
                    getline(f_in, str_1, ch);
                    store_str(str_1);
                    f_in.seekg(pos);

                }
        }

            }
        
    }
}
這樣的事情在此次的做業中還出現了不少次,這裏就不在都說了。GitHub上的代碼就是我和個人同伴通過相互修改後的最終結果。

(2)同伴互審能夠學到對方寫代碼不少好的方法和習慣。

一、我學到了同伴寫代碼時候的都看,多寫的好習慣。
二、每次編寫代碼的時候會先寫一遍僞代碼。

5、 計算模塊部分單元測試展現。

6、異常處理

1

根據以前的做業,這一次單元測試咱們仍然將**屬性->連接器->輸入->附加依賴項**的地址寫爲了Debug中的 .obj文件,可是運行包錯。



改正:
由於這一次,咱們直接將類獨立成了頭文件,因此其實在 #include "../ConsoleApplication1/word_count.h" 這裏就已經有了咱們單元測試所須要的類的定義。即咱們刪除以前所修改的附加依賴項中的路徑就行了。ios

2


測試沒法經過!
緣由是咱們的路徑寫的是相對路徑,因此沒辦法在當前路徑下找到這個 .txt文件,最後咱們將文件拷貝到了Test項目下的路徑。c++

7、性能改進

一、部分代碼改進思路:


二、性能分析圖:



消耗最大的函數:
git

八代碼規範

因爲這是我倆第一次用c++完成一個項目,因此咱們參考了網上的c++代碼規範知否,知否github

9、代碼運行結果


十結對編碼照片

11、做業感悟

一、結對編程讓我節約了不少時間,也避免了不少沒必要要的錯誤。「人多力量大」果真正確的。就算只有兩我的,也會比一我的的寫代碼來的好一些。
二、編寫代碼上思想的一些碰撞,真的會讓本身收穫不少!算法

相關文章
相關標籤/搜索