目录
《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;//重置单词的字母个数
inword=false;//不是字母,重置标记
}
}
average=(double)sum/count;
printf("一共有%d个单词。\n",count);
printf("一共