《C Primer Plus》编程练习—第8章

《C Primer Plus》编程练习

第8章

下面的一些程序要求输入以EOF终止。如果你的操作系统很难或根本无法使用重定向,请使用一些其他的测试来终止输入,如读到&字符时停止。

1.exercise1.c

设计一个程序,统计在读到文件结尾之前读取的字符数。

//exercise8.1
#include<stdio.h> 
int main(void)
{
   
	int count=0;
	int ch;
	
	while((ch=getchar())!=EOF)//Ctrl+Z在新的一行开始才能退出,和电脑有关 
	{
   
		count++;
	}
	printf("输入的字符数是:%d\n",count);
	
	return 0; 
}

输出示例:

请输入文件内容,以新一行的Ctrl+Z做开头为结尾标志,输出文件字符数:
nihao
^Zkeshi
输入的字符数是:6

2.exercise2.c

编写一个程序,在遇到EOF之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。例如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之外,每行打印10对值。(注意:不同的操作系统其控制字符可能不同)

//exercise8.2
#include<stdio.h> 
int main(void)
{
   
	int ch;
	int count=0;//计数 
	
	printf("请输入字符,在新的一行输入Ctrl+Z程序结束:\n");
	while((ch=getchar())!=EOF)
	{
   
		count++;
		if(count==11)//每行最多打印10个 
		{
   
			putchar('\n');
			count=1;//重新计数 
		}
		if(ch>=32)//空格的ASCLL码是32 
		{
   
			printf("\'%c \'-%-5d",ch,ch);
		}
		else if(ch=='\n')
		{
   
			printf("\'\\n\'-%-5d\n",ch);
			printf("请再次输入字符,在新的一行输入Ctrl+Z程序结束:\n");
			count=0;
		}
		else if(ch=='\t')
		{
   
			printf("\'\\t\'-%-5d",ch);
		}
		else//其他非打印字符 
		{
   
			printf("\'%c\'-^%c    ",ch,ch+64);
		}
	}
	printf("退出程序。\n");
	
	return 0; 
}
请输入字符,在新的一行输入Ctrl+Z程序结束:
nihao   ^Dhengaoxingrenshini
'n '-110  'i '-105  'h '-104  'a '-97   'o '-111  '\t'-9    ''-^D    'h '-104  'e '-101  'n '-110
'g '-103  'a '-97   'o '-111  'x '-120  'i '-105  'n '-110  'g '-103  'r '-114  'e '-101  'n '-110
's '-115  'h '-104  'i '-105  'n '-110  'i '-105  '\n'-10
请再次输入字符,在新的一行输入Ctrl+Z程序结束:
^Z
退出程序。

3.exercise3.c

编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便。

//exercise8.3
#include<stdio.h>
#include<ctype.h>//提供程序用到的函数原型 
int main(void)
{
   
	int countlower=0;//小写字母计数 
	int countupper=0;//大写字母计数 
	int ch; 
	
	printf("请输入字符,统计输入的大、小写字母个数,在新的一行输入Ctrl+Z程序结束:\n");
	while((ch=getchar())!=EOF)
	{
   
		if(islower(ch))//判断是否是小写字母 
		{
   
			countlower++;
		}
		if(isupper(ch))//判断是否是大写字母
		{
   
			countupper++;
		}
	}
	printf("一共有%d个小写字母。\n",countlower); 
	printf("一共有%d个大写字母。\n",countupper); 
	
	return 0; 
}
请输入字符,统计输入的大、小写字母个数,在新的一行输入Ctrl+Z程序结束:
nihao
WOshi
^Z
一共有8个小写字母。
一共有2个大写字母。

4.exercise4.c

编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点,考虑使用ctype.h系列中的ispunct()函数)。

//exercise8.4
#include<stdio.h>
#include<ctype.h> 
#include<stdbool.h>
int main(void)
{
   
	int length=0;//给单词的长度计数  
	int ch;//读入字符 
	int sum=0;//所有单词的总字母数 
	int count=0;//单词的个数 
	bool inword=false;//标记,当前字符不是字母 
	double average;//单词的平均字母数 
	
	printf("请输入字符,在新的一行输入Ctrl+Z程序结束:\n");
	while((ch=getchar())!=EOF)
	{
   
		if(isalpha(ch))//判断是否是字母 
		{
   
			length++;//单词长度加1 
			if(!inword)//判断标记的值 
			{
   
				inword=true;//当前是字母,改变标记,为下一个字符做判断 
				count++;//单词个数加1 
			} 
		}
		else
		{
   
			sum=sum+length;//计算字母总个数 
			length=
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值