C primer plus 第六版 第八章 第四题 编程练习答案

版权声明:转载请注明来源~ https://blog.csdn.net/Lth_1571138383/article/details/80524210

Github 地址:这里这里φ(>ω<*)

/*
   本程序应题目而建立。
       题目要求: 遇到EOF之前,将输入作为字符流读取。
                     该程序要求报告平均每个单词的字母数。
*/

/* 逻辑 - 代码构建
    本题实现要求的核心结构就是使用头文件 ctype 的 isalpha 判断是否为字母。
     首先创建一个变量 int ch 获取输入。
     再创建一个变量 int last 保存上一次输入。 为了程序完美,需要细致的判断。具体看 while 循环体 if 的实现。
     再去创建 while 循环获取输入,判断则放入循环体。
     while(expression)expression 依旧是 (ch = getchar() ) != EOF
     if 判断是否为 isalpha 字母。
     是字母则跳过把。
     之所以先判断是否为字母,是为了last 变量储存上一个字符。。。具体看 while 循环体的实现。
     else if 再判断是否为 ispounct 标点符号,
     然后内嵌一个if判断上一个是否为字母。
     如果是则 用一个变量计数字母数量加1 。 正常标点符号前都是一个单词。。
     else if 再判断是否为 isspace 空白字符(空格,制表符,换行符等)
     是则判断 last 是否为 ispounct。
     如果是则表示上一个字母用标点符号结尾,则不计数单词。
     如果不是,就计数单词。。。
     else if 再判断是否为 isalpha 字母。
     是字母则跳过把。
     else 就错误报告吧,除了 空白,字母,标点符号我还真想不出来还有什么字符了。。
*/

本来这东西我是放到代码里面的,不过这么长,而且代码里的注释是黑色的不好分辨,阅读艰辛困苦,故而取出单独放一边。

/*
   本程序应题目而建立。
       题目要求: 遇到EOF之前,将输入作为字符流读取。
	                 该程序要求报告平均每个单词的字母数。
*/

#include<stdio.h>
#include<ctype.h>
int main(void)
{


//	本文读者会看到last的更新会放入if中。
//  这是因为if判断时ch已经读取,结束判断后则会迭代。所以把last放入if中可以达成保存上一个字符的效果。

	int ch = 0;		    // Save input.
	int last = 0;	    // Save last input.
	int words = 0;      // Save words amount.
	int letters = 0;  // Save character amount.

	printf("Please input:");

	while( (ch = getchar() ) != EOF )
	{
		if(isalpha(ch))
		{
			last = ch;
			letters++;
			continue;
		}
		else if(ispunct(ch))
		{
			if(isalpha(last))
			{
			// 如果上一个是字母,则计数单词。
				last = ch;
				words++;
				printf("This is a words. %c \n", ch);
			}
			else
			{
				last = ch;
			}
		}
		else if(isspace(ch))
		{
			if(ispunct(last))
			{
			// 如果上一个是标点符号,则不计数单词数。
				last = ch;
			}
			else if(isalpha(last))
			{
			// 如果上一个不是标点符号,则代表一个单词结束,计数单词数。
				last = ch;
				words++;
				printf("This is a words. %c \n", ch);
			}
		}
		else
		{
			printf("\n\nWarning !!! Switch has some problem. Please fix it !!\n\n");
		}
	}

	printf("\n\n There have %d words .\n", words);
	printf("And each words has an average of %d letters. \n", letters/words);
	printf("Bye ~\n");

	getchar();
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页