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
    请按任意键继续. . .

  • 相关阅读:
    C# 安装包中添加卸载
    如何提取json里面的数据
    JSON写入
    在Net下处理Json
    Linq To Json
    衡量视频序列特性的TI(时间信息)和SI(空间信息)
    DotCMS安装步骤
    【12c OCP】最新CUUG OCP071考试题库(52题)
    【ocp12c】最新Oracle OCP071考试题库(44题)
    【Oracle 12c】最新CUUG OCP071考试题库(53题)
  • 原文地址:https://www.cnblogs.com/itdef/p/6097969.html
Copyright © 2011-2022 走看看