第一篇:《C语言程序设计教程》课后题答案
《C语言程序设计教程》课后题答案
第一章
一选择题
1.A 2.B 3.C 4.D 5.B 6.C 二.填空题 1.程序 2.算法
3.main或主 4.编译 5.编译 6..obj 7.库函数
8.文本或ASCII码
三、编程题
1.参考代码如下: #include
printf(“金n木n水n火n土n”);} 2.参考代码如下: #include
scanf(“%d%d”,&a,&b);
printf(“%d+%d=%dn”,a,b,a+b);
printf(“%d-%d=%dn”,a,b,a-b);
printf(“%d*%d=%dn”,a,b,a*b);
printf(“%d/%d=%dn”,a,b,a/b);} 3.参考代码如下: #include
float a,b,h,s;
scanf(“%f%f%f”,&a,&b,&h);
s=(a+b)*h/2;
printf(“s=%fn”,s);}
第二章
一选择题 答案及分析: 1.B,略
2.A,-8在内存中是以补码(设两个字节)形式存储的 3.A,C语言有32个关键字(参见课本第18页),且C语言标识符是区分大小写字母的 4.A,略
5.D,八进制数据中不能出现数码8 6.B,字符常量应该用单引号括起来,答案D超出了ASCII取值范围(ASCII的取值范围为[0,255])
7.C,该字符串中转义字符有三个:、22和 n,普通字符有三个:a、,和0,所以字符串长度为6 8.C,略
9.D,C语言没有read函数和%D格式符号,且scanf函数第二个形参为地址列表
10.B,根据题意,scanf函数输入数据时分隔符号不应该是逗号,应该是空格或回车符,且输入数据时分一行或几行均可
11.A,scanf函数中不允许出现%8.4,%6.2和%8这样的格式符号
12.C,既要保证5位小数位,还得保证整数位不变,这样数据12345.67800用10列不能完全显示出来,按C语言规定,12345.67800原样输出
13.B,printf函数中格式符号%d,%o,%x表示对应的整型数据分别按十进制,八进制和十六进制输出
14.C,按C语言规定,scanf函数形参双引号中,如果包含非格式符号,在输入数据时要求原样输入 二.填空题 答案及分析:
1.int
float
double(略)
2.65,89,printf函数中如果格式符号是%d,则输出相应字符的ASCII十进制数值
3.a=98,b=765.000000,c=4321.000000,scanf函数中的格式符号%2d%3f%4f,表示将键盘输入的数据9876543210按2,3,4位分割,然后再分别赋给变量a,b,c 4.scanf(“%lf%lf%lf”,&a,&b,&c);double类型的变量对应的格式符号是%lf
三、编程题
1.参考代码如下: #include
int a=97;
printf(“%cn”,a);
printf(“%dn”,a);
printf(“%on”,a);
printf(“%xn”,a);} 程序分析:通过printf函数中不同的格式符号,即%c(字符),%d(十进制),%o(八进制),%x(十六进制)输出相应的值。2.参考代码如下: #include
int h,m,minute;
scanf(“%d:%d”,&h,&m);
minute=h*60+m;
printf(“minute=%dn”,minute);} 程序分析:输入形式为10:27,故scanf函数双引号中两个格式符号%d之间必须加入“:”。3.参考代码如下: #include
float r=6371000,s,v;
s=4*3.1415926*r*r;
v=3.1415926*4/3*r*r*r;
printf(“s=%fnv=%f”,s,v);} 程序分析:C语言中的π不代表3.1415926,可以用各种常量的形式体现出来。4.参考代码如下: #include
int m100,m50,m20,m10,m5,m1,m;
scanf(“%d”,&m);
m100=m/100;
m50=(m-m100*100)/50;
m20=(m-m100*100-m50*50)/20;
m10=(m-m100*100-m50*50-m20*20)/10;
m5=(m-m100*100-m50*50-m20*20-m10*10)/5;
m1=m-m100*100-m50*50-m20*20-m10*10-m5*5;
printf(“%d元发工资,人名币各票面的张数为:n”,m);
printf(“100元的张数:%dn”,m100);
printf(“50元的张数:%dn”,m50);
printf(“20元的张数:%dn”,m20);
printf(“10元的张数:%dn”,m10);
printf(“5元的张数:%dn”,m5);
printf(“1元的张数:%dn”,m1);} 程序分析:人民币的面值分别为100元,50元,20元,10元,5元和1元,工资4367元除以100后得到的商就为100元张数,余数再除以50,得到的商为50元的张数,余数再除20,„„,以此类推就会得出人民币各面值相应的张数。5.参考代码如下: #include
float r1,r2,r3,r;
scanf(“%f%f%f”,&r1,&r2,&r3);
r=r1*r2*r3/(r1*r2+r2*r3+r1*r3);
printf(“三个电阻并联后的总电阻为%fn”,r);} 程序分析:首先将计算并联电阻值的公式变换一下;再就是考虑要保留小数位,故变量类型设置为实型,注意格式符号为%f。6.参考代码如下: #include
int x,a,b,c,d,y;
scanf(“%d”,&x);
a=x%10;
b=x/10%10;
c=x/100%10;
d=x/1000;
y=a*1000+b*100+c*10+d;
printf(“%d逆置各位数后的值为%dn”,x,y);} 程序分析:1234除以10的余数就是4,商再除以10的余数就是3,1234除以100再除以10取余就是2,1234除以1000就是1。也可以用其他的表达式求出各位数值,例如输入数据1234中的4,可以用公式a=x-d*1000-c*100-b*10来计算。7.参考代码如下: #include
float F,C;
printf(“请输入华氏温度:”);
scanf(“%f”,&F);
C=5.0/9*(F-32);
printf(“华氏温度%f对应的摄氏温度为%fn”,F,C);} 程序分析:5/9的值为0,所以要写成5.0/9,5/9.0或5.0/9.0,还要注意变量类型为实型,且对应的格式符号为%f。8.参考代码如下: #include
char ch1,ch2,ch3;
printf(“请输入三个数字字符:”);
scanf(“%c%c%c”,&ch1,&ch2,&ch3);
printf(“将数字字符转换为数字%d,%d,%dn”,ch1-'0',ch2-48,ch3-'0');} 程序分析:通过键盘输入三个数字字符时要连续输入,不要加任何分隔符号,例如121等,另外,数字字符输出时遇到格式符号%d将输出相应数字字符的ASCII值,但任何一个数字字符的ASCII值减去字符0的ASCII值,再对应%d格式符号输出时,就是数字字符对应的数字,例如'2'-'0'=2。
9.不能得到指定的输出结果,参考代码如下: void main(){
int a, b, c,x, y;
scanf(“%d%d%d”,&a,&b,&c);
x=a*b;
y=x*c;
printf(“a=%d,b=%d,c=%dn”,a,b,c);
printf(“x=%d,y=%dn”,x,y);}
程序分析:scanf(“%d,%d,%d”,a,b,c);scanf函数第二类形参是地址列表,所以语句改为scanf(“%d,%d,%d”,&a,&b,&c);而这个语句对应的键盘输入形式为2,3,4。为了满足题目要求,scanf语句改为scanf(“%d%d%d”,&a,&b,&c)。另外,printf函数双引号只能出现一对,且双引号中需要在相应的位置上添加a=等这样的字符串才能原样输出;还有整型变量对应格式符号是%d等。
第三章
一选择题
1.A 2.C 3.C 4.D 5.C 6.B 7.C 8.B 9.A 10.A 11.A 12.B 13.D 14.A 15.B 16.C 17.C 18.C 19.C 20.C 21.C 22.B 23.C 24.C 25.A 26.B 27.A 28.A 29.C 30.A 31.C 32.C 二.填空题 1.非零
零 2.passwarm 3.525252 4.fabs(x)>5 5.x%y==0 6.if((1<=x&&x<=10||200<=x&&x<=210)&&x%2==1)printf(“%d”,x);7.k=1 8.Right!1
Right!1 9.$$$ a=0 10.a=2,b=1 11.0 “%f%f” a=b;13.“%c”,&ch 'A'<=ch&&ch<='Z' ch 14.死循环 15.345 16.7 3-1 17.x>=0 x j%3!=0 24.b=i+1 25.8 5 2 26.d=1.0 k++ k<=n 三、编程题 1.参考代码如下: #include y=x;else if(x==0) y=x-1;else if(x>0&&x<10) y=x+1;printf(“y=%f”,y);} 2.参考代码如下: #include float a,b,c; printf(“请输入三角形三边的长度:n”); scanf(“%f%f%f”,&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b) if(a==b&&a==c) printf(“该三角形是等边三角形n”); else if(a==b&&a!=c) printf(“该三角形是等腰三角形n”); else printf(“该三角形是一般三角形n”); else printf(“不能构成三角形n”);} 3.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 4.参考代码如下: #include float M,N,menoy; int in; printf(“请输入购买金额:”); scanf(“%f”,&M); in=M/100; switch(in) { case 0:N=0;break; case 1:N=1.5;break; case 2:N=2.5;break; case 3:N=3.5;break; case 4:N=4.5;break; case 5:N=5.5;break; default :N=6;break; } menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 5.参考代码如下: #include float x,max; printf(“Enter a number:”); scanf(“%f”,&x); max=x; while(x>0) { printf(“Enter a number:”); scanf(“%f”,&x); if(x>max) max=x; } if(max>0) printf(“The largest number entered was %fn”,max);} 6.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); while(M>0) { if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy); printf(“请输入购买金额:”); scanf(“%f”,&M); } } 7.参考代码如下: #include float number,positivesum=0,negativesum=0,total=0; int i; for(i=1;i<=10;i++) { scanf(“%f”,&number); if(number>=0)positivesum+=number; else negativesum+=number; total+=number; } printf(“positive sum %f,negative sum %f,total %fn”,positivesum,negativesum,total);} 8.参考代码如下: #include int i,sum=0,k=1; for(i=1;i<=101;i+=2) { sum=sum+k*i; k=-k; } printf(“1-3+5-7+...-99+101=%dn”,sum);} 9.参考代码如下: #include float i,sum=0,k=1; for(i=1;k>=1e-4;i++) { sum=sum+k; k=k/i; } printf(“e=%fn”,sum);} 10.参考代码如下: #include float i,sum=0,n=2,d=1,temp; for(i=1;i<=20;i++) { sum=sum+n/d; temp=n; n=n+d; d=temp; } printf(“sum=%fn”,sum);} 11.参考代码如下: #include float apple,watermelon,pear; for(apple=1;apple<100;apple++) for(watermelon=1;watermelon<10;watermelon++) { pear=100-apple-watermelon; if(fabs(apple*0.4+watermelon*4+pear*0.2-40.0)<1e-6) printf(“apple:%.0f,watermelon:%.0f,pear:%.0fn”,apple,watermelon,pear); } } 12.参考代码如下: #include int i,j,k; for(i=1;i<10;i++) for(j=0;j<10;j++) for(k=0;k<10;k++) if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf(“%dn”,i*100+j*10+k);} 或: #include int a,b,c,i; for(i=100;i<1000;i++) { a=i/100; b=i/10%10; c=i%10; if(i==(a*a*a+b*b*b+c*c*c)) printf(“%dn”,i); } } 13.参考代码如下: #include int a,b,c,d; for(a=1;a<10;a++) for(b=0;b<10;b++) for(c=0;c<10;c++) for(d=0;d<10;d++) if(a*1000+b*100+c*10+d==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,a*1000+b*100+c*10+d);} 或: #include int a,b,c,d,i; for(i=1000;i<10000;i++) { a=i/1000; b=i/100%10; c=i/10%10; d=i%10; if(i==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,i); } } 14.参考代码如下: #include int i,j; for(i=1;i<=4;i++)//先控制打印前4行 { for(j=1;j<=4-i;j++) printf(“ ”); for(j=1;j<=2*i-1;j++) printf(“*”); printf(“n”); } for(i=1;i<=3;i++)//再控制打印后3行 { for(j=1;j<=i;j++) printf(“ ”); for(j=1;j<=2*(4-i)-1;j++) printf(“*”); printf(“n”); } } 第四章 一选择题 1.A,如果没有给s[1]赋值,按C语言规定,s[1]下标变量中的数据是一个随机数 2.C,“China”字符串末尾还有一个 ,故占6个字节 3.D,scanf函数中格式符号若是%c,则把输入的第一个字符'1'赋给变量c,然后遇到格式符号%d,则把后续的23(遇到空格结束)赋值给变量i,遇到格式符号%s,则把后续的字符串“456”(遇到空格结束)赋值给变量s 4.D,C语言规定,数组在定义时就已经分配好了所占内存空间,所以int x[5]在内容中占的字节数为4*5=20 5.B,内层循环变量j每次都从0开始,使得在外层循环变量i每取一个值时,n[0]和n[1]的值都得重新计算 6.B,这是求十进制数18对应二进制数的程序,将每次18除以2得到的余数依次放到数组a[0]到a[4]中,最后按a[4]到a[0]这样的顺序输出 7.B,第一个for循环给a[0]到a[9]赋值为0到9,第二个for循环给p[0]到p[2]赋值为0,2,6,第三个for循环使k=k+p[0]*2+p[1]*2+p[2]*2=5+4+12=21 8.D,C语言规定,定义二维数组时不能省略第二维下标值,但可以省略第一维下标值 9.B,略 10.A,每行的第4列元素的值都为0 11.C,略 12.D,C语言规定,字符数组不能用s=“abcd”这样的赋值语句赋值 13.C,float类型的变量对应格式符号通常为%f,不是%d 14.A,每行的第3列元素的值均为0 15.D,略 16.C,A这种赋值形式无法放置字符串末尾的 ,B和D不符合C语言规定,即字符数组不能用s=“good”这样赋值语句赋值 17.A,这是字符数组str初始化的形式,str[0]到str[5]分别为字符s,t,r,i,n,g,str[6]到str[11]的值均为 ,函数strlen是统计字符串包含字符的个数,遇到 (不包括 )结束,所以str长度为6 18.C,x数组比y数组多了一个字符 19.A,数组名就是数组第一个元素的地址,所以scanf(“%s”,&s);中得删除数组名前面的& 20.D,puts和putchar函数只有一个参数,printf函数中格式符号%s应该对应的是数组名 21.D,程序功能是输出第2和第3个字符串 22.A,双层循环完成的功能是求s的值,s=(((a[0][0]*10+a[0][2])*10+a[1][0])*10+a[1][2]=(((6*10+3)*10+8)*10+5=6385 二.填空题 1.a=1234 b=5 答案分析:C语言规定,使用scanf函数通过键盘输入数据时,除了格式符号和转义字符,其他符号要原样输入。 2.Hello 答案分析:b[5]=0等于b[5]= ' ',是因为字符 的ASCII值就是0,而printf(“%sn”,b);的功能是输出字符串,但遇到空格或 等字符时结束输出,所以答案为Hello。 3.j<3;b[j][i]=a[i][j];i<3 答案分析:通过两个数组下标变量位置的变换来完成程序功能。 4.a[age]++ i=18;i<=25 答案分析:用数组a来存储每个年龄段的人数,并通过a[age]++来实现。5.c[i]=n%base;b[d] 答案分析:十进制整数转换为n进制采用的是除以n取余法,使用变量base存放某个进制的值,c数组存放每次计算的余数。最后一个for循环输出不同进制所对应的数码符号。6.break;i>=8 答案分析:如果找到某个数,则通过break语句终止循环。7.-850,2,0 答案分析:程序功能是查找并输出二维数组中最小值及其下标值。8.a[i]>b[j] i<3 j<5 答案分析:数组a和b的长度可以相等或不等,通过i<3或j<5来看哪个数组的值还没有放进c数组中。 9.a[i][j] j=0;j<4;j++ j==3 printf(“n”); 答案分析:用数组a最后一列,即第4列来保存每行的和,通过printf(“n”);语句来控制按3行来输出。10.fi 答案分析:略 11.GDABC 答案分析:略 12.s[i++] 答案分析:while(s[i])表示当s[i]中的字符不为 时进入循环体,否则退出while循环。 13.ahAMa 答案分析:通过scanf(“%s”,a);给字符数组赋值时遇到空格或回车符号将终止输入。程序功能是将字符串中的字符a,大写变成小写,小写变成大写,其他字符保持不变。14.LBLMNP 答案分析:执行strcat(a,b);语句后,a数组的值为“ABLMNP”,b数组的值为“LMNP”;在执行while(a[j++]!=0)b[j]=a[j];时,b[j]中的j值是前面a[j++]中j++执行后的值,即while循环首先执行b[1]=a[1]= 'B',然后是b[2]=a[2]= ' L',b[3]=a[3]= 'M',„„,b[0]中的字符保持不变,仍是' L'。15.' ' i++ 答案分析:因为while(str[i])是通过字符串末尾的 来判断字符串是否读取结束,所以字符数组str最后要有一个字符串结束符号 。16.b[j]=a[j][0];b[j]=a[j][k] 答案分析:用b数组存储每行中的最大字符,最终b[0]存放第一行字符中的最大字符,b[1] 存放第一行字符中的最大字符,„„。b[j]=a[j][0]的作用是在查找一串字符中最大字符前,先把这串字符第一个字符放到b[j]中,然后通过循环和条件判断来实现最大字符的查找。17.a[k++]=a[j] 答案分析:略 三、编程题 1.参考代码如下: #include int array[31],total=0; int i,j=1; for(i=0;i<30;i++) { array[i]=2*j; j++; total=total+array[i]; } array[30]=total/30; for(i=0;i<31;i++) printf(“%d,”,array[i]);} 答案分析:由于平均值要放在数组array的末尾,所以在定义数组时要多定义一个元素,即array[31]。另,为了保持数组类型一致性,故平均值也只取整数值。2.参考代码如下: #include int i,j,k,a[20],temp; srand(time(NULL)); for(i=0;i<20;i++) { a[i] = rand()% 101;//产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); for(i=0;i<19;i++) { k=i; for(j=i+1;j<20;j++) if(a[j] if(k!=i)temp=a[i],a[i]=a[k],a[k]=temp; } for(i=0;i<20;i++) printf(“%d ”,a[i]);} 程序分析:略 3.参考代码如下: #include int i,maxi,a[30]; srand(time(NULL)); for(i=0;i<30;i++) { a[i] = rand()% 101; //产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); maxi=0; for(i=1;i<30;i++)