第五到八章习题集答案及课后习题答案_第1页
第五到八章习题集答案及课后习题答案_第2页
第五到八章习题集答案及课后习题答案_第3页
第五到八章习题集答案及课后习题答案_第4页
第五到八章习题集答案及课后习题答案_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题集答案(后附课后习题答案)

第五章函数

一、选择题:

1.答案:B

分析:在C语言中,函数可以在任何地方出现,而main函数作为函数中的

一类,没有特殊的限制和要求,故也可以在任何地方出现。

2.答案:B

分析:C语言默认规定

3.答案:D

分析:选项A中“abc”和C中的‘65'是一个字符串,而形参要求的是单

个字符不符合要求,选项B是一个赋值语句,而fun函数没有返回值,所以

不符合要求,只有选项D正确,将32传给ch字符变量,那么32就相当于

是ASCH码值。

4.答案:A

分析:sin(1/2)会当作sin(0)处理。实参的类型决定了重载函数的选择。

5.答案:D

分析:函数的调用不可以作为一个函数的形参。

6.答案:D

分析:fun(a,b)的作用是返回a^b中较大的。fun(x,y)=fun(3,8)=8,

r=fun(fun(x,y),2*z)=fun(8,12)=12

7.答案:C

分析:fl(x,y)的作用是返回x、y中较大的,f2(x,y)的作用是返回x、

y中较小的。d=fl(a,b)=fl(4,3)=4

d=fl(d,c)=fl(4,5)=5

e=f2(a,b)=f2(4,3)=3

e=f2(e,c)=f2(3,5)=3

此时各值为a=4,b=3,c=5,d=5,e=3,f=a+b+c-d-e=4。所以答案d,f,e为

5,4,3

8.答案:A

分析:c程序的基本单位是函数。函数中不可以嵌套定义函数。main()函

数可以放在任意位置。被调用的函数只要在调用之前说明了即可。

9.答案:B

分析:fun(x,y)的作用是求x、y的和。fun(a+c,b)=a+c+b=15,(int)

fun(a+c,b)=(int)15=15□fun((int)fun(a+c,b),a-c)=fun(15,-6)

=9o

10.答案:D

分析:fun(x,y)的作用是选择x,y里面较小的一个。fun(9,8)=8,

fun(8,7)=7;fun(fun(a,b),fun(b,c))=fun(8,7)=7

11.答案:C

分析:funl(a)=a2,fun2(x,y)=(int)(funl(x)+funl(y))=(int)(x2+y2),

所以funl(l.1,2.0)=(int)(1.21+4.0)=(int)5.21=5

由于w是double型的,所以w的值为5.0。

12.答案:A

分析:函数的说明有其自己的格式,应该包括函数类型、函数名、以及形参

类型,形参名可有可无,但是一定要统一,形参名随便取。

13.答案:C

分析:允许这种函数说明的方式存在。如果只在主函数中说明,则只能在主

函数中调用f;如果在主函数以前说明,则包括主函数的所有函数都可以调

用,如果同时主函数又说明了,则不影响。

14.答案:D

分析:函数的形参不可以传给对应的实参。

15.答案:D

分析:形式参数的改变不影响实参。所以本题是一个迷惑题,不需要看函数

体的内容。

16.答案:C

分析:C语言中改变函数形参的值,不会改变对应实参的值;函数可以返回

地址值,当函数没有指定返回值类型时,默认返回类型为void型,C语言的

函数不能嵌套定义,所以本题选择。

17.答案:A

分析:本题答案为A,程序的执行总是从main函数开始,在main函数结束,

无论main函数在程序的什么地方。

18.答案:A

分析:在C语言中,函数返回值的类型取决于函数定义时在函数首部所说明

的函数类型。

19.答案:C

分析:函数f(intv,intw)的功能是将实参v和w进行交换,但是实参值

的变化对形参没有影响,所以本题中x,y,z中的值不发生变化。

20.答案:C

分析:因为fun(intx)函数是一个递归函数,所以主函数中的调fun(3)经过

1次递归调用,其过程可以描述为fun(3)=3*3-f(3-2)=9-fun(l)=9-3=6。

21.答案:D

分析:在内存中,实参单元与形参单元是不同的单元。在C语言中,仅在调

用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束

后,形参单元被释放,实参单元仍保留并维持原值。故本题答案为D。

22.答案:C

分析:变量a,b,c的初始值分别为1,2,3o因此逗号表达式“a++,b++,a+b”

值等于5,表达式C++的值为3,这样主函数main。中调用子函数的表达式为

fun(5,3);其返回值等于8。所以变量sum的值等于8。本题选择C。

二、填空题:

1.答案:a=l.O,b=l.O,s=l.0;

