작은 문제 하나 (단어 통계)

오늘 휴식 시간 에 단어 통계 에 관 한 작은 문 제 를 보 았 다.
[b] 문자 와 빈 칸 으로 구 성 된 문자열 에 몇 개의 단어 가 있 는 지 통계 합 니 다 [/ b]
제목 을 보 니 간단 하 다. 문자열 을 옮 겨 다 니 며 알파벳 이 빈 칸 인지 아 닌 지 에 따라 단어의 개 수 를 계산한다.블 로 거들 은 상태 기 를 써 서 이 일 을 했 는데, 나 는 꽤 참신 하 다 고 생각 하여 마음 을 적 었 다.뒤의 댓 글 에는 블 로 거들 이 간단 한 문 제 를 복잡 하 게 만 드 는 것 이 라 고 생각 하 는 사람 이 있 지만 사실은 그렇지 않다 고 생각한다.최근 에 을 보면 서 저 는 작가 가 제기 한 관점 이 매우 좋다 고 생각 합 니 다. 수 요 는 항상 변화 하고 있 습 니 다. 우 리 는 우리 가 쓴 코드 가 변화 에 적응 할 수 있 도록 해 야 합 니 다. 변 화 를 예방 하기 위해 최선 을 다 하 는 것 이 아 닙 니 다.한 마디 로 대학 3 학년 때 실습 에 참 여 했 을 때 그 때 는 수요 가 정 해 지면 변 할 이유 가 없다 고 생각 하고 수 요 를 정의 하 는 사람 에 게 책임 을 탓 하 는 것 이 얼마나 편협 한 지 생각 했다.마찬가지 로 나 는 두 가지 방법의 차 이 는 후자 가 수요 의 변화 에 더욱 적응 할 수 있다 는 것 이 라 고 생각한다.생각해 보 니 문자열 에 빈 칸 과 문 자 를 제외 하고 여러 가지 기호 가 붙 어 있다 면 전자의 코드 는 쓰기 에 그다지 예 쁘 지 않 고 유지 하기 도 어렵다.
다음은 내 가 쓴 두 가지 실현 방법 이다.

#include
using namespace std;

/** description:
** given a string of alpha and spaces,
** return how many words are there in the string
** Words are seperated by space(s)
**/

int wordsCount( const char* str )
{
if( str == NULL )
return 0;
int count = 0;
char cur;
while( cur = *str )
{
if( cur == ' ' )
while( *(++str)!='\0' && *str==' ' );
else
{
count++;
while( *(++str)!='\0' && *str!=' ' );
}
}
return count;
}

/** now let's try another solution with state machine */
int wordsCountSM( const char* str )
{
enum STATE { InitState, SpaceState, AlphaState };
int count = 0;
char cur;
STATE state = InitState;
while( cur = *str++ )
{
switch(state)
{
case InitState:
if( cur == ' ' )
state = SpaceState;
else
state = AlphaState;
break;
case SpaceState:
if( cur != ' ' )
state = AlphaState;
break;
case AlphaState:
if( cur == ' ' )
{
state = SpaceState;
count ++;
}
break;
default:
break;
}
}
if ( state == AlphaState )
count++;
return count;
}


int main()
{
char* test1 = "this is a normal string";
char* test2 = " this is a abnormal string";
char* test3 = "this is an abnormal string ";
char* test4 = " this is an abnormal string ";
char* tests[4] = { test1, test2, test3, test4 };
for( int i=0; i<4; i++ )
{
cout< }
return 0;
}

그 에 비해 사실은 첫 번 째 실현 방법 을 쓸 때 저 는 많은 시간 을 들 였 습 니 다. 저 는 실 수 를 두려워 하기 때문에 두 번 째 실현 방법 은 규칙 적 입 니 다. 상태 기의 이전 그림 에 따라 쓰 면 됩 니 다. 실 수 를 하기 쉽 지 않 습 니 다. 다음은 제 가 그린 상태 그림 입 니 다.
[img]http://dl.iteye.com/upload/attachment/0072/3215/fd35b9cf-ffe4-30ea-828b-5581ff672fe8.jpg[/img]
단어 수가 증가 하 는 경 로 는 알파 스테이 트 - > 스페이스 스테이 트 또는 알파 스테이 트 에서 문자열 로 끝 나 는 두 가지 밖 에 없다.수요 가 변 할 때 우 리 는 새로운 상 태 를 추가 하거나 상태의 이전 조건 을 어느 정도 수정 하 는 것 이 편리 하고 실수 하기 쉽 지 않다.

좋은 웹페이지 즐겨찾기