`
evasiu
  • 浏览: 165459 次
  • 性别: Icon_minigender_2
  • 来自: 广州
博客专栏
Fa47b089-e026-399c-b770-017349f619d5
TCP/IP详解卷一>阅读...
浏览量:12263
社区版块
存档分类
最新评论

一个小题目(单词统计)

 
阅读更多
今天休息的时候看到一个关于单词统计的小题目:

统计一段由字符和和空格组成的字符串中有多少个单词

题目一看觉得很简单,无非是遍历字符串,然后根据字母是不是空格之类的来统计单词的个数。博主用了一个状态机来做这件事,我觉得颇有新意,所以就记下心来了。后面的留言有人觉得博主这是把简单问题复杂化,其实我觉得不然。最近在看《设计模式精解》,开篇作者提出的观点我就觉得非常好:需求总是在发生变化的,我们必须让我们写出的代码能够适应变化,而不是为预防变化而费尽必力。一语中的,想起大三的时候刚参与实习的时候,那个时候认为需求一旦定下来了就没有理由变,从而把责任怪罪到定义需求的人上面去,其实是多么狭隘。同样,我觉得两种做法的区别就是,后者更能适应需求的变化。想想,如果字符串除了空格和字符,还加上了各种符号啊之类的,前者的代码写起来就不那么好看了,从而也不好维护了。

下面是我写的两种实现方法:
#include<iostream>
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<<wordsCount(tests[i])<<' '<<wordsCountSM(tests[i])<<endl;
	}
	return 0;
}


相比之下,其实写第一种实现方法的时候花了我比较多的时间,因为我很害怕出错,而第二种实现方法很规则,只要照着状态机的转移图写就行了,不容易出错,下面是我画的状态图:


单词数增加的途径只有两个:从AlphaState->SpaceState,或者是从AlphaState到字符串结束。当需求发生变化时,我们或者添加新的状态,或者对状态的转移条件做一定的修改,很方便,而且不容易出错。
  • 大小: 21.4 KB
分享到:
评论

相关推荐

    1400:统计单词数

    只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词...

    给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格

    给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-&gt; “mi xiao hello” 输入描述: 输入数据有多组,每组占一行...

    用STL中的map或者vector实现统计一段文章中的不同单词的个数的功能,学习STL必练题目

    实现统计一段文章的每个单词的个数 其中CountDemo使用STL中的Map来实现的 CountDemo2是用一般语言实现,没有用到STL实现的; MapCount是用STL中的Vector和Map共同实现的 此题目是学习STL中的Map和Vector必练的经典...

    数据结构课设:基于不同策略的英文单词的词频统计和检索系统.cpp

    一篇英文文章存储在一个文本文件中,然后分别基于线性表、二叉排序树和哈希表不同的存储结构,完成单词词频的统计和单词的检索功能。同时计算不同检索策略下的平均查找长度ASL,通过比较ASL的大小,对不同检索策略的...

    词频统计(设计题目)

    提示1:文章需要经过若干次处理 大小写处理 替换特殊符号处理 分隔单词处理 提示2:利用hashtable进行统计 单词作为key 个数作为value foreach string i in strword if ht Contains i ht Add i 1 ; else ht[i]...

    linux GTK+单词统计程序课程设计

    包括源代码 课程设计报告 可执行文件 该程序由个人完成,希望多多支持,下载后评个分,注意,评价...2、程序的界面布局参考如下图,在第一个单行文本框输入一单词,点击“计算”按钮,按照以上算法计算出该单词的值。

    Python统计单词出现的次数

    统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。 前言: 这道题在实际应用场景中使用比较广泛,比如统计历年来四六级考试中出现的高频词汇,记得李笑来就利用他的编程技能出版过一本背单词的畅销书...

    Java实验的答案源程序

    函数定义10对(x,y)值,由此创建的Point类实例存入一个数组中,按与原点(0,0)的距离由小到大的顺序输 出所有的点及到原点的距离。 编写一个人与计算机对拿火柴的游戏程序。利用随机函数Math.random()产生火 柴...

    设计string类

    1、为该类定义构造函数,析构函数和赋值操作。...3、利用该string类完成测试程序:统计一个文本文件中所有包含给定子串的单词,并按字典序无重复的打印输出这些单词 PS这是一道题目,本人综合了一些成果汇总成了源码

    DreamCats#java-notes#434.字符串中的单词数1

    434. 字符串中的单词数题目统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。输出: 5解释: 这里的单词是指连续的不是空格的字符,所以 "Hel

    数据结构课程设计题目:计算机辅助教学(CAI)软件开发:教小学生学英语。

    功能:屏幕上随机出现一个汉语单词,英语单词,汉语词组,英语词组或一短 句提示小学生给出相应答案,答错了要提示要求重新输入,直到答对为 止。要统计给分,且累计,够一定分数后可进级,即从单词到词组,从 词组...

    C++ 文章读取存储统计查找

    display 显示文件单词统计结果 find &lt;查询的单词&gt; quit 对于执行失败的命令,给出相应的提示信息。 操作过程: 1) 打开文件 command: openfile &lt;输入文件名&gt; 2) 显示文件统计结果 command: display 输出结果:...

    汇编语言 20个练习题目 代码加实验报告

    5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,...

    紫电轻松单词 v1.0.zip

    紫电轻松单词是一款专门为你提供真人语音背单词的软件,该软件具有独特的考试记忆法,帮助你掌握无法背熟的单词,还为你...不会出现一个单词只有一两个意思,也不会出现一个单词数十个释义的现象。 紫电轻松单词截图

    C语言字符串类型题目

    其功能是统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字母字符看做单词分隔符),并将统计结果依次保存在b指向的数组中。 ⑵ 编写main()函数,采用数组定义的同时进行初始化的方式,将数据...

    良宇单词通

    ***本软件也可用于其它科目的学习,如输入英语和汉语一样输入题目和答案即可。*** 欢迎下载者进行登记,凡试用有好的建议者,可获免费使用权,您的下载登记顺序若逢带8的数,同样可以免费使用。登记只需您把注册...

    leetcode下载-pingcapAssignment:PingCAP小作业-大文件中查找第一个非重复的单词Golang实现

    大文件中查找第一个非重复的单词 开始时间 | 北京时间:2019 年 3 月 27 日, 截止时间 | 北京时间:2019 年 4 月 3 日, 作业要求:在 GitHub 上实现,截止时间前提交项目链接 题目: 有一个 100GB 的文件,里面内容...

    将字符串中由空格隔开的每个单词首字母大写

    主要介绍了如何将字符串中的每个单词的首字母变为大写,需要的朋友可以参考下

    Python程序设计 经典习题源码(多种方法).docx

    2.Python输入一个四位数,计算该数的每位数字之和 3.Python输出九九乘法表 4.Python给定一个字符串,每隔3个字符,若为大写字母,转化为小写字母 5.Python编写程序来计算文本中单词的频率。按值进行排序后输出 6....

Global site tag (gtag.js) - Google Analytics