分析:分别求出变量的初始值。a=a*x为的是求xn,所以其初始值为l,b=b*i

位的是求n!,所以其初始值为1,当n=0时,s=l,所以s的初始值为1。由

于定义的是double型的数据,所以答案为a=1.0,b=1.0,s=1.0;

2.答案:m=fun(a,4)+fun(b,4Afun(a+b,3);

分析:由程序可以看出fun(x,n)=xnofun(a,4)=a4,

fun(b,4)=b4,fun(a+b,3)=(a+b)3,当要计算m=a4+b4+(a+b)3时,函数调用语句

为m=fun(a,4)+fun(b,4)+fun(a+b,3);

3.答案:xx*x+l

分析:1)求f(x)的累加和,即为求f(0)+f(1)+f(2)+f(3)+f(4)

+……,函数SunFun来实现此功能。括号中应该填入累加的序号值,即

为Xo

2)f(x)=x2+l,F(intx)函数来实现这个功能,所以填写x*x+l。

1.答案:-ffun(10)

分析:函数的作用为计算m=l-2+3-4+5-6+7-8+9-10,实际上为计算

m=l*l+(-l)*2+l*3+(-l)*4+...+1*9+(-1)*10,在循环体中,i为1,2,3…

f为1的符号。每循环一次,f的符号应该变换一下,所以变换的语句为f=-f。

当n=l时,计算的是m=l;当n=2时,计算的是m=l-2...因为计算的是

m=1-2+3-4+5-6+7-8+9-10,所以答案为n=10,即firn(10)。

2.答案:9

分析:1)函数的意思为f(x,y)=(y-x)*x

f(3,4)=(4-3)*3=3

f(3,5)=(5-3)*3=6

2)d=f(3,6)=(6-3)*3=9.

3.答案:doublemax

分析:通过程序可以看出,main函数中使用了max函数,而其他地方没有对

max函数进行说明。所以程序中应该对max函数进行说明。说明的格式为

doublemax(double,double)»

4.答案:3,2,2,3

分析:1)x=2,y=3,当调用fun(x,y)时,相当于执行fun(2,3)0

x=x+y;x=2+3=5;

y=x-y;y=5-3=2;

x=x-y;x=5-2=3;

此时x,y的值为3,2,所以输出的结果为3,2。

2)在main函数中,实参不会因为形参的改变而改变,x,y的值仍为2,3,

所以所以输出的结果为2,3.

8、答案:13

分析:fun函数是一个递归函数,主函数中调用的fun(3)共递归两次,fun(3)

中又调用fiin(3/2)即fun(l),先输出fun(l)中x的值,为1,然后再输出fun(3)

中x的值为3。所以结果为13。

9、答案:m=9k=14

i=5j=5

分析:为赛量i和j赋初值为4,调用fun(i++,++j)即fun(4,5),在fun函数

中计算m和k的值,m+=k即m=m+k=4+5=9,k+=m即k=k+m=5+9=14,分

别输出m和k的值,即输出m=9,k=14;然后到主函数中输出自增1后的i

和j的值,即i=5,j=5»

第六章指针

一、选择题

1答案:A

分析:本题主要考指针赋值,n2=nl;是把n2的值赋给nl,故根据指针赋值

的定义可知选A,即把q所指对象的值赋给p所指对象。

2答案:B

分序:本题主要考指针定义,因为p指向变量x,故输出其值的时候应该是

x的值。

3答案:C

分析:本题主要考指针的定义和赋值,C前面是定义一个量a并赋值为10,后

面定义一个指针,并把a的值赋给这个指针。

4答案:C

分析:本题主要考指针的定义及赋值,开始时使p指向a,q指向b,把它们

的值交换,然后再显示。故得正确答案C。

5答案:C

分析:本题主要考函数指针的定义,函数前面的*号表求返回值是指针类型,

void表示返回无值弄的。故选C。

6答案:A

分析:本题主要考的是指针的变量的赋值,在使用scanf()函数的时候,

后面跟的是一个地址,由于pa本身保存的是地址,故选A

7答案:D

分析:本题主要考的指针的赋值及指向指针的指针的赋值,根据定义知选D。

B的正确形式是**q=2;C的正确形式应该是q=&po

8答案:C

分析:本题主要考的是全局变量和局部变量,以及指针的用法,第一个f(&a)

的返回值是5,第二个返回值是2o

9答案:A

分析:本题主要考的是变量自加,指针传值,以及指针的赋值。通过第二行

a=b可知pl,p2指向的变量的值相同,都指向了b所指的对象,也是p2所指

的对象由于(*a)++;是实现a所指对象的自加,故由,a,变成b,故最终

选Ao

10答案:A

