第5章 函数带答案.docx
《第5章 函数带答案.docx》由会员分享,可在线阅读,更多相关《第5章 函数带答案.docx(28页珍藏版)》请在冰豆网上搜索。
第5章函数带答案
第5章函数
一、选择题
1、以下正确的说法是(A)
A)实参可以是常量、变量或表达式B)实参类型不必同形参类型一致
C)形参可以是常量、变量或表达式D)实参顺序与形参顺序无关
2、以下函数首部的定义形式的正确的是(B)
A)intfun(intx;inty)B)intfun(intx,inty)C)intfun(intx,y)D)intfun(intx,inty);
3、以下描述正确的是(B)
A)如果形参和实参的类型不一致,应以实参类型为准
B)如果函数值类型与返回值类型不一致,应以函数值类型为准
C)return语句后不能是表达式
D)定义函数时,可以省略不写形参的类型,只写形参名
4、下列关于函数的描述错误的是(D)
A)c程序是由函数组成的B)c程序中的函数是各自独立的
C)main函数可以调用其它的函数D)在main函数中可以嵌套定义别的函数
5、关于C语言的主函数描述正确的是()B
A)C程序可以有多个main函数B)C程序有且只有一个main函数
C)C程序可以没有main函数D)C程序不一定从main函数开始执行
6、若定义的函数有返回值,则以下关于该函数调用的叙述错误的是()D
A)函数调用可作为独立的语句存在B)函数调用可作为一个函数的实参
C)函数调用可以出现在表达式中D)函数调用可作为一个函数的形参
7、以下对于return语句的作用叙述不正确的是()C
A)可以将函数值返回给主调函数B)可以将程序流程返回到主调函数
C)一个函数只能有一个return语句D)一个函数可以没有return语句
8、C语言规定,函数返回值的类型是由(D)决定的。
A)return语句中表达式的类型B)调用该函数的主调函数的类型
C)调用该函数时系统临时D)在定义函数时所指定的函数值类型
9、在C语言程序中,若对函数类型未加显式说明,则函数的隐含类型为()A
A)intB)doubleC)voidD)float
10、若函数定义如下,则函数返回值的数据类型是()A
floatfun(intx)
{inty=x+2;
return(y);
}
A)floatB)intC)不能确定D)编译出错
11、以下正确的函数形式是()D
A)doublefun(intx,inty)B)voidfun(intx,y)
{z=x+y;{intz;
returnz;returnz;
}}
C)doublefun(x,y)D)doublefun(intx,inty)
{doublez=x+y;{doublez=x+y;
returnz;returnz;
}}
12、函数调用时,若参数为“值传递”方式,则下列描述错误的是(B)
A)实参可以是表达式B)实参与形参共用同一内存单元
C)调用时为形参分配内存单元D)实参与形参类型应一致
13、若函数定义如下,假设将常数1.6传给x,则函数的返回值是()B
intfun(floatx)
{floaty=x+2;
return(y);
}
A)3.6B)3C)4D)3.0
14、设有如下的函数,则函数返回值的类型是()C
ggg(floatx)
{return(x*x);}
A)与参数x的类型相同B)voidC)intD)无法确定
15、有以下程序,则执行后输出的结果是()A
#include"stdio.h"
voidfun(intk,intn)
{intt;
t=k; k=n;n=t;
}
voidmain()
{intk=1,m=2;
fun(k,m);
printf("%d,%d\n",k,m);
}
A)1,2B)2,1C)1,1D)2,2
16、以下程序运行后的输出结果是()D
#include"stdio.h"
intfun(inta,intb)
{if(a>b)return(a);
elsereturn(b);
}
voidmain()
{intx=3,y=8,z=6,r;
r=fun(fun(x,y),2*z);
printf("%d\n",r);
}
A)3B)6C)8D)12
*********************************数组作函数参数*********************************
17、对于一维数组名作函数实参,以下描述正确的是(A)
A)必须在主调函数中说明此数组的大小
B)实参数组类型与形参数组类型可以不一致
C)函数调用时是将实参数组中的所有元素值复制到形参数组中
D)实参数组名与形参数组名必须保持一致
18、数组名作参数时,以下叙述正确的是()B
A)函数调用时是将实参数组的所有元素传给形参
B)函数调用时是将实参数组的首地址传给形参
C)函数调用时是将实参数组的第1个元素传给形参
D)函数调用时是将实参数组所有元素的地址传给形参
19、已有如下数组定义和函数调用语句,则fun函数的形参数组的正确定义方法是(C)
inta[3][4];
fun(a);
A)fun(inta[][6])B)fun(inta[3][]C)fun(inta[][4])D)fun(inta[][])
20、有以下程序,则执行后的结果为()C
#include"stdio.h"
voidfun(intb[],intn)
{for(inti=0;i++b[i];
}
voidmain()
{ intx,a[5]={2,3,4,5,6};
f(a,5);
printf("%d\n",a[1]);
}
A)2B)3C)4D)5
***********************************嵌套和递归***********************************
21、以下描述错误的是()D
A)C程序中,函数可以直接或间接的调用自己
B)函数调用时,函数名必须与所调用的函数名字完全一致
C)函数声明语句中的类型必须与函数返回值的类型一致
D)实参数可以与形参个数不一致
22、关于递归函数的叙述错误的是()C
A)递归函数是自己调用自己B)递归函数占用较多的存储空间
C)递归函数的运行速度很快D)递归函数的运行速度一般比较慢
23、关于递归函数的叙述错误的是(A)
A)用递归函数求n!
比用循环求n!
的速度快B)递归函数经常使用if结构
C)递归函数运行时占用较多的存储空间D)通常递归函数的代码比较简洁
24、下列的结论中正确的是()B
A)所有的递归程序均可以采用非递归算法实现
B)只有部分递归程序可以用非递归算法实现
C)所有的递归程序均不可以采用非递归算法实现
D)以上三种说法都不对
25、关于二分搜索以下说法错误的是()B
A)二分搜索算法可以用循环语句实现B)二分搜索对数据排列没有要求
C)二分搜索算法可以用递归函数实现D)二分搜索体现了分治法的思想
****************************局部和全局变量及存储类别****************************
26、以下描述错误的是(D)
A)在不同的函数中可以使用相同名字的变量
B)函数定义中的形参是局部变量
C)在一个函数内部定义的变量只能在该函数内使用
D)在一个函数内的复合语句中定义变量在整个函数范围内有效
27、以下对局部变量描述正确的是()D
A)在函数内部定义的变量B)在main函数中定义的变量是局部变量
C)形式参数也是局部变量D)局部变量在程序的全部执行过程中一直占用存储单元
28、在一个源文件中定义的全局变量的作用域为()D
A)本文件的全部范围B)本程序的全部范围
C)本函数的全部范围D)从定义该变量的位置开始到本文件结束
29、以下关于局部变量和全局变量的叙述错误的是()D
A)main函数中定义的变量是局部变量B)局部变量可以与全局变量重名
C)在所有函数外定义的变量是全局变量D)形式参数不是局部变量
30、阅读下列程序,则执行后输出的结果是()A
#include"stdio.h"
intk=1;
voidfun(intk)
{k++;k=k*6;}
voidmain()
{fun(k);printf("%d\n",k);}
A)1B)2C)6D)12
31、对于函数中的局部变量来说,默认的存储类型是(A)
A)autoB)staticC)externD)register
32、C语言中,默认的函数的存储类别是(C)
A)autoB)staticC)externD)函数没有存储类别
33、程序中定义的全局变量存放在以下哪个存储区()C
A)堆存储区B)栈存储区C)静态存储区D)程序代码区
34、设在C程序中有2个文件f1.cpp和f2.cpp,若要定义一个只允许在f1.cpp中所有函数使用的全局变量,则该变量的存储类别应该是()D
A)externB)registerC)autoD)static
35、以下叙述不正确的是()B
A)在C语言中,若整型变量做函数参数,调用函数时是把实参的值传送给形参
B)在C的函数中,应该尽量多的使用全局变量
C)在C语言中,函数的返回值使用return语句返回
D)在C语言中,函数可以嵌套调用
二、填空题
1、用户自定义函数,必须先定义后使用。
2、C语言程序的基本单位是函数,C语言程序从开始执行。
main函数
3、用户自定义函数包括两个部分:
声明部分和执行部分,这两部分的顺序不能颠倒。
4、从函数定义的角度看,函数可以分为标准库函数和自定义函数两种。
5、对于有返回值的函数来说,通常函数体内包含有return语句。
6、当一个函数的返回值类型缺省时,意味着该函数的返回值类型为int型。
7、数组名作函数参数时,实际上是将实参数组的传给形参。
首地址
8、调用带参数的函数时,实参必须和形参数量相同,顺序一致。
9、C语言函数自己调用自己的方式称之为函数的。
递归
10、用递归求解问题的两个特点是和。
递归的结束条件求解问题的递归方式
11、变量的作用域和生存期是分别从空间和时间的角度来体现变量的特性。
12、变量的存储类型可分为静态存储和动态存储两种,具体的存储类型有四种:
auto,
static,register,extern。
13、一个已编译的C程序在运行时将占用4块内存区域:
、、、栈存储区。
静态存储区程序代码区堆存储区
14、根据函数能否被其他源文件中的函数调用,可分为内部函数和。
外部函数
三、阅读程序题
1、写出程序的输出结果。
#include"stdio.h"
voidfun(inta,intb)
{ints;
s=a*b/2;
a++;b++;
printf("s=%d\n",s);
}
voidmain()
{inta=10,b=16;
fun(a,b);
printf("a=%d,b=%d\n",a,b);
}
输出结果:
s=80
a=10,b=16
2、写出函数func的功能,假设输入x和y的值为18和24,写出程序的运行结果。
#include
intfun(inta,intb);
voidmain()
{intx,y,z;
scanf(“%d%d”,&x,&y);
z=fun(x,y);
printf(“z=%d”,z);
}
intfun(inta,intb)
{intr,t;
if(a
{t=a;a=b;b=t;}
while(b!
=0)
{r=a%b;a=b;b=r;}
return(a);
}
函数功能:
求两个数的最大公约数
运行结果:
z=6
3、写出程序的输出结果。
#include"stdio.h"
intfun1()
{intk=20;returnk;}
intfun2()
{inta=15;returna;}
voidfun3(inta,intb)
{intk;
k=(a-b)*(a+b);
printf("k=%d\n",k);
}
voidmain()
{fun3(fun1(),fun2());}
输出结果:
k=175
4、写出程序的输出结果。
#include
floatfun(intx,inty)
{return(x+y);}
voidmain()
{inta=2,b=5,c=8;
printf("%3.0f\n",fun((int)fun(a+c,b),a-c));
}
输出结果:
__9
5、写出fun1和fun2函数的功能和程序的运行结果。
(5分)
#include
intfun1(intx)
{inti,t=1;
for(i=1;i<=3;i++)t=t*x;
return(t);
}
intfun2(intn)
{inti,s=0;
for(i=1;i<=n;i++)s=s+fun1(i);
return(s);
}
voidmain()
{inty;
y=fun2(3);
printf("y=%d\n",y);
}
fun1函数的功能是:
求x!
fun2函数的功能是:
求1!
+2!
+…+n!
累加和
程序运行结果是:
y=36
6、写出程序的功能,假设输入为:
4↙,请写出输出结果。
(难度3颗星)
#include
#defineM6
voidmain()
{intn,i,j,pos,a[M]={1,3,5,7,9};
scanf("%d",&n);
if(n>a[M-2])a[M-1]=n;
else
{for(pos=0;posif(a[pos]>n)break;
for(j=M-1;j>pos;j--)
a[j]=a[j-1];
a[pos]=n;
}
for(i=0;iprintf("\n");
}
功能:
在有序数组中插入一个数,并保持其有序性
输出结果:
134579
7、写出程序的运行结果和函数fun所实现的功能。
#include
#defineN3
#defineM4
voidfun(intx[N][M])
{inti,j,p;
for(i=0;i{p=0;
for(j=1;jif(x[i][p]printf("line%d:
%d\n",i,x[i][p]);
}
}
voidmain()
{inta[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};
fun(a) ;
}
运行结果:
line0:
7
line1:
6
line2:
8
函数fun所实现的功能:
找出二维数组中每行中的最大值
8、写出下面程序的输出结果。
#include
intfun(intn)
{if(n==1)return1;
elsereturnfun(n-1)+n;//该递归函数功能是计算1~n的和
}
voidmain()
{inti,sum=0;
for(i=1;i<=3;i++)
sum=sum+fun(i);
printf("sum=%d\n",sum);
}
输出结果:
sum=10
9、写出下面程序的输出结果。
#include
charstr[]="ABCDEFGH";
voidfun(inti)
{printf("%c",str[i]);
if(i<3)
{i=i+2;fun(i);}
}
voidmain()
{inti=0;
fun(i);
printf("\n");
}
输出结果:
ACE
10、写出程序的运行结果。
#include
intk=1;
voidfun(intx)
{intk;
k=x+1;
printf("k=%d\n",k);
}
voidmain()
{k++;
printf("k=%d\n",k);
fun(k);
printf("k=%d\n",k);
}
运行结果:
k=2
k=3
k=2
11、写出程序的输出结果。
#include
inta=3;
voidmain()
{ints=0;
{inta=5;s+=a++;}
s+=a++;
printf("s=%d,a=%d\n",s,a);
}
输出结果:
s=8,a=4
12、写出程序的输出结果。
#include
voiddec()
{staticintx=5;
x=x-1;
printf("%d",x);
}
voidmain()
{intk;
for(k=0;k<3;k++)
dec();
}
输出结果:
432
13、写出程序的输出结果。
#include"stdio.h"
voidf1()
{staticinti=1;
i++;
printf("%d\n",i);
}
voidmain()
{inti=0;
printf("%d\n",i);
f1();
f1();
printf("%d\n",i);
}
输出结果:
0
2
3
0
15、写出程序的运行结果。
#include
intfun(inta)
{intb=1;
staticintc=2;
b++;c++;
return(a+b+c);
}
voidmain()
{inta=3,x1,x2;
x1=f(a);
x2=f(a);
printf(“x1=%d,x2=%d\n”,x1,x2);
}
运行结果:
x1=8,x2=9
16、写出下面程序的输出结果。
#include
intx=3;
voidfun()
{staticintx=1;
x*=x+1;
printf("x=%d\n",x);
}
voidmain()
{inti;
for(i=1;i{printf("i=%d:
",i);fun();}
}
输出结果:
i=1:
x=2
i=2:
x=6
17、写出程序的运行结果。
#include
intfun(inta)
{staticintf=1;
f=f*a;
return(f);
}
voidmain()
{inti,a=3;
for(i=1;i<=3;i++)
printf(“%d\n”,fun(a));
}
运行结果:
3
9
27
18、写出下面程序的输出结果。
(选做题,难度4颗星)
#include
voidfun(inta[],inti,intj)
{intt;
if(i{t=a[i];a[i]=a[j];a[j]=t;
fun(a,i+1,j-1);
}
}
voidmain()
{inti,a[5]={1,2,3,4,5};
fun(a,0,4);
for(i=0;i<5;i++)
printf("%d,",a[i]);
printf("\n");
}
输出结果:
5,4,3,2,1,
19、写出函数fun1和fun2的功能及程序的运行结果。
(选做题,难度5颗星)
#include
voidfun1(inta[],intp,intr);
intfun2(inta[],intp,intr);
voidmain()
{inti,a[10]={3,6,1,0,9,4,8,5,2,7};
fun1(a,0,9);
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n");
}
voidfun1(inta[],intp,intr)
{if(p{intq=fun2(a,p,r);
fun1(a,p,q-1);
fun2(a,q+1,r);
}
}
intfun2(inta[],intp,intr)
{inti=p,j=r+1,x=a[p],t;
while
(1)
{while(a[++i]while(a[--j]>x);
if(i>=j)break;
t=a[i];a[i]=a[j];a[j]=t;
}
a[p]=a[j];
a[j]=x;
returnj;
}
运行结果:
0123456789
fun1的功能:
将数组按中间值分成两组分别进行排序
fun2的功能:
找出数组中间值的下标
四、程序填空题
1、下面的递归函数是完成1~n的累加,请填写完整。
intfun(intk)
{intsum;
if(k<=0)printf("e