C Primer Plus第六版 第八章 编程练习

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

上一篇:android读取apk中已经存在的数据库信息


下一篇:call,apply,方法的使用