今天休息的时候看到一个关于单词统计的小题目:
统计一段由字符和和空格组成的字符串中有多少个单词
题目一看觉得很简单,无非是遍历字符串,然后根据字母是不是空格之类的来统计单词的个数。博主用了一个状态机来做这件事,我觉得颇有新意,所以就记下心来了。后面的留言有人觉得博主这是把简单问题复杂化,其实我觉得不然。最近在看《设计模式精解》,开篇作者提出的观点我就觉得非常好:需求总是在发生变化的,我们必须让我们写出的代码能够适应变化,而不是为预防变化而费尽必力。一语中的,想起大三的时候刚参与实习的时候,那个时候认为需求一旦定下来了就没有理由变,从而把责任怪罪到定义需求的人上面去,其实是多么狭隘。同样,我觉得两种做法的区别就是,后者更能适应需求的变化。想想,如果字符串除了空格和字符,还加上了各种符号啊之类的,前者的代码写起来就不那么好看了,从而也不好维护了。
下面是我写的两种实现方法:
#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
分享到:
相关推荐
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词...
给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello” 输入描述: 输入数据有多组,每组占一行...
实现统计一段文章的每个单词的个数 其中CountDemo使用STL中的Map来实现的 CountDemo2是用一般语言实现,没有用到STL实现的; MapCount是用STL中的Vector和Map共同实现的 此题目是学习STL中的Map和Vector必练的经典...
一篇英文文章存储在一个文本文件中,然后分别基于线性表、二叉排序树和哈希表不同的存储结构,完成单词词频的统计和单词的检索功能。同时计算不同检索策略下的平均查找长度ASL,通过比较ASL的大小,对不同检索策略的...
提示1:文章需要经过若干次处理 大小写处理 替换特殊符号处理 分隔单词处理 提示2:利用hashtable进行统计 单词作为key 个数作为value foreach string i in strword if ht Contains i ht Add i 1 ; else ht[i]...
包括源代码 课程设计报告 可执行文件 该程序由个人完成,希望多多支持,下载后评个分,注意,评价...2、程序的界面布局参考如下图,在第一个单行文本框输入一单词,点击“计算”按钮,按照以上算法计算出该单词的值。
统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。 前言: 这道题在实际应用场景中使用比较广泛,比如统计历年来四六级考试中出现的高频词汇,记得李笑来就利用他的编程技能出版过一本背单词的畅销书...
函数定义10对(x,y)值,由此创建的Point类实例存入一个数组中,按与原点(0,0)的距离由小到大的顺序输 出所有的点及到原点的距离。 编写一个人与计算机对拿火柴的游戏程序。利用随机函数Math.random()产生火 柴...
1、为该类定义构造函数,析构函数和赋值操作。...3、利用该string类完成测试程序:统计一个文本文件中所有包含给定子串的单词,并按字典序无重复的打印输出这些单词 PS这是一道题目,本人综合了一些成果汇总成了源码
434. 字符串中的单词数题目统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。输出: 5解释: 这里的单词是指连续的不是空格的字符,所以 "Hel
功能:屏幕上随机出现一个汉语单词,英语单词,汉语词组,英语词组或一短 句提示小学生给出相应答案,答错了要提示要求重新输入,直到答对为 止。要统计给分,且累计,够一定分数后可进级,即从单词到词组,从 词组...
display 显示文件单词统计结果 find <查询的单词> quit 对于执行失败的命令,给出相应的提示信息。 操作过程: 1) 打开文件 command: openfile <输入文件名> 2) 显示文件统计结果 command: display 输出结果:...
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,...
紫电轻松单词是一款专门为你提供真人语音背单词的软件,该软件具有独特的考试记忆法,帮助你掌握无法背熟的单词,还为你...不会出现一个单词只有一两个意思,也不会出现一个单词数十个释义的现象。 紫电轻松单词截图
其功能是统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字母字符看做单词分隔符),并将统计结果依次保存在b指向的数组中。 ⑵ 编写main()函数,采用数组定义的同时进行初始化的方式,将数据...
***本软件也可用于其它科目的学习,如输入英语和汉语一样输入题目和答案即可。*** 欢迎下载者进行登记,凡试用有好的建议者,可获免费使用权,您的下载登记顺序若逢带8的数,同样可以免费使用。登记只需您把注册...
大文件中查找第一个非重复的单词 开始时间 | 北京时间:2019 年 3 月 27 日, 截止时间 | 北京时间:2019 年 4 月 3 日, 作业要求:在 GitHub 上实现,截止时间前提交项目链接 题目: 有一个 100GB 的文件,里面内容...
主要介绍了如何将字符串中的每个单词的首字母变为大写,需要的朋友可以参考下
2.Python输入一个四位数,计算该数的每位数字之和 3.Python输出九九乘法表 4.Python给定一个字符串,每隔3个字符,若为大写字母,转化为小写字母 5.Python编写程序来计算文本中单词的频率。按值进行排序后输出 6....