C程序设计第17章部分习题参考答案文档格式.docx
《C程序设计第17章部分习题参考答案文档格式.docx》由会员分享,可在线阅读,更多相关《C程序设计第17章部分习题参考答案文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
{
float
r,h,v;
r=2.5;
h=3.5;
v=PI*r*r*h;
r=%f,h=%f,v=%f\n"
r,h,v);
}
1_1_22
编写输出以下图形的程序。
**
###
3333
**\n"
);
###\n"
%-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;
a=%d,b=%d"
本题考查复合赋值运算符及其运算过程。
(从右到左运算,运算过程中变量的值会发生改变)
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--;
/*这个语句从整体来看是作逗号运算,逗号运算的第一个子表达式是赋值运算,其它三个是自减运算*/
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的值(要求:
不使用变量);
printf("
%f"
12.5*3.4);
2_1_6
改正后的程序:
intm,h;
h=500/60;
m=500%60;
500分钟是%d小时%d分钟"
h,m);
2_1_8
char
x,y,t;
x=getchar();
y=getchar();
交换前:
x=%c,y=%c"
x,y);
t=x;
x=y;
y=t;
交换后:
2_2提高部分习题
2_2_2已有定义“inta;
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'
%d,%d"
解答:
对于x=ch=='
,首先要清楚运算符计算的优先次序(从整体来看是执行一个赋值运算,而赋值运算符右边的表达式是执行一个关系运算,关系运算的左侧变量ch值为'
,右侧为算术表达式(对于字符型数据的算术运算和关系运算等都是依据各字符的ASCII码值进行,因此该表达式的值为'
),从而赋值运算右侧关系表达式值为1,x即被赋值为1)。
对于y='
,逻辑运算符两侧的运算量要先转换为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<
CR>
(<
表示回车),则运行后v1和v2的值分别是2,2
4_1_6下面程序段的输出结果是4
4_1_8
i%7==0
4_1_10
#include
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
charch;
Inputdata:
ch=getchar();
do
if(ch>
='
&
ch<
Z'
)
ch=ch+32;
z'
{
ch=ch+2;
if(ch>
'
)ch=ch-26;
}
putchar(ch);
ch=getchar();
}while(ch!
#'
4_1_14
提示:
如果要通过数据验证一个程序是否正确,应该将各种可能的情况都考虑到。
如输入的字符串数据可能出现的情况有:
所有字符都为大写字母,所有字符都为小写字母,大小写字母混合,所有字符不是字母,大写字母与其它字符混合等等。
4_1_15
intn=0,sum=0;
n++;
sum+=n;
}while(sum<
1000);
sum-=n;
n--;
n=%d,sum=%d\n"
n,sum);
4_1_16
intn,sum=0;
for(n=2;
sum<
=1000;
n+=2)
n-=2;
或者
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
inty2,y1,i=0;
for(y2=1;
y2<
=4;
y2++)
for(y1=2;
y1<
=8;
y1+=2)
if(y2*20+y1*10==100)
{i++;
第%d种方案:
(y2=%d,y1=%d)\t"
i,y2,y1);
inty2,y1,i,n=0;
y1=(100-y2*20)/10;
if(y1*10+y2*20==100)
%d张20元,%d张10元"
n,y2,y1);
4_1_20
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
inti,j;
for(i=1;
i<
=9;
for(j=1;
j<
=i;
%d*%d=%-4d"
i,j,i*j);
第五章
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
chara[30],temp;
inti,j,k,len;
gets(a);
len=strlen(a);
for(i=0;
len-1;
k=i;
for(j=i+1;
len;
if(a[j]>
a[k])
k=j;
temp=a[i];
a[i]=a[k];
a[k]=temp;
puts(a);
a[i]!
=’\0’;
a[j]!
5_1_12
chara[50],b[50];
inti=0,j;
while(a[i]!
=’\0’)
if(a[i]>
=’a’&
a[i]<
=’z’)
b[j++]=a[i];
b[j]=’\0’;
puts(b);
5_1_14
chara[100];
inti=0,b[26]={0};
\0'
if(a[i]>
='
a[i]<
b[a[i]-'
]++;
26;
%2c"
65+i);
%2d"
b[i]);
5_1_16
time.h>
stdlib.h>
#defineN10
inta[N][N],b[N][N],c[N][N];
randomize();
N;
for(j=0;
a[i][j]=random(21);
b[i][j]=random(21);
c[i][j]=a[i][j]+b[i][j];
%3d"
a[i][j]);
b[i][j]);
c[i][j]);
5_1_18
#defineN5
inta[N][N],i,j;
a[i][j]=random(21);
if(j<
i)
a[i][j]*=2;
第六章
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
inta[11]={20,18,16,14,12,10,8,6,4,2},k,*p,*q;
for(p=a;
p-a<
10;
p++)
%4d"
*p);
Inputk:
"
scanf("
k);
p=a;
while(*p>
=k&
10)p++;
for(q=a+10;
q>
=p;
q--)
*q=*(q-1);
*p=k;
11;
6_1_16
chara[50],*p,*q;
p=q=a;
while(*q!
)p++;
q--;
while(p<
q)
if(*p!
=*q)break;
else
p++;
q--;
if(p>
=q)printf("
%s是回文\n"
a);
elseprintf("
%s不是回文\n"
第七章
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;
n;
if(p[i]==x)
m=i;
returnm;
7_1_10略
7_1_12
intf(floatx)
if(x>
0)return1;
elsereturn0;
floatx;
scanf(“%f”,&
x);
printf(“%d”,f(x));
7_1_14
voidDelMax(inta[],intn);
inta[10],i;
scanf("
a[i]);
DelMax(a,10);
9;
%d"
a[i]);
voidDelMax(inta[],intn)
intmax=0,i;
for(i=1;
if(a[max]<
a[i])
max=i;
for(i=max+1;
a[i-1]=a[i];
7_1_16略
7_1_18
#defineM5
#defineN3
floatf(inta[][N]);
inta[M][N],i,j;
M;
scanf("
a[i][j]);
%f\n"
f(a));
floatf(inta[M][N])
floatsum=0;
sum+=a[i][j];
returnsum/(M*N);
7_2提高部分习题
7_2_2正确
7_2_4712777