1.5.4单词计数

这个书上的例子现在看没什么,当时还是想了一会的。主要思路是判断是否在单词内,遇到单词分隔符(空格、制表符、换行符)时表示一个单词输入完成。
while((c = getchar()) != EOF)
++nc;
每输入一个字符就加一.这里是把所有输入的字符都加一包括空格、制表符、换行符。
还有一个思路就是判断是否是A-Z、a-z和0-9等这些有用的字符。不用原书上的就可以把空格等无用的字符省略。
if(c == '\n')
++nl;
这个是判断是否输入的是换行符,如果是换行符,则计算行数的nl加一。
if(' ' == c || '\t' == c || '\n' == c)
state = OUT;
这里是判断这个输入的字符是否是单词结束的字符,如果是则代表现在不在单词内。
else if(OUT == state){
state = IN;
++nw;
}
这里和上面的是只执行其中一条,也就是说如果是单词分隔符就执行上面那一条,如果不是单词分隔符则执行下面这一条,判断是由上到下依次判断,因为只执行其中之一并且是依次判断所以如果连续输入单词分隔符也只是执行上面一条if语句。将state这个判断是否在单词内的变量赋值为OUT.当输入的不是单词分隔符的时候,则执行下面那条语句如果目前在单词外也就是state ==OUT时则将state变为IN表示现在在单词内,并将记录单词数的nw加一。如果输入的不是单词分隔符并且state == IN 也就是在单词内的话,没有满足条件的语句所以什么也不做。
测试程序的时候边界条件有助于帮助发现程序的问题。
1-12练习的思路跟上面差不多,也是判断是否是在单词内,如果遇到单词分隔符则输出换行符,
if(' ' == c || '\n' == c || '\t' == c) 判断是否为单词分隔符,如果是则继续下面的判断,
if (state == IN) 判断是否在单词内。如果是则进行下面的动作。
putchar('\n'); 换行。
state =OUT; 将状态改为在单词外。
else if(OUT == state) if-else语句只要满足条件则不向下进行判断,所以如果不是上面的单词分隔符则进行这条判断,判断是否在单词外,因为不是单词分隔符而是单词,所以就是判断是否之前是在单词外。如果是的那次外则进行下面的动作
state = IN; 因为之前在单词外,所以这个输入表示单词的开头,所以将状态改为单词内。
putchar(c);然后输出这个字符。
else 如果上面两个条件都不满足输入的字符不是单词分隔符并且状态是单词内。也就是state == IN的情况下则直接输出。
putchar(c)
这个例子习题解答已经讲解了一些,这里只是补充,还是得感慨一下这书对于初学者的挑战。

你可能感兴趣的:(1.5.4单词计数)