zoukankan      html  css  js  c++  java
  • 状态机学习(一)统计字符

    题目来自<系统程序员成长计划>  

    作者:李先静.

    逐个字符扫描 根据是否为字母决定当前状态  由单词内状态切换到单词外 计数字符加1

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string testString = " this's a test,'Hello World!!!' Welcome to the real world, it sucks, but you are gona love it!!!";
    
    enum STATE {
    	STAT_INIT,
    	STAT_IN_WORD,
    	STAT_OUT_WORD
    };
    
    size_t CountWords(const string& s)
    {
    	int count = 0;
    	STATE state = STAT_INIT;
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}else
    			{
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				count++;
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				state = STAT_OUT_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	if (STAT_IN_WORD == state) {
    		count++;
    	}
    	
    	return count;
    }
    
    int main()
    {
    	cout << CountWords(testString) << endl;
    
    
           return 0;
    }
    

      改进版 计数以外还讲单词放入容器

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string testString = " this's a test,'Hello World!!!' Welcome to the real world, it sucks, but you are gona love it!!!";
    
    enum STATE {
    	STAT_INIT,
    	STAT_IN_WORD,
    	STAT_OUT_WORD
    };
    
    size_t CountWords(const string& s)
    {
    	int count = 0;
    	STATE state = STAT_INIT;
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}else
    			{
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				count++;
    				state = STAT_OUT_WORD;
    			}
    			break;
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				state = STAT_IN_WORD;
    			}
    			else {
    				state = STAT_OUT_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	if (STAT_IN_WORD == state) {
    		count++;
    	}
    	
    	return count;
    }
    
    size_t word_segmentation(const string& s, vector<string>& strVec)
    {
    	STATE state = STAT_INIT;
    	size_t count = 0;
    	size_t subStrStart = string::npos;
    	size_t subStrEnd = string::npos;
    
    	for (size_t i = 0; i < s.size(); i++)
    	{
    		switch (state)
    		{
    		case STAT_INIT:
    			if (isalpha(s[i])) {
    				subStrStart = i;
    				state = STAT_IN_WORD;
    			}
    			break;
    		case STAT_IN_WORD:
    			if (!isalpha(s[i])){
    				count++;
    				subStrEnd = i;
    				strVec.push_back(s.substr(subStrStart, subStrEnd- subStrStart));
    				state = STAT_OUT_WORD;
    			}
    			break;
    
    		case STAT_OUT_WORD:
    			if (isalpha(s[i])) {
    				subStrStart = i;
    				state = STAT_IN_WORD;
    			}
    			break;
    		default:
    			break;
    		}//switch (state)
    	}
    	
    	if (state == STAT_IN_WORD) {
    		count++;
    		subStrEnd = s.size();
    		strVec.push_back(s.substr(subStrStart, subStrEnd- subStrStart));
    	}
    
    	return count;
    }
    
    
    int main()
    {
    	cout << CountWords(testString) << endl;
    
    	vector<string> strVec;
    	cout << word_segmentation(testString, strVec) << endl;
    
    	for (vector<string>::iterator it = strVec.begin();
    		it != strVec.end(); it++)
    	{
    		cout << *it << "  ";
    	}
    	cout << endl;
    
    
        return 0;
    }
    

      运行结果

    19
    19
    this s a test Hello World Welcome to the real world it sucks but y
    ou are gona love it
    请按任意键继续. . .

  • 相关阅读:
    团队项目-Beta冲刺(第一周)
    个人第4次作业—Alpha项目测试
    团队项目——Alpha发布2
    优课堂考勤系统——Alpha发布1
    优课堂—系统设计
    优课堂—需求分析
    thrift学习笔记
    APP分享
    ActionBar
    ListView添加headview
  • 原文地址:https://www.cnblogs.com/itdef/p/6097969.html
Copyright © 2011-2022 走看看