C语言程序设计课后习题参考答案.docx
《C语言程序设计课后习题参考答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计课后习题参考答案.docx(62页珍藏版)》请在冰点文库上搜索。
C语言程序设计课后习题参考答案
附录G习题参考答案
习题一参考答案
【习题1-1】ABCD
【习题1-2】C
【习题1-3】B
【习题1-4】B
【习题1-5】略
习题二参考答案
一、单项选择题
【习题2-1】~【习题2-6】:
CCDBAA
二、简答题
【习题2-7】:
C语言提供了丰富的数据类型,可以根据这些数据类型构造出不同的数据结构。
C中的数据类型包括基本类型、构造类型、指针类型、空类型等。
其中基本类型包括整型、字符型、实型(浮点型)等。
【习题2-8】:
C中整常数的表示
整型常量即整常数。
C整常数可用以下三种形式表示:
①十进制整数;②八进制整数。
以数字0开头的数是八进制数,如0123表示八进制数123;③十六进制整数。
以0x开头的数是十六进制数。
如0x123,代表十六进制数123。
【习题2-9】:
C规定对所有的变量要“先定义,后使用”,这样规定有以下好处:
(1)便于纠错;
(2)便于编译系统为变量分配存储空间;
(3)运算合法性检查。
【习题2-10】:
C语句可以分为以下五类:
(1)控制语句。
完成一定的控制功能;
(2)函数调用语句;
(3)表达式语句;
(4)空语句;
(5)可以用{}把一些语句括起来成为复合语句。
C只有9种控制语句,它们是:
(1)if()~else~(条件语句)
(2)for()~(转向语句)
(3)while()~(循环语句)
(4)do~while()(循环语句)
(5)continue(结束本次循环语句)
(6)break(中止执行switch或循环语句)
(7)switch(多分支选择语句)
(8)goto(转向语句)
(9)return(从函数返回语句)
【习题2-11】:
表达式不是独立存在的,它存在于其他表达式、语句、函数参数里,表达式后面加上一个分号,就变成表达式语句,如
i=i+1(是表达式,不是语句)
i=i+l;(是语句)
表达式能构成语句是C语言的一个特色。
其实“函数调用语句”也是属于表达式语句,因为函数调用也属于表达式的一种,只是为了便于理解和使用,我们把“函数调用语句”和“表达式语句”分开来说明。
由于C程序中大多数语句是表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。
【习题2-12】:
字符常量就是一个字符,用单引号括起来,占一个字节;而字符串常量是由若干个字符组合而成,用双引号括起来,存贮时自动在后面加“\0”,即使同样是一个字符,字符串常量后面还要加一个“\0”。
【习题2-13】:
(1)12,a;
(2)40,20;(3)113,4b;(4)176627,fd97;(5)177621,ff91;(6)4663,9b3;(7)110022,9012;(8)51013,520b。
三、阅读程序写结果或填空
【习题2-14】:
aabbccabc
AN
【习题2-15】:
261
【习题2-16】:
10
【习题2-17】:
57
57
67.856400,-789.124023
67.856400,-789.124023
67.86,-789.12,67.8564,-789.1240,67.856400,-789.124023
6.78564e+01,-7.9e+02
A,65,101,41
1234567,4553207,d687
65535,177777,ffff,-1
COMPUTER,COM
【习题2-18】:
9,11,9,10
【习题2-19】:
2.5
【习题2-20】:
3.5
【习题2-21】:
(1)14,
(2)10,(3)60,(4)0,(5)0,(6)0
【习题2-22】:
x>-5&&x<5
x>5||x<-5
四、编写程序题
【习题2-23】
main()
{
floatr,h,C1,Sa,Sb,Va,Vb;
scanf("%f,%f",&r,&h);
C1=2*3.14*r;
Sa=3.14*r*r;
Sb=4*Sa;
Va=4*3.14*r*r*r/3;
Vb=Sa*h;
printf("C1=%.2f\n",C1);
printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb);
}
【习题2-24】
main()
{floatF,c;
printf("请输入一个华氏温度:
\n");
scanf("%f",&F);
c=5.0/9.0*(F-32);/*注意5和9要实型表示,否则5/9的值为0*/
printf("摄氏度为:
%5.2f\n",c);
}
【习题2-25】
#include"stdio.h"
main()
{charc1,c2;
printf("请输入两个字符c1,c2:
\n");
c1=getchar();
c2=getchar();
printf("用putchar语句输出结果为:
\n");
putchar(c1);
putchar(’’);
putchar(c2);
printf("用printf语句输出结果为:
\n");
printf("\n%c%c\n",c1,c2);
}
(1)都可以;
(2)用printf()函数;
(3)不是在任何情况下,因为char只有一个字节,而int有2个字节。
能表示的范围不一样。
【习题2-26】:
#include
#definePI3.14159
main()
{
floatr,h,cl,cs,cvz;
printf("Inputr,h:
");
scanf("%f,%f",&r,&h);
cl=2*PI*r;
cs=PI*r*r;
cvz=cs*h;
printf("Thelengthofthecircumference:
%6.2f\n",cl);
printf("areaofthecircle:
%6.2f\n",cs);
printf("volumeofthecolumn:
%6.2f\n",cvz);
}
【习题2-27】:
#include
main()
{
charch;
printf("\nInputaletter:
");
scanf("%c",&ch);
printf("\nASCIItheletter:
%d",ch);
}
习题三参考答案:
一、单项选择题
【习题3-1】~【习题3-6】:
DCADCB。
【习题3-7】:
(1)0;
(2)1;(3)1;(4)0;(5)1。
二、简单题
【习题3-8】:
程序解决问题是按指定的次序执行一系列操作的结果,按照次序执行操作的过程描述称为算法。
算法的特性:
①有穷性;②确定性;③有零个或多个输入;④有一个或多个输出;⑤有效性。
举例:
菜谱操作步骤、乐谱、施工图纸等。
【习题3-9】:
(1)自然语言;
(2)伪代码;(3)流程图;(4)计算机语言。
自然语言通俗易懂,但有歧义性;伪代码方便实用,但没有流程图明晰,容易犯逻辑错误;流程图明晰但绘制和修改时比较繁琐;计算机语言表示算法严谨,但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很多。
【习题3-10】:
顺序结构,由顺序执行的一组语句或者结构组成。
(2)分支结构,根据判断条件,做出取舍,要么执行A分支要么执行B分支,必须执行其中的一个,不可全执行也不可全不执行。
(3)循环结构,由需要反复执行的一段代码或者结构组成。
任何算法功能都可以通过以上三种基本程序结构的组合来实现。
【习题3-11】:
非0为真,0为假。
三、用传统流程图表示求解以下问题的算法
【习题3-12】~【习题3-19】:
如图3-12至图3-19所示。
3-123-133-14
其中的符号“→”表示“倒给”,例如“A→C”“将A瓶中的液体倒给C瓶”。
3-153-163-17
3-183-19
四、编写程序题
【习题3-20】:
#include
main()
{intx,y;
printf("输入x:
");
scanf("%d",&x);
if(x<1) /*x<1*/
{y=x;
printf("x=%3d,y=x=%d\n",x,y);
}
elseif(x<10) /*1≤x-10*/
{y=2*x-1;
printf("x=%3d,y=2*x-1=%d\n",x,y);
}
else /*x≥10*/
{y=3*x-11;
printf("x=%3d,y=3*x-11=%d\n",x,y);
}
}
【习题3-21】:
#include
main()
{longintnum;
intindiv,ten,hundred,thousand,ten_thousand,place;
/*分别代表个位、十位、百位、千位、万位和位数*/
printf("请输入一个整数(0~99999):
");
scanf("%ld",&num);
if(num>9999)place=5;
elseif(num>999)place=4;
elseif(num>99)place=3;
elseif(num>9)place=2;
elseplace=1;
printf("place=%d\n",place);
ten_thousand=num/10000;
thousand=num/1000%10;
hundred=num/100%10;
ten=num%100/10;
indiv=num%10;
switch(place)
{case5:
printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);
printf("\n反序数字为;");
printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);
break;
case4:
printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);
printf("\n反序数字为:
");
printf("%d%d%d%d\n",indiv,ten,hundred,thousand);
break;
case3:
printf("%d,%d,%d",hundred,ten,indiv);
printf("\n反序数字为:
");
printf("%d%d%d\n",indiv,ten,hundred);
break;
case2:
printf("%d,%d",ten,indiv);
printf("\n反序数字为:
");
printf("%d%d\n",indiv,ten);
break;
case1:
printf("%d",indiv);
printf("\n反序数字为:
");
printf("%d\n",indiv);
break;
}
}
【习题3-22】:
(1)用if语句编程序。
#include
main()
{longi;
floatbonus,bon1,bon2,bon4,bon6,bon10;
bon1=100000*0.1; /*利润为10万元时的奖金*/
bon2=bon1+100000*0.075; /*利润为20万元时的奖金*/
bon4=bon2+200000*0.05; /*利润为40万元时的奖金*/
bon6=bon4+200000*0.03; /*利润为60万元时的奖金*/
bon10=bon6+400000*0.015; /*利润为100万元时的奖金*/
printf("请输入利润i:
");
scanf("%ld",&i);
if(i<=100000)
bonus=i*0.1; /*利润在10万元以内按0.1提成奖金*/
elseif(i<=200000)
bonus=bon1+(i-100000)*0.075; /*利润在10万至20万元时的奖金*/
elseif(i<=400000)
bonus=bon2+(i-200000)*0.05; /*利润在20万至40万元时的奖金*/
elseif(i<=600000)
bonus=bon4+(i-400000)*0.03; /*利润在40万至60万元时的奖金*/
elseif(i<=1000000)
bonus=bon6+(i-600000)*0.015; /*利润在60万至100万元时的奖金*/
else
bonus=bon10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/
printf("奖金是%10.2f\n",bonus);
}
此题的关键在于正确写出每一区间的奖金计算公式。
例如利润在10万元至20万时,奖金应由两部分组成:
①利润为10万元时应得的奖金。
即100000*0.1;②10万元以上部分应得的奖金。
即(num-100000)*0.075。
同理,20万~40万这个区间的奖金也应由两部分组成:
①利润为20万元时应得的奖金,即100000*0.1*10万*0.075;②20万元以上部分应得的奖金,即(num-200000)*0.05。
程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。
(2)用switch语句编程序。
输入利润i,确定相应的提成等级branch
#include
main()
{longi;
floatbonus,bon1,bon2,bon4,bon6,bon10;
intc;
bon1=100000*0.1;
bon2=bon1+100000*0.075;
bon4=bon2+200000*0.05;
bon6=bon4+200000*0.03;
bon10=bon6+400000*0.015;
printf("请输入利润i:
");
scanf("%ld",&i);
c=i/100000;
if(c>10)c=10;
switch(c)
{case0:
bonus=1*0.1;break;
case1:
bonus=bon1+(i-100000)*0.075;break;
case2:
case3:
bonus=bon2+(i-200000)*0.05;break;
case4:
case5:
bonus=bon4+(i-400000)*0.03;break;
case6:
case7:
case8:
case9:
bonus=bon6+(i-600000)*0.015;break;
case10:
bonus=bon10+(i-1000000)*0.01;
}
printf("奖金是%10.2f",bonus);
}
【习题3-23】:
#include
main()
{intt,a,b,c,d;
printf("请输入4个整数:
");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("\na=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
if(a>b){t=a;a=b;b=t;}
if(a>c){t=a;a=c;c=t;}
if(a>d){t=a;a=d;d=t;}
if(b>c){t=a;b=c;c=t;}
if(b>d){t=b;b=d;d=t;}
if(c>d){t=c;c=d;d=t;}
printf("排序结果如下:
\n");
printf("%d,%d,%d,%d\n",a,b,c,d);
}
【习题3-24】:
#include
main()
{intp,r,n,m,temp;
printf("请输入两个正整数n,m:
");
scanf("%d,%d",&n,&m);
if(n {temp=n;n=m;m=temp;} /*把大数放在n中,小数放在m中*/
p=n*m; /*先将n和m的乘积保存在p中,以便求最小公倍数时用*/
while(m!
=0) /*求n和m的最大公约数*/
{r=n%m;
n=m;
m=r;
}
printf("它们的最大公约数为:
%d\n",n);
printf("它们的最小公倍数为:
%d\n",p/n);/*P是原来两个整数的乘积*/
}
【习题3-25】:
#include
main()
{charc;
intletter=0,space=0,digit=0,other=0;
printf("请输入一行字符:
\n");
while((c=getchar())!
='\n')
{if(c>='a'&&c<='z'||c>='A'&&c<='z') letter++;
elseif(c=='') space++;
elseif(c>='0'&&c<='9') digit++;
else other++;
}
printf("字母数=%d,空格数=%d,数字数=%d,其他字符数\
=%d\n",letter,space,digit,other);
}
【习题3-26】:
#include
main()
{
inta,b,x,y;
scanf("%d,%d",&a,&b);
x=a*a+b*b;
if(x>100){y=x/100;printf("%d",y);}
elseprintf("%d",a*a+b*b);
}
【习题3-27】:
#include
main()
{
intx;
scanf("%d,",&x);
if(x%5==0&&x%7==0)printf("Yes");
elseprintf("No.");
}
【习题3-28】:
#include
main()
{
intx;
floaty;
scanf("%d,",&x);
if(x<0)y=0;
elseif(x>0&&x<=10)y=x;
elseif(x>10&&x<=20)y=10;
elseif(x>20&&x<40)y=-0.5*x+20;
elsey=-1;
if(y!
=-1)printf("%f",y);
elseprintf("Error!
\n");
}
【习题3-29】:
#include
main()
{
intx;
scanf("%d,",&x);
if((x%3==0)&&(x%5==0)&&(x%7==0))
printf("%dcanbedividedby3,5,7\n",x);
elseif((x%3==0)&&(x%5==0))
printf("%dcanbedividedby3,5,\n",x);
elseif((x%3==0)&&(x%7==0))
printf("%dcanbedividedby3,7\n",x);
elseif((x%5==0)&&(x%7==0))
printf("%dcanbedividedby5,7\n",x);
elseif(x%3==0)
printf("%dcanbedividedby3\n",x);
elseif(x%5==0)
printf("%dcanbedividedby5\n",x);
elseif(x%7==0)
printf("%dcanbedividedby7\n",x);
elseprintf("%dcannotbedividedby3,5,7\n",x);
}
【习题3-30】:
#include
main()
{
floatx;
inty;
printf("\ninputx:
");
scanf("%f",&x);
switch(x<0)
{
case1:
y=-1;break;
case0:
switch(x==0)
{case1:
y=0;break;
defaut:
y=1;
}
}
printf("\ny=%d",y);
}
【习题3-31】:
#include
main()
{
intscore,temp,log;chargrade;
log=1;
while(log)
{
printf("enterscore:
");
scanf("%d",&score);
if(score>100||score<0)
printf("\nerror,tryagain!
\n");
elselog=0;
}
if(score==100)temp=9;
elsetemp=(score-score%10)/10;
switch(temp)
{
case0:
case1:
case2:
case3:
case4:
case5:
grade='E';break;
case6:
grade='D';break;
case7:
grade='C';break;
case8:
grade='B';break;
case9:
grade='A';break;
}
printf("score=%d,grade=%c\n