下面的一些程序要求输入以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 第六版 作者:史蒂芬.普拉塔 中国工信出版社