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

  • 相关阅读:
    MFC STATIC,Picture控件使用及无法添加变量的问题
    MFC listctrl NMCLICK消息 错误 无法从"NMHDR*"转换为"NMITEMACTIVATE"
    vs2008中将开始执行按钮(不调试按钮)添加至标准工具栏方法
    MFC 删除工具栏 默认对话框全屏 修改MFC标题栏的文字 删除菜单栏
    Visual Assist X设置
    MFC禁止窗口最大化按钮和禁止改变窗口大小
    MFC从头开始如何利用MFC分割窗口
    MFC CSplitterWnd窗口分割
    关于VS2008下提示microsoft incremental linker已停止工作的问题
    windows 下codeblocks查看容器值
  • 原文地址:https://www.cnblogs.com/itdef/p/6097969.html
Copyright © 2011-2022 走看看