分析:本题主考NULL,一般来说当我们把一个空值以整数的形式输出出来

的时候,默认的情况是0。

11答案:C

分析:本题考的是指针变量的赋值,虽然p没有赋值,表示没有指向某个具

体的对象,但事实上系统会让它随机的指向存储单元里的一个对象,那么它

的返回值应该是所指存储单元中的值。

12答案:B

分析:本题主要考函数中参数变量的定义,在B中连续定义两个变量,这在

函数中是不可以的。

13答案:C

分析:本题主要考指针的指针,c先指向b,b是一个指针,它指向a,故c最

终是指向a的,故其值是a中的值。

14答案:A

分析:本题主要考指针的赋值,我们不能把一个具体的值赋给一个指针变量。

B选项是w,p指向同一对象。C是p指向a。D是把w所指对象的值赋给p

所指对象。

15答案:B

分析:本题主要考指针传值,p,q分别指向a,b,然而r会指向它们的较小值。

16答案:D

分析:在D中把一个整形变量的值赋给一个指针的地址,故而是错的。应该

写成p=&ao

17答案:D

分析:本题主要考调用函数时指针传值和一般的变量的传值区别。指针通过

地址传值,而变量是直接传值。c指针指向b,故对c指针里面的值的修改

等于直接修改b中的值。

18答案:D

分析:本题主要考指针的定义及指针变量的值的输出方式,指针b指向a,

故输出其值是511。

19答案:C

分析:本题主要考指针标识符*和乘号*的区别,*p=*pl*(*p2)中第1,2,4个*

号是指针标识符,而第三个是乘号,故其运算的结果是3。

20答案:C

分析:本题主考函数的嵌套调用和数据的类型转换,注意的是(int)(a+b),所以

得至U5.0。

21答案:A

分析:本题主要说的是函数的递归调用,函数fun()实现的功能是从1加到n,

然后返回给主函数。

22答案:D

分析:A不能把一个具体的值赋给一个指针变量。Bq是指向指针的指针只

能保存指针的地址。C同B。

23答案:D

分析':A指针赋处初值时不能把一个具体的值赋给一个指针变量指向的地址。

B语法错误,C不能发地址赋给浮点型变量。

24答案:C

分析:指针只能存放地址。

25答案:C

分析:scanf()函数的输入数据列表应该是合法的地址表达式。

26答案:D

分析:A中b需要预先定义,B中字符变量b只能接收单个字符。C中二级

指针应定义为**c。答案D

27答案:D

分析:代码“s+=2”是错误的,s是数组的首地址,但S是常量不能改变它

的值。

28答案:A

分析:B的正确格式是“p=&n”,C的正确格式是“scanf("%d",p)”,D的

正确格式是“printf("%d\n",*p)”。答案A

二、填空题

1答案:84

分析:voidf()函数里的x,y分别是一个指针变量和整型变量,指针x指向一

个整型的变量,即指向主函数里的x,故在函数voidf()里修改指针x的值,

会影响到主函数里的x的值,但修改voidf()里的y的值却不会影响到主函数

里的y的值。因为主函数x传的是地址,y传的是值。

2答案:k*k

分析:由于k是一个指针,故第一个空应该填k。

由于第二个空要输出指针k所指对象的值,故应该填*k表示该指针所指对象

的值

3答案:35

分析:p,q分别指向x,y,然后调用函数swap。;它的功能是把两个指针所指向的

对象交换,原来a,b分别指向x,y,但交换后分别指向y,x,所以并不把指向的

对象的值交换。函数返回后,p,q仍然分别指向x,y。故其值不变。

4答案:n=n/10

分析:把n除以10,每执行一次就可以把数的阳未位去掉,因为两个整数相除,

不会保留小数,故最低位会丢掉,并且把数缩小到十分之一。然后依次从个

位到最高位把数字输出。

5答案:35

第七章数组

一、选择题

1答案:B

分析:此题考察一维数组的定义,一维数组的说明中,下标必须为正的

整型常量,不能为变量,在一维数组的初始化中,指出在单纯的定义时

不能省略数组的长度。

2答案:B

分析:首先i=0时,判断i++<7成立,进入循环体,但此时i=Lp[l]=12

