C程序设计第17章部分习题参考答案.docx
《C程序设计第17章部分习题参考答案.docx》由会员分享,可在线阅读,更多相关《C程序设计第17章部分习题参考答案.docx(18页珍藏版)》请在冰点文库上搜索。
![C程序设计第17章部分习题参考答案.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/6469a9dc-87ae-4f3b-bc38-09a5feca3d8c/6469a9dc-87ae-4f3b-bc38-09a5feca3d8c1.gif)
C程序设计第17章部分习题参考答案
课后习题解答(第1-7章)
第一章
1_1.
1_1_2判断正误:
即使两个整型数据未超出该数据的取值范围,它们的和也可能会超出该数据取值范围。
正确。
1_1_4判断正误:
一个C程序可以有多个函数,其中主函数必须在程序的最开头。
错误。
其它函数如果要在主函数中使用的话,必须先在主函数之前定义或者声明。
1_1_6判断正误:
若有定义“floatx=1.3;”,则表达式(int)x的值为1,因此可以说x中存放的值就是1。
错误。
(int)x表达式的值与x的值是不一样的,前者是对x取整后的数值,而取整运算对x自身的值不会产生影响。
1_1_8判断正误:
若有命令行“#defineN1000”,则N++是不合法的表达式。
正确。
N为符号常量,不能对符号常量进行修改。
1_1_10C程序是由函数构成的,一个C程序必须有一个主函数。
1_1_12 以下变量中不合法的是②、④、⑥,合法的是①、③、⑤、⑦、⑧。
①name ②double ③Int ④if ⑤for_1 ⑥2k ⑦a12345678 ⑧_a
1_1_14 下面程序段的输出结果是1,1.000000
inta;doubleb;
a=b=123/100%2;
printf("%d,%f",a,b);
1_1_16 a*a*a*b*b/(c-d)
1_1_20 假设圆柱体的底面半径为r(=2.5),高为h(=3.5),请按下面给定的步骤编写求体积(体积=底面积X高)的程序。
①定义变量r,h,v(存放体积值),注意变量的数据类型。
②给变量r,h赋值。
③计算体积,并将结果存放在v中。
④输出r,h,v的值。
程序如下:
#include
#definePI3.1415926
main()
{
float r,h,v;
r=2.5;
h=3.5;
v=PI*r*r*h;
printf("r=%f,h=%f,v=%f\n",r,h,v);
}
1_1_22 编写输出以下图形的程序。
**
###
3333
程序如下:
#include
main()
{
printf("**\n");
printf("###\n");
printf("%-2d%-2d%-2d%-2d\n",3,3,3,3);
}
1_2
1_2_2下面程序段的输出结果是a=3,b=-27
inta=10,b=10;
a+=b-=a*=b/=3;
printf("a=%d,b=%d",a,b);
本题考查复合赋值运算符及其运算过程。
(从右到左运算,运算过程中变量的值会发生改变)
1_2_4下面程序段的输出结果是a=10,b=10,c=12,d=11
inta=10,b=10,c,d;
c=(++a,b++,a++,++b);/*该语句从整体来看完成一个赋值运算,而赋值运算的右侧表达式则是作逗号运算*/
d=--a,b--,--a,b--;/*这个语句从整体来看是作逗号运算,逗号运算的第一个子表达式是赋值运算,其它三个是自减运算*/
printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);
本题考查逗号运算,自加自减运算符以及它们与括号、赋值运算符等各种运算符的运算优先级次序。
1_2_6语句printf("%d",32766+5);的输出结果是-32765
第二章
2.1基础部分习题
2_1_1.判断正误:
程序中的所有语句都被执行一次,而且只能执行一次。
错误。
循环结构中循环体部分的语句就可执行多次,分支结构中只能选择其中的一个子句执行。
2_1_2.判断正误:
在C语言中,任何表达式的尾部加上一个分号就可以构成语句。
正确。
2_1_4.编写程序输出12.5X3.4的值(要求:
不使用变量);
#include
main()
{
printf("%f",12.5*3.4);
}
2_1_6
改正后的程序:
#include
main()
{
intm,h;
h=500/60;
m=500%60;
printf("500分钟是%d小时%d分钟",h,m);
}
2_1_8
#include
main()
{
char x,y,t;
x=getchar();
y=getchar();
printf("交换前:
x=%c,y=%c",x,y);
t=x;
x=y;
y=t;
printf("交换后:
x=%c,y=%c",x,y);
}
2_2提高部分习题
2_2_2已有定义“inta;doubleb;charc;"和语句"scanf("%d%lf%c",&a,&b,&c);",若通过键盘给变量a、b、c分别赋值12,3.4和字符A,其正确的输入形式为12 3.4A
第三章
3_1 基础部分习题
3_1_1.判断正误:
逻辑运算符两侧的运算量可以是任何类型的数据。
正确。
进行逻辑运算时,如果运算量是0值则被看成是逻辑值为0,非0值则被看作逻辑值1,最后的计算结果要么为0,要么为1(具体计算过程按逻辑运算规则进行)。
3_1_2.判断正误:
关系表达式和逻辑表达式的值只能是0或1。
正确。
关系运算和逻辑运算的结果要么为真要么为假,在C语言中分别用1和0表示。
3_1_4.能正确表示0≤a≤10的逻辑表达式是a>=0&&a<=10
3_1_6.如果字符变量c中的字符为大写英文字母,则转换为小写英文字母的语句是c+=32;
3_1_8.下面程序段的输出结果是1,1
charch='b';intx,y;
x=ch=='B'+'a'-'A';
y='0'||'1'-'1';
printf("%d,%d",x,y);
解答:
对于x=ch=='B'+'a'-'A',首先要清楚运算符计算的优先次序(从整体来看是执行一个赋值运算,而赋值运算符右边的表达式是执行一个关系运算,关系运算的左侧变量ch值为'b',右侧为算术表达式(对于字符型数据的算术运算和关系运算等都是依据各字符的ASCII码值进行,因此该表达式的值为'b'),从而赋值运算右侧关系表达式值为1,x即被赋值为1)。
对于y='0'||'1'-'1',逻辑运算符两侧的运算量要先转换为0或1值。
对于字符‘0’,由于其ASCII码值48为非0值,因此||右边的运算不用再进行,整个逻辑表达式结果为1,则y被赋值1。
3_1_10.下面程序段的输出结果是BBBCCC
该题主要考查switch结构,要注意各case子句中有无break语句的区别。
3_2 提高部分习题
3_2_2.下面程序段的输出结果是2
该题考查条件运算符?
:
,它的一般形式是:
表达式1?
表达式2:
表达式3
当表达式1的计算结果为非0值(即它所表达的条件为真)时,运算结果取表达式2的值,否则取表达式3的值。
第四章
4_1基础部分习题
4_1_2判断正误:
由于表达式x%3!
=0和x%3的值相等,所以while(x%3!
=0)和while(x%3)等价。
错误。
条件存在问题,故因果关系不成立。
因为x%3!
=0的值只能为0或者1,而x%3的值可为0,1或2。
4_1_4若分别运行以下程序段,从键盘输入eor(表示回车),则运行后v1和v2的值分别是2,2
4_1_6下面程序段的输出结果是4
4_1_8 i%7==0
4_1_10
#include
main()
{
inti=33;
while(i<=122)
{
printf("%c,%3d,%3o,%-4x",i,i,i,i);
if((i-33+1)%4==0)
printf("\n");
i++;
}
}
4_1_12
#include
main()
{
charch;
printf("Inputdata:
");
ch=getchar();
do
{
if(ch>='A'&&ch<='Z')
ch=ch+32;
if(ch>='a'&&ch<='z')
{
ch=ch+2;
if(ch>'z')ch=ch-26;
}
putchar(ch);
ch=getchar();
}while(ch!
='#');
}
4_1_14
提示:
如果要通过数据验证一个程序是否正确,应该将各种可能的情况都考虑到。
如输入的字符串数据可能出现的情况有:
所有字符都为大写字母,所有字符都为小写字母,大小写字母混合,所有字符不是字母,大写字母与其它字符混合等等。
4_1_15
#include
main()
{
intn=0,sum=0;
do
{
n++;
sum+=n;
}while(sum<1000);
sum-=n;
n--;
printf("n=%d,sum=%d\n",n,sum);
}
4_1_16
#include
main()
{
intn,sum=0;
for(n=2;sum<=1000;n+=2)
sum+=n;
n-=2;
printf("n=%d,sum=%d\n",n,sum);
}
或者
#include
main()
{
intn,sum=0;
n=0;
while(sum<=1000)
{
n+=2;
sum+=n;
}
printf(“n=%d,sum=%d\n”,n,sum);
}
/*注意:
在第二个程序中,由于n+=2是在sum+=n之前完成的,故循环退出后不用执行语句n-=2*/
4_1_18
#include
main()
{
inty2,y1,i=0;
for(y2=1;y2<=4;y2++)
for(y1=2;y1<=8;y1+=2)
if(y2*20+y1*10==100)
{i++;
printf("第%d种方案:
(y2=%d,y1=%d)\t",i,y2,y1);
}
}
或者
#include
main()
{
inty2,y1,i,n=0;
for(y2=1;y2<=4;y2++)
{
y1=(100-y2*20)/10;
if(y1*10+y2*20==100)
{
n++;
printf("第%d种方案:
%d张20元,%d张10元",n,y2,y1);
}
}
}
4_1_20
#include
main()
{
inti,j,n;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
printf(”%-2d”,i);
printf(”\n”);
}
}
4_2_2
错误。
应将for(a>0)改为for(;a>0;)或者while(a>0)
4_2_4
#include
main()
{
inti,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%-4d",i,j,i*j);
printf("\n");
}
}
第五章
5_1基础部分习题
5_1_2判断正误:
在以下定义中,数组a的长度和数组b的长度相等。
chara[]=”1234567”;
charb[]={‘1’,’2’,’3’,’4’,’5’,’6’,’7’};
错误。
数组a的长度是8(字符串结束符’\0’要占用一个数组单元),而数组b的长度是7。
5_1_4判断正误:
若有定义“chara[10];”则可用“a=”abcdef”;”给数组赋值。
错误。
数组定义完后,不能直接用赋值语句给数组名赋值,数组名记录数组在内存中所分配空间的首地址,它是一个地址常量。
5_1_6执行以下程序段后的输出结果是123,数组b中的内容为123\0EF\0。
5_1_8执行以下程序段后,k的值为5。
解答:
字符数组b中的有效字符串信息为”0807\07”,其中’\07’被看作是八进制ASCII码值为07所对应的字符。
在数组b中该字符的后面\08应该被看成是两个字符,它们分别是’\0’和’8’。
5_1_10
#include
main()
{
chara[30],temp;
inti,j,k,len;
gets(a);
len=strlen(a);
for(i=0;i{
k=i;
for(j=i+1;jif(a[j]>a[k])
k=j;
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
puts(a);
}
或者
#include
main()
{
chara[30],temp;
inti,j,k,len;
gets(a);
for(i=0;a[i]!
=’\0’;i++)
{
k=i;
for(j=i+1;a[j]!
=’\0’;j++)
if(a[j]>a[k])
k=j;
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
puts(a);
}
5_1_12
#include
main()
{
chara[50],b[50];
inti=0,j;
gets(a);
while(a[i]!
=’\0’)
{
if(a[i]>=’a’&&a[i]<=’z’)
b[j++]=a[i];
i++;
}
b[j]=’\0’;
puts(b);
}
5_1_14
#include
main()
{
chara[100];
inti=0,b[26]={0};
gets(a);
while(a[i]!
='\0')
{
if(a[i]>='A'&&a[i]<='Z')
b[a[i]-'A']++;
if(a[i]>='a'&&a[i]<='z')
b[a[i]-'a']++;
i++;
}
for(i=0;i<26;i++)
printf("%2c",65+i);
printf("\n");
for(i=0;i<26;i++)
printf("%2d",b[i]);
printf("\n");
}
5_1_16
#include
#include
#include
#defineN10
main()
{
inta[N][N],b[N][N],c[N][N];
inti,j;
randomize();
for(i=0;i{
for(j=0;j{
a[i][j]=random(21);
b[i][j]=random(21);
c[i][j]=a[i][j]+b[i][j];
}
}
for(i=0;i{
for(j=0;jprintf("%3d",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i{
for(j=0;jprintf("%3d",b[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i{
for(j=0;jprintf("%3d",c[i][j]);
printf("\n");
}
printf("\n");
}
5_1_18
#include
#include
#include
#defineN5
main()
{
inta[N][N],i,j;
randomize();
for(i=0;i{
for(j=0;j{
a[i][j]=random(21);
if(j
a[i][j]*=2;
printf("%3d",a[i][j]);
}
printf("\n");
}
}
第六章
6_1基础部分习题
6_1_2正确。
p+2指向字符串”CD”的起始地址,因此strcat(a,p+2)是将CD连接到字符数组a中字符串”abc”的末尾,从而构成字符串”abcCD”存放在字符数组a中。
6_1_4正确。
6_1_614,13
p=a+5;使得p指向数组a中下标为5的元素。
p+1表示下标为6的数组元素的地址,而*(p+1)即表示该数组元素,*p+1表示将下标为5的元素值加1(注意运算符的优先级)。
6_1_8*(p+3)
做该题要看懂题意。
要求不移动指针变量p,即不能通过赋值运算或者自加自减运算改变p的值;要求通过指针变量p引用值为e的数组元素,则意味着用包含指针变量p的表达式来表示数组的第5个元素c[4]。
p=c+1表示将指针变量指向数组的第2个元素,要获取c[4]元素的地址用包含p的表达式来表示即p+3,而*(p+3)才表示c[4]。
6_1_10负数(如果题目没有特别要求,则应该写出具体值即-32)
6_1_12
6_1_14
#include
main()
{
inta[11]={20,18,16,14,12,10,8,6,4,2},k,*p,*q;
for(p=a;p-a<10;p++)
printf("%4d",*p);
printf("\n");
printf("Inputk:
");scanf("%d",&k);
p=a;
while(*p>=k&&p-a<10)p++;
for(q=a+10;q>=p;q--)
*q=*(q-1);
*p=k;
for(p=a;p-a<11;p++)
printf("%4d",*p);
printf("\n");
}
6_1_16
#include
main()
{
chara[50],*p,*q;
gets(a);
p=q=a;
while(*q!
='\0')p++;
q--;
while(p{
if(*p!
=*q)break;
else
{
p++;
q--;
}
}
if(p>=q)printf("%s是回文\n",a);
elseprintf("%s不是回文\n",a);
}
第七章
7_1基础部分习题
7_1_2正确。
7_1_4错误。
通过return语句只能从函数内部传出一个值。
出现多个return语句的时候(通常有分支结构存在时),函数只会执行其中一个return语句,因为一旦执行了return语句就会退出函数的执行。
7_1_68
注意避免与自加自减运算符的混淆,不要误认为两次调用函数fun的返回值都是5。
7_1_8
intmysearch(int*p,intx,intn)
{
inti,m=10;
for(i=0;iif(p[i]==x)
m=i;
returnm;
}
7_1_10略
7_1_12
#include
intf(floatx)
{
if(x>0)return1;
elsereturn0;
}
main()
{
floatx;
scanf(“%f”,&x);
printf(“%d”,f(x));
}
7_1_14
#include
voidDelMax(inta[],intn);
main()
{
inta[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
DelMax(a,10);
for(i=0;i<9;i++)
printf("%d",a[i]);
}
voidDelMax(inta[],intn)
{
intmax=0,i;
for(i=1;iif(a[max]max=i;
for(i=max+1;ia[i-1]=a[i];
}
7_1_16略
7_1_18
#include
#defineM5
#defineN3
floatf(inta[][N]);
main()
{
inta[M][N],i,j;
for(i=0;i{
for(j=0;j{
scanf("%d",&a[i][j]);
printf("%4d",a[i][j]);
}
printf("\n");
}
printf("%f\n",f(a));
}
floatf(inta[M][N])
{
inti,j;
floatsum=0;
for(i=0;ifor(j=0;jsum+=a[i][j];
returnsum/(M*N);
}
7_2提高部分习题
7_2_2正确
7_2_4712777