c语言程序设计第五版习题答案 下载本文

bonus=i*0.1; else if(i<=)

bonus=bonus1+(i-)*0.075; else if(i<=)

bonus=bonus2+(i-)*0.05; else if(i<=)

bonus=bonus4+(i-)*0.03; else if(i<=)

bonus=bonus6+(i-)*0.015; else

bonus=bonus10+(i-)*0.01; printf(\ }

3.由键盘输入三个整数a、b、c,用条件运算符求出其中最大值和最小值。

【分析与提示】首先比较输入的a,b 的大小,并把大数装入max, 小数装入min 中,然后再与c 比较,若max 小于c,则把c 赋予max;如果c 小于min,则把c 赋予min。因此max 内总是最大数,而min 内总是最小数。最后输出max 和min 的值即可。

参考代码: main( ) {

int a,b,c,max,min;

scanf(\max=a>b?a:b ;

max=max>c?max:c; min=a

min=min

printf(\最大值为:%d,最小值为:%d\\n\}

4.有一函数:

x (x<1) y= 2x-1 (1≤x<10)

3x-11 (x≥10)

编一程序,输入一个x值,输出y值。

【分析与提示】本题考查if语句的嵌套,应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if 配对。

参考代码:

main( ) { float x,y;

printf(\请输入x的值 \\n\scanf(\if(x<1) y=x; else

if(x>=10) y=3*x-11;

16

else y=2*x-1;

printf(\}

5.从键盘上输入星期号,并显示该日期的英文名字。 【分析与提示】本实例知识点:switch语句。

switch语句的控制流程是:首先计算表达式的值,然后依次与每一个case中的常量值进行比较,一旦发现了某个能够匹配的值,就执行该case后面的语句组,直到遇到break语句为止。如果表达式的值与所有case中的常量都不匹配,则执行default后面的语句组。

参考代码:

main( ) { int xqh; char ywm;

printf(\请输入星期号(1~7):\\n\scanf(\switch(xqh)

{ case 1: printf(\ case 2: printf(\ break; case 3: printf(\ break; case 4: printf(\ break; case 5: printf(\ break; case 6: printf(\case 7: printf(\ default:printf(\}

}

6.某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元/公里,3公里以外2.1元/公里;富康8元/公里,3公里以外2.4元/公里;桑塔纳9元,3公里以外2.7元/公里。编程:从键盘输入乘车的车型及行车公里数,输出应付车资。

【分析与提示】可设三个变量,分别表示乘车的车型、行车公里数和应付车资,根据乘车的车型和行车公里数,计算出应付的车资。

参考代码:

main( ) {

int cx; /*定义乘车的车型变量cx */

float gl, cf; /*定义行车公里数变量gl、应付车资变量cf */ printf(\夏利\\n \\t2-富康\\n \\t3-桑塔纳\\n\printf(\请输入车型(1-3): \scanf(\

printf(\请输入行车公里数: \scanf(\switch(cx)

17

{ case 1: if(gl<=3) cf=7.0;

else cf=7+(gl-3)*2.1 ;break;

case 2: if(gl<=3) cf=8.0;

else cf=8+(gl-3)*2.4 ;break;

case 3: if(gl<=3) cf=9.0;

else cf=9+(gl-3)*2.7 ;

}

printf(\应付车资为%.1f\\n\

}

7.给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。如原数为12345,则逆序为54321。

【分析与提示】本题的思路是:设5个变量,分别代表个位、十位、百位、千位和万位。从个位起,依次将各个位取出来,按取出的顺序组合成新的数据,并记录当前取出的数字的个数。

参考代码:

#include \main( ) {

unsigned x,m,n=0,w=0;

unsigned ge=0,shi=0,bai=0,qian=0,wan=0; printf(\请输入一个正整数\scanf(\m=x;

ge=m; m=m/10; w=1; n=ge; if(m)

{shi=m; m=m/10; w=2; n=n*10+shi; if(m)

{bai=m; m=m/10; w=3; n=n*10+bai; if(m)

{qian=m; m=m/10; w=4; n=n*10+qian; if(m)

{wan=m; w=5; n=n*10+wan;} } } }

printf(\为%u位数\printf(\正整数的原序为:%u\printf(\正整数的逆序为:%u\

}

注:当该程序输入一个较大的5位数时,输出结果就不正确了,思考为什么?动手试一下怎样修改该程序。

第5章 循环结构程序设计

18

一、填空题

1.下面程序的功能是用“辗转相除法”求两个正整数的最大公约数。请填空。 #include main() {

int r,m,n;

scanf(\,&m,&n); if(m

【分析与提示】辗转相除法:两数相除,若不能整除,则以除数作为被除数,余数作为除数,继续相除,直到余数为0时,当前除数就是最大公约数。 【解答】(1)r=m;m=n;n=r; (2)r=m%n;

二.运行程序写结果

1.下列程序运行的运行结果为 。 #include main() {

int y=10; do {y--;

}while(--y);

printf(\,y--);

【分析与提示】注意 y-- 与y--的运算顺序。 【解答】 0

2.下列程序运行的运行结果为 。 main() {

int x=3,y=6,z=2; while(x++!=(y-=1)) { z+=1; if(y

printf(“%d,%d,%d\\n”,x,y,z); } }

【解答】4,5,3

3.下列程序运行的运行结果为 。 main() {

19

int a=1,b=0; for( ;a<3 ;a++) switch(a++) {

case 1:b--; case 2:b++;

case 3:b+=3;break; }

printf(“%d\\n”,b); }

【解答】3

4.下列程序运行的运行结果为 。 main() {

int x=10,y=10,i; for(i=0;i<2 ;y=i++) printf(“MM”,x--,y); }

【解答】10 10 9 0 三. 编程题

1.求s=1+2+4+8+…+64的值。

【分析与提示】本题为数学项求和问题,数学项间的关系为:第n项的值为第n-1项的值2倍。参考代码:

main( ) {

int i,s=0,t=1; while(t<=64) { s=s+t; t=2*t; }

printf(\ }

2.求s=1+1/2+1/3+…+1/100的值。

【分析与提示】本题为分数数学项求和问题,要想得到每一项的正确结果,分式中的分子、分母至少要有一个为实型数据。

参考代码: main( )

{int i;

float s=0,t;

for(i=1;i<=100;i++) { t=1.0/i;

s=s+t;

}

printf(\

20