程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 一步一步寫算法(之單詞統計)

一步一步寫算法(之單詞統計)

編輯:關於C

 

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱:feixiaoxing @163.com】

 

 

 

 

    在面試環節中,有一道題目也是考官們中意的一道題目:如果統計一段由字符和和空格組成的字符串中有多少個單詞?

 

    其實,之所以問這個題目,考官的目的就是想了解一下你對狀態機了解多少。

 

    (1) 題目分析

 

    從題目上看,如果對一個字符串進行處理,那麼可以有下面幾種情形:初始狀態,字符狀態,空格狀態,結束狀態。那麼這幾種狀態之間應該怎麼遷移呢?

 

    初始狀態: 如果輸入符號是空格,那麼進入空格狀態;如果是字符,那麼就進入字符狀態,同時單詞個數+1;如果是結束狀態,那麼直接返回;

 

    字符狀態:如果輸入符號是空格,那麼進入空格狀態;如果是字符,那麼什麼也不做;如果是結束,直接返回;

 

    空格狀態:如果輸入符號是空格,那麼什麼也不做;如果是字符,那麼進入字符狀態,同時單詞個數+1;如果結束狀態,那麼直接返回。

 

 

/*          輸入是字符

*           -------->    字符狀態----------

*          |                               | -->

*      初始狀態  輸入字符  |  |  輸入空格            結束狀態

*          |                                 -->

*          --------->    空格狀態----------|

*            輸入是空格

*/ 

/*          輸入是字符

*           -------->    字符狀態----------

*          |                               | -->

*      初始狀態  輸入字符  |  |  輸入空格            結束狀態

*          |                                 -->

*          --------->    空格狀態----------|

*            輸入是空格

*/

    (2)根據上面描述的狀態遷移過程,編寫對應的代碼

 

typedef enum{ 

    INIT_STATE = 1, 

    WORD_STATE, 

    SPACE_STATE, 

}; 

 

int count_word_number(const char* pStr) 

    int count = 0; 

    int state = INIT_STATE; 

    char value ; 

 

    if(NULL == pStr) 

        return 0; 

 

    while(value = *pStr++){ 

        switch (state) 

        { 

        case INIT_STATE: 

            if(' ' != value) 

                count ++, state = WORD_STATE; 

            else 

                state = SPACE_STATE; 

            break; 

 

        case WORD_STATE: 

            if(' ' == value) 

                state = SPACE_STATE; 

            else if('\0' == *pStr) 

                return count; 

                 

            break; 

 

        case SPACE_STATE: 

            if(' ' != value) 

                count ++, state = WORD_STATE; 

            else if('\0' == *pStr) 

                return count; 

             

            break; 

 

        default: 

            break; 

        } 

    } 

 

    return count; 

typedef enum{

       INIT_STATE = 1,

       WORD_STATE,

       SPACE_STATE,

};

 

int count_word_number(const char* pStr)

{

       int count = 0;

       int state = INIT_STATE;

       char value ;

 

       if(NULL == pStr)

              return 0;

 

       while(value = *pStr++){

              switch (state)

              {

              case INIT_STATE:

                     if(' ' != value)

                            count ++, state = WORD_STATE;

                     else

                            state = SPACE_STATE;

                     break;

 

              case WORD_STATE:

                     if(' ' == value)

                            state = SPACE_STATE;

                     else if('\0' == *pStr)

                            return count;

                           

                     break;

 

              case SPACE_STATE:

                     if(' ' != value)

                            count ++, state = WORD_STATE;

                     else if('\0' == *pStr)

                            return count;

                    

                     break;

 

              default:

                     break;

              }

       }

 

       return count;

}

 

 

    (3)編寫測試用例,驗證代碼是否編寫正確

 

 

void test() 

    assert(0 == count_word_number(NULL)); 

    assert(0 == count_word_number("")); 

    assert(1 == count_word_number("hello")); 

    assert(3 == count_word_number("china baby hello")); 

void test()

{

       assert(0 == count_word_number(NULL));

       assert(0 == count_word_number(""));

       assert(1 == count_word_number("hello"));

       assert(3 == count_word_number("china baby hello"));

}

 

 

 

 

 

總結:

    1)狀態機是編程人員的基本功,它和另外一種方法回調函數注冊一樣,使我們在日常開發中經常用到的一種方法

 

    2)狀態機是計算機網絡通信的重要內容,想要對tcp-ip協議棧加深了解的朋友尤其需要重點掌握

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved