c语言习题8.docx
《c语言习题8.docx》由会员分享,可在线阅读,更多相关《c语言习题8.docx(51页珍藏版)》请在冰豆网上搜索。
c语言习题8
第八章 函数
8.1 选择题
【题8.1】以下正确的说法是 。
建立函数的目的之一是A)提高程序的执行效率
B)提高程序的可读性
C)减少程序的篇幅
D)减少程序文件所占内存
【题8.2】以下正确的说法是 。
A)用户若需调用标准库函数,调用前必须重新定义
B)用户可以重新定义标准库函数,若如此,该函数将失去原有含义
C)系统根本不允许用户重新定义标准库函数
D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调
【题8.3】以下正确的函数定义形式是 。
A)doublefun(intx,inty)
B)doublefun(intx;inty)
C)doublefun(intx,inty);
D)doublefun(intx,y);
【题8.4】以下正确的函数形式是 。
A)doublefun(intx,inty)
{z=x+y;returnz;}
B)fun(intx,y)
{intz;returnz;}
C)fun(x,y)
{intx,y;doublez;z=x+y;returnz;}
D)doublefun(intx,inty)
{doublez;z=x+y;returnz;}
【题8.5】以下正确的说法是 。
在C语言中A)实参和与其对应的形参各占用独立的存储单元
B)实参和与其对应的形参共占用一个存储单元
C)只有当实参和与其对应的形参同名时才共占用存储单元
D)形参是虚拟的,不占用存储单元
【题8.6】若调用一个函数,且此函数中没有return语句,则正确的说法是 。
该函数A)没有返回值
B)返回若干个系统默认值
C)能返回一个用户所希望的函数值
D)返回一个不确定的值
【题8.7】以下不正确的说法是 。
C语言规定A)实参可以是常量、变量或表达式
B)形参可以是常量、变量或表达式
C)实参可以为任意类型
D)形参应与其对应的实参类型一致
【题8.8】以下正确的说法是 。
A)定义函数时,形参的类型说明可以放在函数体内
B)return后边的值不能为表达式
C)如果函数值的类型与返回值类型不一致,以函数值类型为准
D)如果形参与实参的类型不一致,以实参类型为准
【题8.9】C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是 。
A)地址传递
B)单向值传递
C)由实参传给形参,再由形参传回给实参
D)由用户指定传递方式
【题8.10】以下程序有语法性错误,有关错误原因的正确说法是 。
main()
{
intG=5,k;
voidprt_char();
……
k=prt_char(G);
……
}
A)语句voidprt_char();有错,它是函数调用语句,不能用void说明
B)变量名不能使用大写字母
C)函数说明和函数调用语句之间有矛盾
D)函数名不能使用下划线
【题8.11】C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 。
A)float型
B)int型
C)long型
D)double型
【题8.12】C语言规定,函数返回值的类型是由 。
A)return语句中的表达式类型所决定
B)调用该函数时的主调函数类型所决定
C)调用该函数时系统临时决定
D)在定义该函数时所指定的函数类型所决定
【题8.13】下面函数调用语句含有实参的个数为 。
func((exp1,exp2),(exp3,exp4,exp5));
A)1B)2C)4D)5
【题8.14】以下错误的描述是 。
函数调用可以A)出现在执行语句中
B)出现在一表达式中
C)做为一个函数的实参
D)做为一个函数的形参
【题8.15】以下程序的功能是计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值,请选择填空。
#include
#include
main()
{
floatx,y,z,sum;
scanf(“%f%f%f”,&x,&y,&z);
sum=f(【1】)+f(【2】);
printf(“sum=%f\n”,sum);
}
floatf(floata,floatb)
{
floatvalue;
value=a/b;
return(value);
}
【1】A)x-y,x+yB)x+y,x-yC)z+y,z-yD)z-y,z+y
【2】A)x-y,x+yB)x+y,x-yC)z+y,z-yD)z-y,z+y
【题8.16】以下正确的描述是 。
在C语言程序中A)函数的定义可以嵌套,但函数的调用不可以嵌套
B)函数的定义不可以嵌套,但函数的调用可以嵌套
C)函数的定义和函数的调用均不可以嵌套
D)函数的定义和函数的调用均可以嵌套
【题8.17】以下程序是选出能被3整除且至少有一位是5的两位数,打印出所有这样的数及其个数。
请选择填空。
sub(intk,intn)
{
inta1,a2;
a2=【1】;
a1=k-【2】;
if((k%3==0&&a2==5)||(k%3==0&&a1==5))
{
printf(“%d”,k);
n++;
returnn;
}
elsereturn-1;
}
main()
{
intn=0,k,m;
for(k=10;k<=99;k++)
{
m=sub(k,n);
if(m!
=-1)n=m;
}
printf(“\nn=%d”,n);
}
【1】A)k*10B)k%10C)k/10D)k*10%10
【2】A)a2*10B)a2C)a2/10D)a2%10
【题8.18】以下是有关汉诺塔问题的程序段,若在main函数中有调用语句hanoi(3,‘A’,‘B’,‘C’);则符合程序段运行结果的选项是 。
voidmove(chargetone,charputone)
{
printf(“%c-->%c\n”,getone,putone);
}
voidhanoi(intn,charone,chartwo,charthree)
{
if(n==1)move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
A)A-->CB)A-->CC)A-->CD)A-->C
A-->BA-->BA-->BA-->B
C-->BC-->AC-->BC-->B
B-->AA-->BA-->CA-->C
C-->BB-->CB-->AA-->B
A-->CA-->CB-->CB-->C
A-->BA-->BA-->CA-->C
【题8.19】若用数组名作为函数调用的实参,传递给形参的是 。
A)数组的首地址
B)数组第一个元素的值
C)数组中全部元素的值
D)数组元素的个数
【题8.20】已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组array的错误定义方式为 。
inta[3][4];
f(a);
A)f(intarray[][6])
B)f(intarray[3][])
C)f(intarray[][4])
D)f(intarray[2][5])
【题8.21】若使用一维数组名作函数实参,则以下正确的说法是 。
A)必须在主调函数中说明此数组的大小
B)实参数组类型与形参数组类型可以不匹配
C)在被调函数中,不需要考虑形参数组的大小
D)实参数组名与形参数组名必须一致
【题8.22】折半查找法的思路是:
先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值。
如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。
函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;返回-1。
请选择填空。
binary(inta[10],intm)
{
intlow=0,high=9,mid;
while(low<=high)
{
mid=(low+high)/2;
if(melseif(m>a[mid])【2】;
elsereturn(mid);
}
return(-1);
}
【1】A)high=mid-1B)low=mid+1C)high=mid+1D)low=mid-1
【2】A)high=mid-1B)low=mid+1C)high=mid+1D)low=mid-1
【题8.23】以下正确的说法是 。
如果在一个函数中的复合语句中定义了一个变量,则该变量
A)只在该复合语句中有效
B)在该函数中有效
C)在本程序范围内均有效
D)为非法变量
【题8.24】以下不正确的说法为 。
A)在不同函数中可以使用相同名字的变量
B)形式参数是局部变量
C)在函数内定义的变量只在本函数范围内有效
D)在函数内的复合语句中定义的变量在本函数范围内有效
【题8.25】以下程序的正确运行结果是 。
#defineMAX10
inta[MAX],i;
main()
{
printf(“\n”);sub1();sub3(a);sub2();sub3(a);
}
sub2()
{
inta[MAX],i,max;
max=5;
for(i=0;i}
sub1()
{
for(i=0;i}
sub3(inta[])
{
inti;
for(i=0;iprintf(“\n”);
}
A)024681012141618
01234
B)01234
024681012141618
C)0123456789
01234
D)024681012141618
024681012141618
【题8.26】以下程序的正确运行结果是 。
#include
voidnum()
{
externintx,y;
inta=15,b=10;
x=a-b;
y=a+b;
}
intx,y;
main()
{
inta=7,b=5;
x=a+b;
y=a-b;
num();
printf(“%d,%d\n”,x,y);
}
A)12,2B)不确定C)5,25D)1,12
【题8.27】凡是函数中未指定存储类型的局部变量,其隐含的存储类别为 。
A)自动(auto)B)静态(static)
C)外部(extern)D)寄存器(register)
【题8.28】在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是 。
A)externB)registerC)autoD)static
【题8.29】以下程序的正确运行结果是 。
main()
{
inta=2,i;
for(i=0;i<3;i++)printf(“%4d”,f(a));
}
f(inta)
{
intb=0;
staticintc=3;
b++;c++;
return(a+b+c);
}
A)777B)71013C)7911D)789
【题8.30】以下程序的正确运行结果是 。
#include
main()
{
intk=4,m=1,p;
p=func(k,m);printf(“%d”,p);
p=func(k,m);printf(“%d\n”,p);
}
func(inta,intb)
{
staticintm=0,i=2;
i+=m+1;
m=i+a+b;
return(m);
}
A)8,17B)8,16C)8,20D)8,8
8.2 填空题
【题8.31】C语言规定,可执行程序的开始执行点是 。
【题8.32】在C语言中,一个函数一般由两个部分组成,它们是【1】和【2】。
【题8.33】若输入的值是-125,以下程序的运行结果是 。
#include
main()
{
intn;
scanf(“%d”,&n);
printf(“%d=”,n);
if(n<0)printf(“-”);
n=fabs(n);
fun(n);
}
fun(intn)
{
intk,r;
for(k=2;k<=sqrt(n);k++)
{
r=n%k;
while(r==0)
{
printf(“%d”,k);
n=n/k;
if(n>1)printf(“*”);
r=n%k;
}
}
if(n!
=1)printf(“%d\n”,n);
}
【题8.34】下面add函数的功能是求两个参数的和,并将和值返回调用函数。
函数中错误的部分是【1】;改正后为【2】。
voidadd(floata,floatb)
{
floatc;
c=a+b;
returnc;
}
【题8.35】以下程序的运行结果是 。
main()
{
inti=2,x=5,j=7;
fun(j,6);
printf(“i=%d;j=%d;x=%d\n”,i,j,x);
}
fun(inti,intj)
{
intx=7;
printf(“i=%d;j=%d;x=%d\n”,i,j,x);
}
【题8.36】以下程序的运行结果是 。
main()
{
increment();
increment();
increment();
}
increment()
{
intx=0;
x+=1;
printf(“%d”,x);
}
【题8.37】以下程序的运行结果是 。
#include
main()
{
inta=1,b=2,c;
c=max(a,b);
printf(“maxis%d\n”,c);
}
max(intx,inty)
{
intz;
z=(x>y)?
x:
y;
return(z);
}
【题8.38】以下程序的功能是根据输入的“y”(“Y”)与“n”(“N”),在屏幕上分别显示出“ThisisYES.”与“ThisisNO.”。
请填空。
#include
voidYesNo(charch)
{
switch(ch)
{
case‘y’:
case‘Y’:
printf(“\nThisisYES.\n”);【1】;
case‘n’:
case‘N’:
printf(“\nThisisNo.\n”);【2】;
}
}
main()
{
charch;
printf(“\nEnterachar‘y’,‘Y’or‘n’,‘N’:
”);
ch=【3】;
printf(“ch:
%c”,ch);
YesNo(ch);
}
【题8.39】以下Check函数的功能是对value中的值进行四舍五入计算,若计算后的值与ponse值相等,则显示“Welldone!
!
”,否则显示计算后的值。
已有函数调用语句Check(ponse,value);请填空。
voidCheck(intponse,floatvalue)
{
intval;
val=【1】;
printf(“计算后的值:
%d”,val);
if(【2】)printf(“\nWELLDONE!
!
!
\n”);
elseprintf(“\nSorrythecorrectansweris%d\n”,val);
}
【题8.40】以下程序的功能是 。
#include
f(intn)
{
inti,j,k;
i=n/100;j=n/10-i*10;k=n%10;
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)returnn;
elsereturn0;
}
main()
{
intn,k;
printf(“output”);
for(n=100;n<1000;n++)
{
k=f(n);
if(k!
=0)
printf(“%d”,k);
}
printf(“\n”);
}
【题8.41】以下程序的功能是用二分法求方程
的根,并要求绝对误差不超过0.001。
请填空。
#include
floatf(floatx)
{
return(2*x*x*x-4*x*x+3*x-6);
}
main()
{
floatm=-100,n=90,r;
r=(m+n)/2;
while(f(r)*f(n)!
=0)
{
if(【1】)m=r;
elsen=r;
if(【2】)break;
r=(m+n)/2;
}
printf(“Theisfangchengjieis%6.3f\n”,r);
}
【题8.42】若输入一个整数10,以下程序的运行结果是 。
main()
{
inta,e[10],c,i=0;
printf(“输入一整数\n”);
scanf(“%d”,&a);
while(a!
=0)
{
c=sub(a);
a=a/2;
e[i]=c;
i++;
}
for(;i>0;i--)printf(“%d”,e[i-1]);
}
sub(inta)
{
intc;
c=a%2;
returnc;
}
【题8.43】以下程序的功能是计算下面函数的值。
请填空。
#include
#include
floatf();
main()
{
floatx,y,z,sum;
printf(“\ninputx,y,z:
\n”);
scanf(“%f%f%f”,&x,&y,&z);
sum=【1】;
printf(“sum=%f\n”,sum);
}
floatf(floata,floatb,floatc)
{
floatvalue;
value=【2】;
return(value);
}
【题8.44】已有函数pow,现要求取消变量i后pow函数的功能不变。
请填空。
修改前的pow函数pow(intx,inty)
{
inti,j=1;
for(i=1;i<=y;++i)j=j*x;
return(j);
}
修改后的pow函数pow(intx,inty)
{
intj;
for(【1】;【2】;【3】)j=j*x;
return(j);
}
【题8.45】以下程序的运行结果是输出如下图形。
请填空。
*
***
*****
*******
*****
***
*
#include
voida(inti)
{
intj,k;
for(j=0;j<=7-i;j++)printf(“”);
for(k=0;k<【1】;k++)printf(“*”);
printf(“\n”);
}
main()
{
inti;
for(i=0;i<3;i++)【2】;
for(i=3;i>=0;i--)【3】;
}
【题8.46】以下程序的功能是求三个数的最小公倍数,请填空。
#include
max(intx,inty,intz)
{
if(x>y&&x>z)return(x);
elseif(【1】)return(y);
elsereturn(z);
}
main()
{
intx1,x2,x3,i=1,j,x0;