下面的一些程序要求输入以EOF终止。如果你的操作系统很难或根本无法使用重定向,请使用一些 其他的测试来终止输入,如读到&字符时停止。
1.设计一个程序,统计在读到文件结尾之前读取的字符数。
#include <stdio.h>
int main(void)
{
int ch;
int count=0;
printf("Enter the characters for count:\n");
while((ch=getchar())!=EOF)
count++;
printf("There are %d characters.\n",count);
return 0;
}
注:在Windows中,文件结尾以一行开始处输入Ctrl+Z表示。
2.编写一个程序,在遇到EOF之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理 这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。 例如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之外,每行打印10对值。(注意:不同的操作系统其控制字符可能不同。)
#include <stdio.h>
int main(void)
{
int ch;
int count=0;
printf("Enter the characters,EOF to quit:\n");
while((ch=getchar())!=EOF)
{
count++;
if(ch=='\n') //打印换行符和相应的ASCII码,并将计数器设为0
{
printf("\\n:%d ",ch);
count=0;
}
else if(ch=='\t') //打印制表符和相应的ASCII码
printf("\\t:%d ",ch);
else if(ch<' ') //打印其他非打印字符和相应的ASCII码
printf("^%c:%d ",ch+64,ch);
else
printf("%c:%d ",ch,ch); //打印普通字符和相应的ASCII码
if(count%10==0) //每行打印10对,或者遇到换行符时换行
{
printf("\n");
count=0;
}
}
return 0;
}
注:由于缓冲输出,每次按Enter键(即换行符时),程序将会输出缓冲区中的内容。
3.编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告输入中的大写字母和 小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch;
int l_count=0;
int u_count=0;
printf("Enter the characters for count,EOF to quit:\n");
while((ch=getchar())!=EOF)
{
if(islower(ch))
l_count++;
else if(isupper(ch))
u_count++;
else
continue;
}
printf("The num of lower character is %d.\n",l_count);
printf("The num of upper character is %d.\n",u_count);
return 0;
}
4.编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母 数。不要把空白统计为单词的字母。 实际上,标点符号也不应该统计,但是现在暂时不用考虑这么多(如果你比较在意这点,考虑使用ctype.h系列中的ispunct()函数)。
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
int ch;
int c_count=0; //字符计算
int count=0; //单词计数
bool inword=false;
float average;
printf("Enter the characters for analysis,EOF to quit:\n");
while((ch=getchar())!=EOF)
{
if(!(ispunct(ch)||isspace(ch)))
c_count++;
if(!(ispunct(ch)||isspace(ch))&&inword==false)
{
count++;
inword=true;
}
if(ispunct(ch)||isspace(ch))
inword=false;
}
average=(float)c_count/(float)count;
printf("The average characters of each word is %.2f.\n",average);
return 0;
}
5.修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序最初猜50,询问用户是 猜大了、猜小了还是猜对了。如果猜小了,那么下一次猜测的值应是50和100中值,也就是75。 如果这次猜大了,那么下一次猜测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如果用户没有欺骗程序,那么程序很快就会猜到正确的答案。
#include <stdio.h>
int main(void)
{
int min=0;
int max=100;
int mid;
int answer;
int flag; //标记,0表示小于,1表示大于,其他数字表示等于
mid=(min+max)/2;
printf("Enter the answer:\n");
while(scanf("%d",&answer)==1)
{
printf("Enter the hit,<%d enter 0,>%d enter 1,=%d enter other integer:\n",mid,mid,mid);
scanf("%d",&flag);
if(flag==0)
{
max=mid-1;
printf("Enter an integer between %d and %d.\n",min,max);
}
else if(flag==1)
{
min=mid+1;
printf("Enter an integer between %d and %d.\n",min,max);
}
else
{
printf("You are right!\n");
break;
}
mid=(min+max)/2;
}
return 0;
}
6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空白字符,并在一个简单的 程序中测试。
#include <stdio.h>
#include <ctype.h>
char get_first(void);
int main(void)
{
char ch;
printf("Enter the characters for verify,begin with '#' quit:\n");
while((ch=get_first())!='#')
printf("The first Non_space character is %c.\n",ch);
return 0;
}
char get_first(void)
{
char ch;
while(isspace(ch=getchar()))
continue;
while(getchar()!='\n')
continue;
return ch;
}
7.修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5作为结束输入的标记。
#include <stdio.h>
#include <ctype.h>
#define hour_step 40
#define rate1 0.15
#define rate2 0.2
#define rate3 0.25
#define rate_step1 300
#define rate_step2 150
#define tax1 rate1*rate_step1
#define tax2 tax1+rate2*rate_step2
char get_choice(void);
int get_int(void);
char get_first(void);
void compute(int hour_w,float pay_h);
int main(void)
{
char choice;
int hour_w;
float pay_h;
while((choice=get_choice())!='q')
{
switch(choice)
{
case 'a':pay_h=8.75;
break;
case 'b':pay_h=9.23;
break;
case 'c':pay_h=10.00;
break;
case 'd':pay_h=11.20;
break;
default:break;
}
printf("Enter the working hours per week:\n");
while((hour_w=get_int())<0||hour_w>60)
printf("Please enter the working hours per week between 0 and 60:\n");
compute(hour_w,pay_h);
}
return 0;
}
void compute(int hour_w,float pay_h)
{
float all_pay; //总工资
float tax; //税金
float pay; //净工资
if(hour_w<=hour_step)
all_pay=hour_w*pay_h;
else
all_pay=hour_step*pay_h+(hour_w-hour_step)*pay_h*1.5;
if(all_pay<=rate_step1)
tax=all_pay*rate1;
else if(all_pay<=rate_step1+rate_step2)
tax=tax1+(all_pay-rate_step1)*rate2;
else
tax=tax1+tax2+(all_pay-rate_step1-rate_step2)*rate3;
pay=all_pay-tax;
printf("In %d hours,all_pay=%.2f;tax=%.2f;pay=%.2f.\n",hour_w,all_pay,tax,pay);
}
char get_choice(void)
{
char ch;
printf("*******************************************************************\n");
printf("Enter the character corresponding to the desied pay rate or action.\n");
printf("a:$8.75/hr b:$9.23/hr\n");
printf("c:$10.00/hr d:$11.20/hr\n");
printf("q:quit.\n");
printf("*******************************************************************\n");
ch=get_first();
while(ch<'a'||ch>'d'&&ch!='q')
{
printf("Please respond with 'a','b','c','d' or 'q':\n");
ch=get_first();
}
return ch;
}
int get_int(void)
{
char ch;
int input;
while(scanf("%d",&input)!=1)
{
while((ch=getchar())!='\n')
putchar(ch);
printf(" is not an integer.\n");
printf("Please enter an integer,such as 1,10 or 22.\n");
}
return input;
}
char get_first(void)
{
char ch;
while(isspace(ch=getchar()))
continue;
while(getchar()!='\n')
continue;
return ch;
}
8.编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序 提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用 float类型的变量储存用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。该程序的一个运行示例如下:
Enter the operation of your choice:
a. add s. subtract
m. multiply d. divide
q. quit
a
Enter first number: 22.4
Enter second number: one
one is not an number. Please enter a number, such as 2. 5, -1. 78E8, or 3: 1
22.4 + 1 = 23.4
Enter the operation of your choice:
a. add s. subtract
m. multiply d. divide
q. quit
d
Enter first number: 18.4
Enter second number: 0
Enter a number other than 0: 0. 2
18.4 / 0.2 = 92
Enter the operation of your choice:
a. add s. subtract
m. multiply d. divide
q. quit
q
Bye.
#include <stdio.h>
#include <ctype.h>
char get_choice(void); //输入
float get_float(void); //输入数字
char get_first(void); //读取第一个非空字符
double add(float x,float y); //加法
double subtract(float x,float y); //减法
double multiply(float x,float y); //乘法
double divide(float x,float y); //除法
int main(void)
{
char choice;
float x,y;
while((choice=get_choice())!='q')
{
switch(choice)
{
case 'a':printf("Enter the first number:\n");
x=get_float();
printf("Enter the second number:\n");
y=get_float();
printf("%.2f+%.2f=%.3f\n",x,y,add(x,y));
break;
case 's':printf("Enter the first number:\n");
x=get_float();
printf("Enter the second number:\n");
y=get_float();
printf("%.2f-%.2f=%.3f\n",x,y,subtract(x,y));
break;
case 'm':printf("Enter the first number:\n");
x=get_float();
printf("Enter the second number:\n");
y=get_float();
multiply(x,y);
printf("%.2f*%.2f=%.3f\n",x,y,multiply(x,y));
break;
case 'd':printf("Enter the first number:\n");
x=get_float();
printf("Enter the second number:\n");
y=get_float();
while(y==0)
{
printf("The number can't be 0,try again:\n");
y=get_float();
}
printf("%.2f/%.2f=%.3f\n",x,y,divide(x,y));
break;
default:break;
}
}
return 0;
}
char get_choice(void)
{
char ch;
printf("Enter the operation of your choice:\n");
printf("a:add s:subtract\n");
printf("m:multiply d:divide\n");
printf("q:quit.\n");
ch=get_first();
while(ch!='a'&&ch!='s'&&ch!='m'&&ch!='d'&&ch!='q')
{
printf("Please respond with 'a','s','m','d' or 'q':\n");
ch=get_first();
}
return ch;
}
float get_float(void)
{
char ch;
float input;
while(scanf("%f",&input)!=1)
{
while((ch=getchar())!='\n')
putchar(ch);
printf(" is not an float number.\n");
printf("Please enter a number,such as 2.5,-178 or 3:\n");
}
return input;
}
char get_first(void)
{
char ch;
while(isspace(ch=getchar()))
continue;
while(getchar()!='\n')
continue;
return ch;
}
double add(float x,float y)
{
return x+y;
}
double subtract(float x,float y)
{
return x-y;
}
double multiply(float x,float y)
{
return x*y;
}
double divide(float x,float y)
{
return x/y;
}
C Primer Plus 第六版 作者:史蒂芬.普拉塔 中国工信出版社