第8章和第10章习题答案.docx
《第8章和第10章习题答案.docx》由会员分享,可在线阅读,更多相关《第8章和第10章习题答案.docx(19页珍藏版)》请在冰豆网上搜索。
第8章和第10章习题答案
习题(函数和指针)
一、选择题
1-5
A
B
D
D
B
6-10
D
C
B
C
C
1.若有”fun(inta[],intn)”,以下说法正确的是()。
A.函数的类型为单精度类型
B.第一个实参应该是数组名
C.实参和形参之间是一个值传递的过程
D.以上说法都不对
2.下列有关函数调用的说法不正确的是()。
A.若用值传递方式,则形式参数在函数被调用时才分配内存
B.实际参数和形式参数不可以同名
C.主调函数和被调用函数可以不在同一个文件中
D.函数间传送数据可以使用外部全局变量
3.下列叙述中正确的是()。
A.函数可以嵌套定义,但不能嵌套调用
B.函数可以嵌套调用,也可以嵌套定义
C.函数不可以嵌套定义,也不可以递归调用
D.函数可以嵌套调用,但不能嵌套定义
4.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是
A.函数的实参和其对应的形参共占同一存储单元
B.形参只是形式上的存在,不占用具体存储单元
C.同名的实参和形参占同一存储单元
D.函数的形参和实参分别占用不同的存储单元
5.函数中未指定存储类型的变量,其隐含的存储类型是()。
A.staticB.autoC.externD.register
6.在一个C语言源程序文件中所定义的全局变量,其作用域为:
A.所在文件的全部范围B.所在程序的全部范围
C.所在函数的全部范围D.由具体定义位置和extern说明来决定范围
7.所谓静态存储即是在程序运行期间分配固定的()。
A.变量名称B.变量值C.存储单元D.作用域
8.以下只有在使用时才为该类型变量分配内存的存储类型是()。
A.auto和staticB.auto和register
C.register和staticD.extern和register
9.设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是()。
A.autoB.registerC.staticD.auto或register
10.若变量定义时未初始化,则其值不确定的是()。
A.静态全局变量 B.静态局部变量 C.局部变量 D.全局变量
11-16
B
D
D
C
B
A
11.以下叙述中错误的是()。
A.用户定义的函数中可以没有return语句
B.用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值
C.用户定义的函数中若没有return语句,则应当定义函数为void类型
D.函数的return语句中可以没有表达式
12.下列关于指针定义的描述中不正确的是()。
A.指针变量是一种变量,该变量是用来存放某个变量的地址值的
B.指针变量的类型与它所指向的变量类型一致
C.指针变量的命名规则与标识符相同
D.在定义指针时,”*”号表示指针变量的指向
13.若有说明语句:
double*p,a;则能通过scanf语句正确给输入项读入数据的程序段是()。
A.*p=&a;scanf(“%lf”,p);B.*p=&a;scanf(“%f”,p);
C.p=&a;scanf(“%lf”,*p);D.p=&a;scanf(“%lf”,p);
14.以下叙述中错误的是()。
A.改变函数形参的值,不会改变对应实参的值B.函数可以返回地址值C.可以给指针变量赋一个整数作为地址值
D.当在程序的开头包含文件stdio.h时,可以给指针变量赋NULL
15.下列程序的运行结果是()。
#include"stdio.h"
intf(inta)
{switch(a)
{case0:
return0;
case1:
case2:
return1;
}
return(f(a-2)+f(a-3));
}
main()
{intb;
b=f(9);
printf(“%d\n”,b);
}
A.10 B.7 C.8 D.9
16.以下程序的输出结果是()。
intf(intb[],intm,intn)
{inti,s=1;
for(i=m;i{b[i]=b[i-1]+b[i+1];s+=b[i];}
returns;}
main()
{intx,a[]={1,2,3,4,5,6,7,8,9,10};
x=f(a,3,5);
printf("%d\n",x);}
A.23 B.26 C.42 D.35
17-20
B
B
B
D
17.下列程序的输出结果是(B)。
#include"stdio.h"
intf(intn)
{staticintk,s;
n--;
for(k=n;k>0;k--)
s+=k;
returns;
}
main()
{intk;
k=f
(2);
printf("(%d,%d)\n",k,f(k));
}
A.(3,3) B.(1,1) C.(3,6) D.(6,12)
18.函数f定义如下,执行语句”m=f(5);”后,m的值应为(B)。
intf(intk)
{if(k==0||k==1)return1;
elsereturnf(k-1)+f(k-2);
}
A.3 B.8 C.5 D.13
19.下列程序段的输出结果是(B)。
intc[]={1,7,12};
int*k=c+1;
printf("%d",*k++);
A.2B.7C.8D.12
20.下列程序的运行结果是(D)。
main()
{inta=4,y;
y=fun(a,++a);
printf(“%d”,y);
}
intfun(intx,intc)
{intb;
if(xelseif(x==c)b=0;
elseb=-1;
return(b);
}
A.4 B.-1 C.1 D.0
21-24
A
A
C
D
21.下列程序的输出结果是(A)。
intf()
{staticinti=0;
ints=1;
s+=i;i++;
returns;}
main()
{inti,a=0;
for(i=0;i<6;i++)
a+=f();
printf(“%d\n”,a);
}
A.21 B.24 C.25 D.15
22.若有如下程序:
voids(char*m,intn)
{
*m=*m+3;n=n+3;
printf("%c,%c,",*m,n);
}
main()
{
charp=’b’,q=’B’;
s(&q,p);
printf("%c,%c\n",p,q);
}
则程序运行后的输出结果是(A)。
A.E,e,b,E B.e,E,b,F C.E,e,e,E D.e,E,b,E
23.函数f定义如下,执行语句”sum=f(4)+f
(2);”后,sum的值应为(C)。
intf(intm)
{staticinti=0;ints=0;
for(;i<=m;i++)s+=i;returns;
}
A.13 B.16 C.10 D.8
24.若有以下调用语句,则不正确的fun函数的首部为(D)。
main()
{…
inta[50],n;
…
fun(n,&a[9]);
…
}
A.voidfun(intm,intx[]) B.voidfun(ints,inth[41])
C.voidfun(intp,int*s) D.voidfun(intn,inta)
25-28
C
A
C
B
25.有以下程序
#include
intf(intx)
{inty;
if(x==0||x==1)return(3);
y=x*x-f(x-2);
returny;
}
main()
{intz;
z=f(3);printf("%d\n",z);
}
程序的运行结果是C
A.0B.9C.6D.8
26.下列程序执行后的输出结果是A
voidfunc(int*a,intb[])
{b[0]=*a+6;}
main()
{inta,b[5];
a=0;b[0]=3;
func(&a,b);printf("%d\n",b[0]);}
A.6B.7C.8D.9
27.有以下程序
#include
voidfun(intp)
{intd=2;
p=d++;printf(“%d”,p);}
main()
{inta=1;
fun(a);printf(“%d\n”,a);}程序运行后的输出结果是C
A.32B.12C.21D.22
28.有以下程序
#include
voidfun(int*a,int*b)
{int*c;
c=a;a=b;b=c;}
main()
{intx=3,y=5,*p=&x,*q=&y;
fun(p,q);printf(“%d,%d,”,*p,*q);
fun(&x,&y);printf(“%d,%d\n”,*p,*q);}程序运行后的输出结果是B
A.3,5,5,3B.3,5,3,5C.5,3,3,5D.5,3,5,3
29-34
A
C
B
D
C
B
29.有以下程序
#include
voidf(int*p,int*q);
main()
{intm=1,n=2,*r=&m;
f(r,&n);
printf(“%d,%d”,m,n);}
voidf(int*p,int*q)
{p=p+1;*q=*q+1;}
程序运行后输出的结果是A
A.1,3B.2,3C.1,4D.1,2
30.以下函数按每行8个输出数组中的数据
voidfun(int*w,intn)
{inti;
for(i=0;i{_________________
printf(“%d”,w);}
printf(“\n”);}下划线处应填入的语句是C
A.if(i/8==0)printf(“\n”);B.if(i/8==0)continue;
C.if(i%8==0)printf(“\n”);D.if(i%8==0)continue;
31.有以下程序
#include
intfun(intx,inty)
{if(x==y)return(x);
elsereturn((x+y)/2);}
main()
{inta=4,b=5,c=6;
printf(“%d\n”,fun(2*a,fun(b,c)));}程序运行后的输出结果是B
A.3B.6C.8D.12
32.有以下程序
#include
voidfun(inta[],intn)
{inti,t;
for(i=0;i}
main()
{intk[10]={1,2,3,4,5,6,7,8,9,10},i;
fun(k,5);
for(i=2;i<8;i++)printf("%d",k[i]);
printf("\n");
}程序的运行结果是()。
D
A.345678B.876543C.1098765D.321678
33.有以下程序
#include
intfun(chars[])
{intn=0;
while(*s<=’9’&&*s>=’0’){n=10*n+*s-’0’;s++;}
return(n);}
main()
{chars[10]={‘6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’};
printf("%d\n",fun(s));}程序运行的结果是(C)。
A.9B.61490C.61D.5
34.已定义以下函数
intfun(int*p)
{return*p;}fun函数返回值是(B)。
A.不确定的值B.一个整数C.形参p中存放的值D.形参p的地址值
二、填空题
1
strlen
2
有参函数库函数
3
32
4
staticregisterextern
5
编译0
6
形参实参值传递
7
2
8
变量地址
9
double*p=&a;
10
4
1.求字符串长度的标准库函数是。
2.从函数的形式看,函数分为__________和无参函数,从用户使用的角度看,函数分为________和用户自定义函数。
3.已知inta[4]={1,3,5,7},*q;q=a;,则*(q+1)的值为_____,*q+1的值为_____.
4.根据变量存储方式的不同,变量共有auto、______、_______和________四种类型。
5.静态局部变量在_________时被赋初值,并且如果在定义静态局部变量时不赋初值的话,则它的值为_______。
6.形式参数简称_____,实际参数简称______。
根据形成参数的不同,实际参数传给形式参数可以分为_________和地址传递两类。
7.已知函数fun()存在,并且有调用表达式fun(a,(a,b)),则可以判断出此函数有_______个形式参数。
8.指针变量是用于存放的变量。
9.已知doublea=9;请定义一个指针p,并指向变量a,要求用一条语句实现:
____________________.
10.已知inta[]={2,4,6,8,9,7,8,9},*p=a+2;则p++执行后,p指向数组a的第____个元素。
三、程序分析题
1
9
2
10
3
ABC
4
125
5
3025
6
123
7
3,6
8
9.8,7.5
9
6.3,5.7
1.以下程序的输出结果是:
_________。
floatfun(intx,inty)
{
return(x+y);
}
main()
{inta=2,b=5,c=8;
printf("%3.0f\n",fun((int)fun(a+c,b),a-c));
}
2.以下程序的运行结果是__________。
#include"stdio.h"
inta=3,b=6;
main()
{inta=4,c;
c=plus(a,b);
printf(“%d\n”,c);
}
plus(intx,inty)
{intz;
z=x+y;
return(z);}
3.以下程序的运行结果是__________。
#include"stdio.h"
#include"string.h"
main()
{charstr1[20]={"WO"},str2[20]={"ABC"};
strcpy(str1,str2);
printf("%s",str1);
}
4.以下程序运行后的输出结果是_________。
intx;
main()
{x=5;
cube();
printf(“%d\n”,x);
}
cube()
{x=x*x*x;}
5.有以下程序
#include
inta=5;
voidfun(intb)
{inta=10;
a+=b;
printf(“%d”,a);
}
main()
{intc=20;
fun(c);
a+=c;
printf(“%d\n”,a);}程序运行后的输出结果是________。
6.有以下程序
#include
fun(intx)
{if(x/2>0)fun(x/2);
printf(“%d“,x);
}
main()
{fun(6);printf(“\n”);}程序运行后的输出结果是________。
7.以下程序运行后的输出结果是_____________________。
#include
intmain()
{inta,b;
int*p,*q;
p=&a;q=&b;
*p=3;*q=a+*p;
printf("%d,%d\n",a,b);
return0;
}
8.以下程序运行后的输出结果是_____________________。
#include
voidfun(double*x,double*y)
{double*t;
t=x;
x=y;
y=t;}
intmain()
{doublea=9.8,b=7.5;
fun(&a,&b);
printf("%.1f,%.1f\n",a,b);
return0;
}
9.以下程序运行后的输出结果是_____________________。
#include
voidfun(doublex,doubley)
{doublet;
t=x;x=y;y=t;
}
intmain()
{doublea=6.3,b=5.7;
fun(a,b);
printf("%.1f,%.1f\n",a,b);
return0;
}
四、程序填空题
1
x+8
sin(x)
2
return0;
return1;
1.以下程序中,函数fun的功能是计算x2-2x+6,主函数中将调用fun函数计算:
y1=(x+8)2-2(x+8)+6
y2=sin2(x)-2sin(x)+6
请填空。
#include"math.h"
doublefun(doublex)
{return(x*x-2*x+6);}
main()
{doublex,y1,y2;printf("Enterx:
");scanf("%lf",&x);
y1=fun(______);y2=fun(________);
printf("y1=%lf,y2=%lf\n",y1,y2);}
2.以下isprime函数的功能是判断形参a是否为素数,是素数,函数返回1,否则返回0,请填空
intisprime(inta)
{inti;
for(i=2;i<=a/2;i++)
if(a%i==0);
;
}
五、编程题
1.编写一个函数,求三个数的最大值。
函数头部为:
doublefun(doublex,doubley,doublez)
方法一、
doublefun(doublex,doubley,doublez)
{
intmax;
max=x;
if(y>max)max=y;
if(z>max)max=z;
returnmax;
}
方法二、
doublefun(doublex,doubley,doublez)
{
intmax;
if(x>y)max=x;
elsemax=y;
if(z>max)max=z;
returnmax;
}
2.编写一个函数求1+2+3+……n
函数头部为:
intfun(intn)
方法一、
intfun(intn)
{intsum=0,i;
for(i=1;i<=n;i++)
sum=sum+i;
returnsum;
}
方法二、
intfun(intn)
{intsum=0,i=1;
while(i<=n)
{sum=sum+i;
i++;
}
returnsum;
}
3.编写一个函数,求一个5×5整型矩阵的两条对角线元素之和。
函数头部为doublefun(doublea[5][5])
doublefun(doublea[5][5])
{
inti,j;
doublesum=0;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
if(i==j||i+j==4)sum=sum+a[i][j];
returnsum;
}
4.编写一个函数,交换两个数的值,要求用指针实现。
函数头部为:
voidfun(int*x,int*y)
voidfun(int*x,int*y)
{intt;
t=*x;*x=*y;*y=t;
}