不满足if语句,不执行j+=p[i]。按照此方法,得到j=p[2J+p[4]+p[6]=45,

即B正确。

3答案:D

分析:首先i=0<7&&p[0]%2!=0,满足循环条件,执行k=k+p⑼,即k=ll,

然后执行i++,再进行判断,满足循环条件,k=ll+p[l],所以k=24,执行

i++,i=2,,再进行判断,此时不满足循环条件,循环结束,输出k值,为

24o

4答案:A

分析:此题主要考察循环嵌套,第一个循环体执行完是将x[0],x[ll,x[21,

x[3],进行从大到小排序,第二个循环体执行完是将x[4],x[5],x[6],

x[7]进行从小到大排序。

5答案:B

分析:此题考察二维数组的定义,单纯定义二维数组时,行和列都不能

缺省。在初始化过程中,列不能缺省,赋值的行数和列数不能超过数组

的行数和列数。

6答案:D

分析:同上题分析一样。

7答案:D

分析:同上。

8答案:C

分析:此题分别输出m[2][0],m[2][l],m[2][2]o

9答案:A

分析:此题考察在for循环后,i=O,i=l时,执行if语句,使得a[l][0],a[l][l]

的值分别减1,而当i=2时,执行else语句,a[l][2J=lo因此输出

a[0][l]+a[l][l]+a[l][2]=2+4+l=7;

10答案:B

分析:此题考察for循环,计算aa⑼⑴,aa[l][l],aa⑵⑵,aa[3][l]的和,即

为190

11答案:C

分析:由于自增加运算符(++)的优先级别高于取地址运算符(&),所

以选项C无法表示aa川的地址,其他三个选项都可以。

12答案:D

分析:数组名实际代表数组的首地址,也就是数组中第一个元素a[0]的

地址,那么a+i就代表数组a中下标为i的元素a[i]的地址,*(a+i)就代表

a国这个元素,所以*(*(a+i))的表示是错误的,此题选择D。

13答案:A

分析:本题答案为A,指针p指向数组a中第一个元素,此时p中存放

的是数组中a[0J的地址,将指针p+2不是单纯的加一个整数2,而是将

指针后移,两个存储单元,指向了a[2]这个数组元素,所以输出的是a[2]

中的值3。

14答案:B

分析:此题答案为B,通过程序我们可知指针p指向数组中元素a[3],

指针q指向元素a[5],输出*p+*q即输出a[3]+a[5]=10,所以选择B。

15答案:C

分析:本题通过循环控件用y累计p[l]+p[2]的值,由于指针p指向数组

中元素a[l]所以p[l]即数组中元素a[2],p[2]即数组中元素a[3],

a[2J+a[3]=6+8=14»

16答案:A

分析:我们让指针p指向数组a中第一个元素,然后通过循环控制输出

指针p每次后移一个存储单元,并输出其所指存储单元中的内容,而指

针p指向数组a,所以就是输出数组a中的每一个元素,选择A。

17答案:D

分析:*p表示指针p所指存储单元中的内容,所以(*p)++表示将p所

指存储单元中的内容加1,不符合题目要求,其他三项都符合要求,所

以选择D。

18答案:A

分析:为指针赋一个NULL值,就是指针具有一个空值,让一个空指针

去访问一个存储单元时,将会得到一个出错的信息。

19答案:D

分析:变量p是一个指针,所以我们只能为其赋一个地址值,不能为其

赋一个表达式或一个常量值,所以A、B、C三个选项不符合要求,D选

项中,a代表数组a的首地址,是一个地址值,所以D正确。

20答案:C

分析:让指针p指向数组中元素a[3],那p[5]即数组中元素a[7],所以

b中的值是8。

21答案:B

分析:与上一题同理,指针s指向数组元素a[3],s[2]即数组中元素a[4],

即为0。

22答案:C

分析:数组名t代表数组的首地址,所以*(t+i)就代表t[i]元素中的值,

通过循环控制求累加和s,实际上

s=a[0]+a[2]+a[4J+a[6J+a[8J=1+3+5+7+9=25o

23答案:B

分析:让指针p指向二维数组a的第一个元素,那么可用p⑼代表a[0][0],

用p川代表a[0][l]........,用p[8]代表a⑵⑵,通过循环为数组a中

的每一个元素赋了一个值。输出即p[5]的值为6o

24答案:D

分析:让指针p指向二维数组a的第一个元素,那么可用p⑼代表a[0][01,

用p[l]代表a[0][l]........,用p[8]代表a[2][2J,通过循环为数组a中

的每一个元素赋了一个值。再通过循环输出a[l][0]、a[l][l],a[l][2],即

p[3]、p[4]、p[5]的值,所以输出的是3、4、5o

25答案:B

分析:在这里我们通过(*小理2]定义了一个行指针ptr,ptr存放的是含有

两个整型元素的一维数组的首地址。a是二维数组名,就是数组的首地

址,ptr=a+i就代表,将数组中第i行的首地址赋给行指针ptr。能过第一

个循环控制,为第0行和第1的首元素赋值,也就是为a[0]⑼和

赋值,输入的是1、2、3,但是只赋给两个元素,所以取前面两个值,

所以输出时,a[0]⑼的值为1,的值为2,其他的默认都为0。

26答案:B

分析:int*p[3]是表示定义一个指针数组,数组名为p,其中包含3个元

素,每个元素都是一个指向int类型的指针。

27答案:D

分析:通过(*p)[5]则定义了一个行指针,存放长度为5的一维数组的指

针,通过p=c,让p指向二维数组c,那么p[i]就是指向数组c中第i行

的指针。p「]+n就是数组中第i行,第n列的地址,如果要引用第i行第

n列的元素,就可以表示成*(p[i]+n),所以本题选择D。

28答案:D

分析:二维数组元素的地址可以用表达式求得,也可以通过每行

的首地址来表示,第i行的首地址可以通过a[i]来表示,a[i]+j就表示第

i行第j列的地址,等价于*(a+i)+j,如果要引用第i行第j列的元素,

则可表示成*(a[i]+j),*(*(a+i)+j)或(*(a+i))[j]所以本题选择D。

29答案:C

分析:p是一个指针数组,通过p[O]=aU]可知p[0]中存放的是数组a中

第1行的首地址,所以p[O]+l就代表第1行第1列元素的地址,所以

*(p[O]+l)就代表元素

30答案:C

分析:通过(*ps)[5J则定义了一个行指针,存放长度为5的一维数组的指

针,通过ps=s,让ps指向二维数组s,那么ps[i]就是指向数组s中第i

行的指针,可用ps[i][j]或*(ps[i]+j)表示第i行第j列的元素。所以选项

C正确。

31答案:A

分析:通过(*pa)[3]定义了一个行指针pa指向二维数组a,这样就

表示a[i][j],通过循环语句控制将和a"]”]中的值分别减1变为3

和4,给a⑴⑵赋值为1。a[0][1]+a[1][1]+a[1][2]=2+4+1=7,所以本题选

择Ao

32答案:B

分析:循环共执行3次:i=0并且j=0时:

t=t+b[O][b[0][0]]=1+b[0][0]=1+0=1,当i=l并且j=l时:

t=t+b[l][b[l][l]]=l+b[l][l]=l+l=2,当i=2并且j=2时:

t=t+b⑵[b⑵⑵]=2+b⑵⑵=2+2=4。

33答案:B

分析:第一个for循环控制输出的空格,第二个for循环控制输出数组中

元素,分析可知,输出数组元素时,第0行输出0个空格,并从第0

列元素开始输出,第1行输出1个空格后,并从第1列元素开始输出依

此类推,第i行输出i个空格后,从第i列开始输出,所以空格处填i。

34答案:A

本题中通过嵌套循环找出数组中最小的元素的值,存放在min变量中,

并且将相应的行号放在row变量列中,列号放在col变量中输出。

35答案:A

分析:p=s就表示让指针p指向数组S的首地址,数组中第一个元素,所

以*p可以表示s[0],A选项正确;数组s中的元素个数由定义数组时的

下标决定,P所指的字符串长度由实际的字符个数决定,是不相等的,

所以B错误,s数组名代表数组的首地址,是一个地址常量,不是变量

所以C错误;数组s中存放的是数组中的每一个元素,而指针变量p中

存放的是数组的首地址,所以D错误。

36答案:A

分析:通过pc=ch,让指针pc指向数组ch中的第一个元素,此时pc+i

即表示ch[i]的地址,所以输出*(pc+5)即输出元素ch⑸中的字符“z”。

37答案:D

分析:swapl(a,a+l)是将数组中元素a[0]和a[l]的地址传递给形参cO和

cl两个数组,然后在函数swapl中对它们进行交换,由于传递的是地址

值,所以形参变化,对应的实参也发生改变;所以a[0]与a[l]中的值也

相互交换;swap2(&b⑼,是将数组b中元素b[0]和b[l]的地址传递

给形参指针变量cO和cl,然后对指针变量所指的存储单元中的值进行

交换,所以b[0]和b[l]中的值相对也发生变化,因此最后输出的值为53

53。

38答案:C

分析:循环for(i=0;i<12;i++)c[s[i]]++;共执行12次,分别为:c[l]++,

c[2]++9c[3]++,c[4]++9c[4]++,c[3]++,c[2]++,c[1]++,c[l]++,c[l]++,

c[2]++,c[3]++,其中c[l]自加了4次,c⑵自加了3次,c[3]自加了3

次,c[14]自加了2次,所以c[l]的值为4,c⑵的值为3,c[3]的值为3,c[4]

的值为2,输出结果为4332。

39答案:C

分析:函数fun的功能是将数组中下标从i至叮的元素倒序,在主函数中

先通过调用fun(a,0,3)将a⑼到a[3]的元素倒序得到{4,3,2,1,5,6,7,8,9,0},

再通过fun(a,4,9)将a[4]到a[9]的元素倒序得到[4,3,2』,0,9,8,7,6,5}最后再

通过fun(a,0,9),将a[0]到a[9]中的所有元素倒序得到{5,6,7,8,9,0,1,2,3,4}。

二、填空题

1.答案:24

分析:此题分析过程同选择题3。

2.答案:1111

分析:本题正确答案为1111。初始化时数组中每个元素的值都是0,通

过循环让数组中n[l]到n[4]中每个元素的值都是其前一个元素的值乘以

2后,值仍为0,然后输出每个元素的值加1,即1111。

3.答案:30

分析:计算s=a[0][0]+a[0][2]+a[lj[l]+a[l][l]+a[2][2]+a[2][0]=30

4.答案:123(换行)056(换行)009

分析:在第一个for循环中,使得a[l][0],a⑵⑼,a⑵[1]全部等于0,因此

输出即得。

5.答案:92

分析:i=0时,首先判断i++<4成立,执行循环体,此时i=l,在do-while

内层循环中,得至Us=a[l][0]+a[l][l]+a[l][2]+a[l][3]=26;然后再进行条

件判断i++<4,进入循环体,此时i=2,执行continue,再一次进行条件判

断,进入循环体,此时i=3,因此计算s=a[3][0]+a[3][l]+a[3][2]+a[3][3]

得到s=92。

6.答案:58

分析:i=0时,s=a[0][0]+a[0][l]=3;

i=l时,由于a[l][0]==0。因此跳出内层循环;

i=2时,得至Us=s+a[2][lJ=3+23=26;

i=3时,得至I」s=s+a[3][lj=26+32=58o

7、答案:6

分析:通过循环控制,让数组中的每个元素与x进行比较,如果该元素

的值小于x,则将该元素的值赋给z,否则将x赋给z;y=0时,z=2;y=l

时,z=4;y=2时,z=6,最后结果是6。

8、答案:19

分析:该题通过循环控制用y来累计和,

y=y+a[l]+a[2J+a[3J=l+4+6+8=19。

9、答案:6

分析:指针p指向数组a的首元素,通过循环控制,将p所指元素中的

值赋给数组中的每个元素,由于是同步的,所以数组a中元素的值并没

有变化。

10、答案:5768

分析:p的地址为5732,所以p+9的地址为5732+4X9=5768。

11、答案:2

4

分析:指针p指向数组中的第一个元素,第一条输出语句,输出p所指

的存储单元中的内容,即2;然后将指针p后移,指向下一个元素,由

于k指向p,所以输出**k,也就是输出,p所指的存储单元中的内容,

即4o

第八章字符串

1D

解析:在C语言中,字符串常量是由双引号括起来的,由若干个字符所组

成的序列。所以A选项中的字符是由一对单引号括起来,C选项中只有一个

双引号,皆错。对于B选项,定义了一个字符变量,却给它赋了字符串常量,

错误。若该改为charstr[]="\x43”,则也正确。

2A

解析:A选项中ss[l]可以看作是一个地址常量,其值不能改变,所以不可以

对其赋值。但是在定义二维数组的时候,对其进行初始化是允许的,如选项

Bo选项C和D定义的是字符指针变量,可以对其进行赋值。

3A

解析:Str是地址常量,P是指针变量,两者类型不一致,选项B错误。Str

数组的长度是20,而P所指的字符串遇到、(T就结束,本题中其长度应该为7,

选项C错误。同理,既然Str数组的长度与P所指字符串长度不同,所以存

放的内容肯定不同,选项D错误。

4C

解析:对于数组P,只有三个元素,分别是所以sizeof(P)的输出结

果应该是3,对于数组q,存储了四个元素,分别是以及、0,。所以

sizeof(q)的输出结果是4。

5C

解析:本题的分析同第4题。

6C

解析:数组a中存储了7个字符,分别是3,。,,\0:0,,匕丫0:\0,,当使用位60的)

统计计数的时候,会统计计算这7个字符,但是当用strlen(a)统计数组元

素个数的时候,遇到'\0’的时候就会结束,所以最终的输出结果是72。

7B

解析:ps=s语句使ps指向数组s的首地址,即指向元素a,对于表达式*p+4,

由于*的优先级高于+,所以进行间接访问运算,得到a,再+4,根据ascii码

的顺序,最后的输出结果应该是e,答案为B。

8B

解析:选项A的getc()函数完成的是从文件中读入一个字符,而不是题目

所要求的从键盘读入一个字符,错误。选项C的getchar()函数每次读入的

是一个字符变量,而不是字符串变量,错误。选项D的scanf()函数,通过

格式控制符%s可以读入字符串变量,但是遇到空格会作为输入数据的分隔

符,不会被作为数据读入。选项Bgets()函数可以完成题目要求的功能,

参见课本P1102例6。

9D

解析:选项A中的参数2的数据类型不匹配,应改为&x(4],选项B中的y是

指针常量,不能进行++运算,错误。选项C中参数1对应的数组长度小于

参数2的数组长度,错误。

10B

解析:strlen()函数统计字符串长度的时候,是在遇到'\0,的时候结束统计。

所以对于数组q来说,定义了数组的长度为10,并给前三个字符赋了初值,

则从第4个字符开始,系统将数组元素的值置为所以strlen(q)的结果是3。

而对于数组p来说,数组长度为3,但是何口寸遇到无法确定,所以strlen

(p)的值也无法确认。

11D

解析:函数f(char*p[],intn)完成的功能就是对字符串进行字典排序,根

据题目,最后将排在第2位的字符串是“abbd",0strlen(p[l])的输出结

果应该是4。

12A

解析:*运算符和++运算符的优先级相同,且结合方向都是自右向左,所以

结果是15,答案为A。

13D

解析:根据函数代码,若返回的是正数,则表示a字符串的字典排序在b字

符串之后,若返回0,表示a和b中存储的字符串一样,若返回负数,表示a

字符串的字典排序在b字符串之前。

14A

解析:point()函数传递的是指针变量的值,而不是指针变量本身的地址,

仍然是一个传值而不是传地址的过程,实参的值没有改变,所以指针p仍然

指向字符串的首地址,输出结果为a。

15D

解析:比较字符串大小的时候,应该调用函数strcmp(),而不是直接进行比

较,选项A错误。对于选项B,只要si和s2不相等,无论si所指串是大于

或是小于s2所指串,其结果非0,都会执行语句S,与题意不符,错误。选

项C的函数实参顺序错误。

16B

解析:对于二维数组,第二行的首元素是接着第一行的最后一个元素的。所

以P+10是指向字符串“Beijing”的首地址,所以正确答案是B。

17D

解析:对于格式控制符%s,在输出的时候遇到,(T才结束输出。所以答案为D

18B

解析:gets()函数需要的参数是指针类型的。所以ACD都满足条件,答案

B中的a[0]是字符,不是指针类型,错误。

19A

解析:P[4]指向的应该是第5个字符串的首地址,即字符串“cd",所以strlen

(Pl4])的结果是2。

20C

解析:数组名是指针常量,不能对其进行赋值,所以选项C错误,需要注意

一点:在定义字符数组的时候可以初始化,如选项A。

21C

解析:swap函数实现了交换字符串首地址中对应的元素,所以输出结果为

Ibc,a23o

22B

解析:fun函数统计首字符是,F的字符串的个数,所以符合条件的有“Tue”

和“Thu”,输出结果为2.

23A

解析:funl函数中的(*编++将指针q所指向的字符进行一次自加运算,所以输

出结果为A.

24C

解析:注意字符串“3697”和存储了一个'(T,所以j+=2,在字符9之后指向的

数据是2,8,4,都不满足条件(即]叶'0')%2,所以结果为C。

25C

解析:二维数组str的第二维数是20,所以p+20保存的是字符串"Beijing”的首

地址.strlen(p+20)输出的就是字符串“Beijing”的长度.结果为7。

26A

解析:while中的语句是*p2=*pl,注意,这是赋值语句,不是比较语句,正确

答案为A

27C

解析:p=s[l]语句使得指针p指向字符串“two”的首地址,所以*(p+1)的

输出结果是“two”的第二个字符'w',正确答案为C。

28B

解析:puts。函数实现的功能是输出字符串,for循环中,ps的值首先保存

最后一个字符地址,逐一递减,输出的结果为B。

29D

解析:strlen(p)遇到'\0'结束执行。所以只统计了指针p指向的前5个字

符“abcde”,结果为5o

30A

解析:字符串s中的存储字符有下面9个:

所以strlen(s)的结果为9。

31B

解析:ch[l]可以看作是二维数组的行指针,指向第二个字符串的首地址,注

意输出中的转义字符\”,输出的结果是显示一个

32A

解析:字符串常量"good!”赋给字符串变量时,再结尾自动加上字符、(T,

这样就一共需要6个存储单元,但是选项A中的数组str的长度只有5,所

以错误。

33D

解析:程序执行while循环,最后一次执行中,pb指向bl的首地址,所以

将bl全部拷贝给b2,所以程序的输出结果为7。

二、填空:

19

解析:IBM为3个长度,3为1个长度,012为3个长度,\1为1个长度,

\\为1个长度,故长度为9。

2*2*4*6*8*

解析:while循环实现的是将字符串的奇数位赋值为*,并输出,偶数位原样

输出。

3*t++

解析:注意变量t需要自加。

4efgh

解析:strlen(s)/2的值为4,所以指针变量p的起始地址是从字符'e'的

地址开始,格式控制符%s输出遇到'\0'结束。所以输出efgh。

5cdeab

解析:move函数实现的功能是将字符串循环左移。

6s[i]>='O'&&s[i]<=,9,

解析:判断字符串中单个字符的ASCII码是否在“0”-“9”之间,就可以判

断字符是否是数字。

7p+n

解析:得到字符变量c的值在字符数组变量str中出现的位置,再让指针p

前移这个位子的数字。

8s-1*s++

解析:要注意s=s-l是让指针变量后移一位,移到'\0'前面。

9*t

解析:注意,由于后面的循环体语句有t++,所以这里是九而不是九十+。

10bcdefgha

解析:ss函数实现的是实现字符串循环左移的功能。

11gae

解析:循环的作用是输出字符串a和字符串b下标相同时字符也相同的字

符。

12、abcfg

解析:注意循环第3此取到的是‘\0'结束符。

13、strlen(str)+str-lt==0huiwen(str)

解析:用一个指针指向输入的字符串的头,一个指针指向输入的字符串的尾。

然后对比指针的值,然后使头指针自加,尾指针自减,再对比值。

教程课后习题答案

第五章函数

第一节函数的定义、库函数

习题

1.在C语言中,函数返回值的类型最终取决于A

A)函数定义时在函数首部所说明的函数类型

B)return语句中表达式值的类型

C)调用函数时主函数所传递的实参类型

D)函数定义时形参的类型

2.有以下函数

intfun(char*s)

(

char*t=s;

while(*t++);

retum(t-s);

)

该函数的功能是B

A)比较两个字符的大小B)计算s所指字符串占用内存字节的个数

C)计算s所指字符串的长度D)将s所指字符串复制到字符串t中

3.程序中对fun函数有如下说明C

void*fun();

此说明的含义是

A)fun函数无返回值

B)fun函数的返回值可以是任意的数据类型

C)fun函数的返回值是无值型的指针类型

D)指针fun指向一个函数,该函数无返回值

第二节函数的调用与函数说明

习题

1.有以下程序

#include<stdio.h>

intf(intx)

(

inty;

if(x==0llx==l)return(3);

y=x*x-f(x-2);

returny;

)

main()

(

intz;

z=f(3);

printf(n%d\nn,z);

)

程序的运行结果是C

A)0B)9C)6D)8

