注:该程序包括计算单词个数,完整行数,非完整行数,字符数
1、需求分析
由于所做程序需要能够检测键盘输入文本的单词数量(本篇文章暂不讨论文本输入方式下的计数算法),并且除了单词之外,还应包含检测计数行数和字符数的功能。考虑到检测行数时原理是根据换行符来递增计数器,那么就存在很大一种可能最后一行并不完整。所以需要单独考虑,同时,由于没有设定输入结尾的标识符,需要自行设定结尾标识符。所以讨论几段文章这种思路并无意义,姑且暂定为只有一整段。而从这里倒推的话,partical_lines(非完整行)的值只能为1或者0。(PS:当然,嫌麻烦就无需讨论非完整行)
2、伪代码实现算法
首先该程序需逐个字符进行输入,程序要能够识别这些字符并且知道何时停止读取。由此,伪代码如下:
- 读取一个字符
- 当有更多字符输入时:
- 递增字符计数
- 如果读完一行,递增行数
- 如果读完一个单词,递增单词计数器
- 读取下一个字符
3、具体思路
(1)、首先,程序必须知道读取到什么时候结束,故需要强制性指定一个标识符,在这里姑且用’|‘作为标识符。通过宏定义常量标识符STOP;
(2)、由于本程序需要getchar逐个输入,故必须用到循环体;在检测到换行符时递增行数,在检测到两个单词之间的空格时递增单词个数,此时可以考虑非完整行,由于最后一个字符为结尾标识符’|’,而只要检测到倒数第二个字符不是换行符’\n’,则为非完整行;
(3)、识别计数部分(重要部分):本个程序核心思想。首先是识别单词,简单定义,可以认为一个单词由若干个字符构成,而这几个字符之间没有空格。那么可以假设一个布尔型(通过<stdbool.h>头文件)标志变量inword,程序读取的第一个非空字符为单词的起始位,当读到空白位为止。判断非空字符的测试表达式有两种思路:
其一:
ch != ' ' && ch != '\n' && ch != '\t';
其二:利用isspace()(注意添加<ctype.h>头文件哦)
if(isspace(ch)&&inword)//判断单词的结束
if(!isspace(ch)&&!inword)//判断新单词的开始
然后是关于行数和字符数的计数递增,没有技术含量。
4、代码实现
// wordcnt.c--统计字符数、单词数、行数
#include <stdio.h>
#include <stdlib.h>
#