第五到八章习题集答案及课后习题答案.docx
- 文档编号:6480527
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:29
- 大小:34.31KB
第五到八章习题集答案及课后习题答案.docx
《第五到八章习题集答案及课后习题答案.docx》由会员分享,可在线阅读,更多相关《第五到八章习题集答案及课后习题答案.docx(29页珍藏版)》请在冰豆网上搜索。
第五到八章习题集答案及课后习题答案
习题集答案(后附课后习题答案)
第五章函数
一、选择题:
1.答案:
B
分析:
在C语言中,函数可以在任何地方出现,而main函数作为函数中的一类,没有特殊的限制和要求,故也可以在任何地方出现。
2.答案:
B
分析:
C语言默认规定
3.答案:
D
分析:
选项A中”abc”和C中的’65’是一个字符串,而形参要求的是单个字符不符合要求,选项B是一个赋值语句,而fun函数没有返回值,所以不符合要求,只有选项D正确,将32传给ch字符变量,那么32就相当于是ASCII码值。
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
分析:
f1(x,y)的作用是返回x、y中较大的,f2(x,y)的作用是返回x、y中较小的。
d=f1(a,b)=f1(4,3)=4
d=f1(d,c)=f1(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)=9。
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
分析:
fun1(a)=a2,fun2(x,y)=(int)(fun1(x)+fun1(y))=(int)(x2+y2),所以fun1(1.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语言的函数不能嵌套定义,所以本题选择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
(1)=9-3=6。
21.答案:
D
分析:
在内存中,实参单元与形参单元是不同的单元。
在C语言中,仅在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。
故本题答案为D。
22.答案:
C
分析:
变量a,b,c的初始值分别为1,2,3。
因此逗号表达式“a++,b++,a+b”值等于5,表达式c++的值为3,这样主函数main()中调用子函数的表达式为fun(5,3);其返回值等于8。
所以变量sum的值等于8。
本题选择C。
二、填空题:
1.答案:
a=1.0,b=1.0,s=1.0;
分析:
分别求出变量的初始值。
a=a*x为的是求xn,所以其初始值为1,b=b*i
位的是求n!
,所以其初始值为1,当n=0时,s=1,所以s的初始值为1。
由
于定义的是double型的数据,所以答案为a=1.0,b=1.0,s=1.0;
2.答案:
m=fun(a,4)+fun(b,4)-fun(a+b,3);
分析:
由程序可以看出fun(x,n)=xn。
fun(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+1
分析:
1)求f(x)的累加和,即为求f(0)+f
(1)+f
(2)+f(3)+f(4)+……,函数SunFun来实现此功能。
括号中应该填入累加的序号值,即为x。
2)f(x)=x2+1,F(intx)函数来实现这个功能,所以填写x*x+1。
1.答案:
-ffun(10)
分析:
函数的作用为计算m=1-2+3-4+5-6+7-8+9-10,实际上为计算
m=1*1+(-1)*2+1*3+(-1)*4+……+1*9+(-1)*10,在循环体中,i为1,2,3…..
f为1的符号。
每循环一次,f的符号应该变换一下,所以变换的语句为f=-f。
当n=1时,计算的是m=1;当n=2时,计算的是m=1-2……因为计算的是m=1-2+3-4+5-6+7-8+9-10,所以答案为n=10,即fun(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)。
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)中又调用fun(3/2)即fun
(1),先输出fun
(1)中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=n1;是把n2的值赋给n1,故根据指针赋值的定义可知选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=&p。
8答案:
C
分析:
本题主要考的是全局变量和局部变量,以及指针的用法,第一个f(&a)的返回值是5,第二个返回值是2。
9答案:
A
分析:
本题主要考的是变量自加,指针传值,以及指针的赋值。
通过第二行a=b可知p1,p2指向的变量的值相同,都指向了b所指的对象,也是p2所指的对象’a’,由于(*a)++;是实现a所指对象的自加,故由’a’变成’b’,故最终选A。
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=&a。
17答案:
D
分析:
本题主要考调用函数时指针传值和一般的变量的传值区别。
指针通过地址传值,而变量是直接传值。
c指针指向b,故对c指针里面的值的修改等于直接修改b中的值。
18答案:
D
分析:
本题主要考指针的定义及指针变量的值的输出方式,指针b指向a,故输出其值是511。
19答案:
C
分析:
本题主要考指针标识符*和乘号*的区别,*p=*p1*(*p2)中第1,2,4个*号是指针标识符,而第三个是乘号,故其运算的结果是3。
20答案:
C
分析:
本题主考函数的嵌套调用和数据的类型转换,注意的是(int)(a+b),所以得到5.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=1,p[1]=12不满足if语句,不执行j+=p[i]。
按照此方法,得到j=p[2]+p[4]+p[6]=45,即B正确。
3答案:
D
分析:
首先i=0<7&&p[0]%2!
=0,满足循环条件,执行k=k+p[0],即k=11,然后执行i++,再进行判断,满足循环条件,k=11+p[1],所以k=24,执行i++,i=2,,再进行判断,此时不满足循环条件,循环结束,输出k值,为24。
4答案:
A
分析:
此题主要考察循环嵌套,第一个循环体执行完是将x[0],x[1],x[2],x[3],进行从大到小排序,第二个循环体执行完是将x[4],x[5],x[6],x[7]进行从小到大排序。
5答案:
B
分析:
此题考察二维数组的定义,单纯定义二维数组时,行和列都不能缺省。
在初始化过程中,列不能缺省,赋值的行数和列数不能超过数组的行数和列数。
6答案:
D
分析:
同上题分析一样。
7答案:
D
分析:
同上。
8答案:
C
分析:
此题分别输出m[2][0],m[2][1],m[2][2]。
9答案:
A
分析:
此题考察在for循环后,i=0,i=1时,执行if语句,使得a[1][0],a[1][1]的值分别减1,而当i=2时,执行else语句,a[1][2]=1。
因此输出a[0][1]+a[1][1]+a[1][2]=2+4+1=7;
10答案:
B
分析:
此题考察for循环,计算aa[0][1],aa[1][1],aa[2][2],aa[3][1]的和,即为19。
11答案:
C
分析:
由于自增加运算符(++)的优先级别高于取地址运算符(&),所以选项C无法表示aa[1]的地址,其他三个选项都可以。
12答案:
D
分析:
数组名实际代表数组的首地址,也就是数组中第一个元素a[0]的地址,那么a+i就代表数组a中下标为i的元素a[i]的地址,*(a+i)就代表a[i]这个元素,所以*(*(a+i))的表示是错误的,此题选择D。
13答案:
A
分析:
本题答案为A,指针p指向数组a中第一个元素,此时p中存放的是数组中a[0]的地址,将指针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[1]+p[2]的值,由于指针p指向数组中元素a[1]所以p[1]即数组中元素a[2],p[2]即数组中元素a[3],a[2]+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[4]+a[6]+a[8]=1+3+5+7+9=25。
23答案:
B
分析:
让指针p指向二维数组a的第一个元素,那么可用p[0]代表a[0][0],用p[1]代表a[0][1]…………,用p[8]代表a[2][2],通过循环为数组a中的每一个元素赋了一个值。
输出a[1][2]即p[5]的值为6。
24答案:
D
分析:
让指针p指向二维数组a的第一个元素,那么可用p[0]代表a[0][0],用p[1]代表a[0][1]…………,用p[8]代表a[2][2],通过循环为数组a中的每一个元素赋了一个值。
再通过循环输出a[1][0]、a[1][1]、a[1][2],即p[3]、p[4]、p[5]的值,所以输出的是3、4、5。
25答案:
B
分析:
在这里我们通过(*ptr)[2]定义了一个行指针ptr,ptr存放的是含有两个整型元素的一维数组的首地址。
a是二维数组名,就是数组的首地址,ptr=a+i就代表,将数组中第i行的首地址赋给行指针ptr。
能过第一个循环控制,为第0行和第1的首元素赋值,也就是为a[0][0]和a[1][0]赋值,输入的是1、2、3,但是只赋给两个元素,所以取前面两个值,所以输出时,a[0][0]的值为1,a[1][0]的值为2,其他的默认都为0。
26答案:
B
分析:
int*p[3]是表示定义一个指针数组,数组名为p,其中包含3个元素,每个元素都是一个指向int类型的指针。
27答案:
D
分析:
通过(*p)[5]则定义了一个行指针,存放长度为5的一维数组的指针,通过p=c,让p指向二维数组c,那么p[i]就是指向数组c中第i行的指针。
p[i]+n就是数组中第i行,第n列的地址,如果要引用第i行第n列的元素,就可以表示成*(p[i]+n),所以本题选择D。
28答案:
D
分析:
二维数组元素的地址可以用表达式&a[i][j]求得,也可以通过每行的首地址来表示,第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[0]=a[1]可知p[0]中存放的是数组a中第1行的首地址,所以p[0]+1就代表第1行第1列元素的地址,所以*(p[0]+1)就代表元素a[1][1]。
30答案:
C
分析:
通过(*ps)[5]则定义了一个行指针,存放长度为5的一维数组的指针,通过ps=s,让ps指向二维数组s,那么ps[i]就是指向数组s中第i行的指针,可用ps[i][j]或*(ps[i]+j)表示第i行第j列的元素。
所以选项C正确。
31答案:
A
分析:
通过(*pa)[3]定义了一个行指针pa指向二维数组a,这样p[i][j]就表示a[i][j],通过循环语句控制将a[1][0]和a[1][1]中的值分别减1变为3和4,给a[1][2]赋值为1。
a[0][1]+a[1][1]+a[1][2]=2+4+1=7,所以本题选择A。
32答案:
B
分析:
循环共执行3次:
i=0并且j=0时:
t=t+b[0][b[0][0]]=1+b[0][0]=1+0=1,当i=1并且j=1时:
t=t+b[1][b[1][1]]=1+b[1][1]=1+1=2,当i=2并且j=2时:
t=t+b[2][b[2][2]]=2+b[2][2]=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[5]中的字符“z”。
37答案:
D
分析:
swap1(a,a+1)是将数组中元素a[0]和a[1]的地址传递给形参c0和c1两个数组,然后在函数swap1中对它们进行交换,由于传递的是地址值,所以形参变化,对应的实参也发生改变;所以a[0]与a[1]中的值也相互交换;swap2(&b[0],&b[1])是将数组b中元素b[0]和b[1]的地址传递给形参指针变量c0和c1,然后对指针变量所指的存储单元中的值进行交换,所以b[0]和b[1]中的值相对也发生变化,因此最后输出的值为5353。
38答案:
C
分析:
循环for (i=0;i<12;i++) c[s[i]]++; 共执行12次,分别为:
c[1]++,c[2]++,c[3]++,c[4]++,c[4]++,c[3]++,c[2]++,c[1]++,c[1]++,c[1]++,c[2]++,c[3]++,其中c[1]自加了4次,c[2]自加了3次,c[3]自加了3次,c[14]自加了2次,所以c[1]的值为4,c[2]的值为3,c[3]的值为3,c[4]的值为2,输出结果为4 3 3 2。
39答案:
C
分析:
函数fun的功能是将数组中下标从i到j的元素倒序,在主函数中先通过调用fun(a,0,3)将a[0]到a[3]的元素倒序得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 到八章 习题集 答案 课后 习题