2.以下叙述中错误的是C

A)改变函数形参的值,不会改变对应实参的值

B)函数可以返回地址值

C)可以在函数内部定义函数

D)调用sin函数需要包含头文件math.h

3.若程序中定义了以下函数

doublemyadd(doublea,doubleb)

(

return(a+b);

)

并将其放在调用语句之后,则在调用之前应进行函数声明,以下选项中错误的是A

A)doublemyadd(doublea,b);B)doublemyadd(double,double);

C)doublemyadd(doubleb,doublea);D)doublemyadd(doublex,doubley);

第三节函数的数据传递

习题

1.有以下程序

voidf(intv,intw)

(

intt;

t=v;v=w;w=t;

)

main()

(

intx=l,y=3,z=2;

if(x>y)

f(x,y);

elseif(y>z)

f(y,z);

else

f(x,z);

printf("%d,%d,%d\n",x,y,z);

)

执行后输出结果是C

A)1,2,3B)3,1,2C)1,3,2D)2,3,1

2.以下程序的输出结果是«13

#include<stdio.h>

voidfun(intx)

(

if(x/2>0)

ftin(x/2);

printf("%d*',x);

)

main()

(

fun(3);

printfC^n");

第六章指针

第一节变量的地址和指针

习题

1.以下叙述中错误的是C

A)改变函数形参的值,不会改变对应实参的值

B)函数可以返回地址值

C)可以给指针变量赋一个整数作为地址值

D)当在程序的开头包含文件stdio.h时,可以给指针变量赋NULL

2.以下定义语句中正确的是D

A)inta=b=0;B)char,A'=65+l,b='b';

C)floata=l,*b=&a,*c=&b;D)doublea=0.0,b=l.1;

3.设已有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是D

A)float*p=1024;B)int*p=(floatx);

C)floatp=&x;D)float*P=&x;

第二节指针变量赋值及运算

习题

1.设有定义:intnH),*p=&n,**q=&p;,则以下选项中,正确的赋值语句是D

A)p=l;B)*q=2;C)q=p;D)*p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论