一、具体描述
利用状态机算法实现统计文件单词个数功能
二、状态机算法
使用状态机解决问题,主要有两个步骤:
1、确定系统总共有几个状态
2、确定状态之间的迁移过程,即分析由什么状态到达什么状态
在单词统计中,
1、可以看作有两个状态,OUT(间隔状态)和 IN(字母状态)
2、当间隔状态转变为单词状态时,单词个数+1
如图:
三、代码实现
#include <stdio.h>
#define OUT 0
#define IN 1
#define INIT OUT
int splite(char c) {
if ((' ' == c) || ('\n' == c) || ('\t' == c) ||
('\"' == c) || ('\'' == c) || ('+' == c) ||
(',' == c) || ';' == c || '.' == c)
return 1;
else
return 0;
}
int count_word(char *filename) {
int status = INIT; //定义初始状态
int sum = 0; //单词总数
FILE *fp = fopen(filename, "r");
if (fp == NULL) return -1;
char c ;
while ((c = fgetc(fp)) != EOF) {
if (splite(c)) { //
status = OUT;
} else if (OUT == status) {
status = IN;
sum ++;
}
}
return sum;
}
int main(int argc, char *argv[]) {
if (argc < 2) return -1;
printf("word: %d\n", count_word(argv[1]));
}
四、代码分析
status其实在循环中可以看作上一次状态,只有当前状态是IN(字母状态)status是OUT(空格状态)时单词个数+1,然后在注意维护status变量即可