admin 管理员组文章数量: 1086019
2024年4月22日发(作者:手机可以学编程么)
第5章 函数
5.1典型考试题剖析
5.1.1选择题
【例1】下列程序执行后的结果是_______。
#include
f(int a)
{
int b=0;
static c=3;
a=c++,b++;
return(a);
}
main()
{
int a=2,i,k;
for(i=0;i<2;i++)
k=f(a++);
printf("%dn",k);
}
A) 3 B) 0 C) 5 D) 4
考点:变量的作用域。
分析:此题函数f中的变量c是一个静态变量。第一次调用函数时,使
用的参数是a,值为2,进入子函数f内,变量b=0,c=3,然后语句
“a=c++,b++;”是一个逗号表达式,不是赋值表达式,a被赋的值是c
的值,不同逗号表达式的值,所以a=3,此时c的值同时变为4;第二次
调用函数,使用的参数是a,值为3,进入子函数内,变量b=0,c=4(这
是静态变量的特性)。
答案:D
【例2】下面程序的输出是_______。
int w=3;
fun(int k);
main()
{
int w=10;
printf("%dn",fun(5)*w);
}
fun(int k)
{ if (k==0)
return(w);
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
考点:函数的递归调用和全局变量。
分析:此题涉及到了函数的递归调用和全局变量的用法,最容易出错的
地方是变量w,程序首先定义了全局变量w,并赋了初值为3,然后在主
函数中又定义了一个局部变量w,并赋初值为10,在子函数中引用了变
量w,一定要认清这个变量是全局变量w的值而不是主函数中局部变量w
的值。
答案:B
【例3】有以下程序
#include
int abc(int u,int v);
main()
{
int a=24,b=16,c;
c=abc(a,b);
printf("%dn",c);
}
int abc(int u,int v)
{
int w;
while(v)
{ w=u%v;
u=v;
v=w;
}
return(u);
}
输出结果为 。
A) 6 B) 7 C) 8 D) 9
考点:函数的返回值。
分析:进入子函数后,循环共执行了三次:第一次结束后w=8,u=16,v=8;
第二次结束后w=8,u=8,v=8;第三次结束后w=0,u=8,v=0。
答案:C
【例4】以下程序运行后,输出结果是_______。
int d=1;
fun(int p)
{ int d=5;
d+=p++;
printf("%d" ,d);
}
main()
{
int a=3;
fun(a);
d+=a++;
printf("%dn" ,d);
}
A) 8 4 B) 9 9 C) 9 5 D) 4 4
考点:全局变量与局部变量。
分析:此题应注意全局变量d和函数fun中定义的局部变量d的作用范
围,在子函数fun中全局变量d不起作用。
答案:A
【例5】以下程序的输出结果是_______。
int d=1;
fun(int p)
{ static int d=5;
d+=p;
printf("%d" ,d);
return(d);
}
main()
{
int a=3;
printf("%dn" ,fun(a+fun(d)));
}
A) 699 B) 669 C) 61515 D) 6615
考点:函数的调用。
分析:先求fun(d)的值,调用参数为全局变量d,其值为1,进入子函
数,参数d的值传给形参p,p的值为1,由于是第一次进入子函数,故
静态变量d的值即为初始化的值5,执行语句“d+=p;”,得到d=6,输
出第一个数值6,退出fun(d)的调用,返回函数值6到主函数中。再求
fun(a+fun(d))的值,调用参数为“a+fun(d)”,其值为9,进入子函数,
由于不是第一次进入子函数,故静态变量d的值是上一次调用后的结果,
为6,执行语句“d+=p;”,得到d=15,输出数值15,退出fun(d)的调
用,返回函数值15到主函数中。执行主函数中的输出语句,输出函数调
用fun(a+fun(d))的结果为15。
答案:C
【例6】有如下函数调用语句:
func(rec1,rec2+rec3,(rec4,rec5));
该函数调用语句中,含有的实参个数是_______。
A) 3 B) 4 C) 5 D) 有语法错
考点:实参。
分析:函数中有三个参数,分别是:一个变量rec1,一个算术运算表
达式rec2+rec3,一个逗号表达式(rec4,rec5)。
答案:A
【例7】以下程序的输出结果是_______。
int a,b;
void fun()
{
a=100;
b=200;
}
main()
{
int a=5,b=7;
fun();
printf("%d%dn" ,a,b);
}
A) 100200 B) 57 C) 200100 D) 75
考点:全局变量与局部变量。
分析:在主函数中全局变量a和b被同名的局部变量所覆盖,所以主函
数中引用 的a和b是局部变量。
答案:B
【例8】以下程序的输出结果是_______ 。
int f()
{ static int i=0;
int s=1;
s+=i;
i++;
return s;
}
main()
{
int i,a=0;
for (i=0;i<5;i++)
a+=f();
printf("%dn",a);
}
A) 20 B) 24 C) 25 D) 15
考点:无参函数的调用。
分析:这是一个无参函数的调用,在函数f中i是一个静态变量,而s
是一个局部变量,s的初值永远是1,而i的值第一次调用时是0,执行
了i++之后,第二次调用时就是1,直到4。
答案:D
【例9】以下程序的输出结果是_______。
f(int b[],int m,int n)
{ int i,s=0;
for (i=m;i s=s+b[i]; return(s); } main() { int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf("%dn",x); } A) 10 B) 18 C) 8 D) 15 考点:数组的调用。 分析:已知一维数组有9个值,用子函数求得从下标3开始到下标6的 这4个数中下标为3,5这几个数之和。 答案:A 【例10】有以下程序 int f(int n) { if (n==1) return(1); else return(f(n-1)+1); } main() { int i,j=0; for (i=1;i<3;i++) j+=f(i); printf("%dn",j); } 程序运行后的输出结果是______。 A) 4 B) 3 C) 2 D) 1 考点:递归调用。 分析:此题是一个递归调用的题目,在子函数中当n!=1时,递归调用 当前函数 f(n-1)。 答案:B 【例11】有以下程序 void f(int x ,int y) { int t; if (x { t=x; x=y; y=t; } } main() { int a=4,b=3,c=5; f(a,b); f(a,c); f(b,c); printf("%d,%d,%dn",a,b,c); } 执行后输出的结果是_______ 。 A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 4,3,5 考点:函数的返回值。 分析:此题想通过两两比较,求a,b,c三者之间从大到小的顺序,但是 由于子函数没有返回值,所以子函数的结果不影响主函数,主函数中 a,b,c的值依旧还是初始值4,3,5。 答案:D 【例12】下列函数定义中,会出现编译错误的是_______ A) max(int x, int y, int *z) B) int max(int x,y) {*z=x>y?x:y;} { int z; z=x>y?x:y; return z; } C) max(int x, int y) D) int max(int x, int y) { int z; { return(x>y?x:y);} z=x>y?x:y; return(z); } 考点:子函数的格式。 分析:此题考的是子函数的格式,在子函数参数表中,要求每个变量都 必须定义一个类型,而B中x,y一起定义为int ,应该写成int x,int y。 答案:B 5.1.2填空题 【例1】下面的程序通过函数average计算数组中各元素的平均值,请填空。 float average(int pa[],int n) { int i; float avg=0.0; for (i=0;i avg=avg+ 【1】 ; avg= 【2】 ; return(avg); } main() { int i,a[5]={2,4,6,8,10}; float mean; mean=average(a,5); printf("mean=%fn",mean); } 考点:函数参数(数组)的调用。 分析:程序的功能是求5个数的平均值。子函数的功能是求平均数,pa 是传递过来的数组,n指明了求平均值的数据的个数。第一个空位于循 环内,是求和的语句,第二个空是求平均值。 答案:【1】pa[i] 【2】avg/n 【例2】若函数fun的类型为void,且有以下定义和调用语句: #define M 50 main() { int a[M]; fun(a); } 定义fun函数的首部可以用三种不同的形式,请写出这三种形式: 【1】 、 【2】 、 【3】 。(注意,1) 形参的名字请用q,2)使用同一种 风格)。 考点:函数和原型。 分析:此题考的是函数的原型。 答案:【1】void fun(int q[]) 【2】void fun(int q[M]) 【3】 void fun(int *q) 【例3】以下程序的输出结果为___ ____。 #include int fun(int x,int y) { static int m=0,i=2; i+=m+1; m=i+x+y; return m; } main() { int j=4,m=1,k; k=fun(j,m); printf("%d",k); k=fun(j,m); printf("%dn",k); } 考点:静态局部变量。 分析:注意子函数中的变量m和I是静态局部变量,故第二次调用子函 数时,m和I的值分别是8和3,而不是0和2。 答案:8 17 【例4】以下程序输出的最后一个值是______。 int ff(int n) { static int f=1; f=f*n; return f; } main() { int i; for (i=1;i<=5;i++) printf("%dn",ff(i)) } 考点:静态变量。 分析:这是一个简单的变量传递的函数,在子函数中f是一个静态变量, 前一次的结果会影响下一次的初值,这个题目分别会输出1!,2!,3!, 4!,5!的值。 答案:120 【例5】若变量n中的值为24,则prnt函数共输出 【1】 行,最后 一行有 【2】 个数。 void prnt(int n,int aa[]) { int i; for(i=1;i<=n;i++) { printf("%6d",aa[i]); if (!(i%5)) printf("n"); } printf("n"); } 考点:函数功能。 分析:根据要求一共有24个数要输出,语句“if !(i%5)”说明个数满 了5个以后,就执行语句“printf("n");”进行换行,所以一行只输出 5个值。 答案:【1】5 【2】4 【例6】若已定义:int a[10],i;以下fun函数的功能是:在第一个循环中 给前10个数组元素依次赋1,2,3,4,5,6,7,8,9,10;在第二个循环中使a数组前 10个元素中的值对称折叠,变成1,2,3,4,5,5,4,3,2,1。请填空。 fun (int a[]) { int i; for (i=1;i<=10;i++) 【1】 =i; for (i=0;i<5;i++) 【2】 =a[i]; } 考点:简单函数的功能。 分析:此题的第一个循环就是将1-10分别赋给数组a[0]-a[9],第二 个循环使数组a中的前五个元素不变,后五个元素是前五个元素的逆序。 答案:【1】a[i-1] 【2】a[9-i] 【例7】有以下程序 float fun(int x,int y) { return(x+y); } main() { int a=2,b=5,c=8; printf("%3.0fn",fun((int)fun(a+c,b),a-c)); } 程序运行后的输出结果是______。 考点:函数的调用。 分析:先通过子函数求出fun(a+c,b)的值,然后强行取整,之后再求 fun((int)fun(a+c,b),a-c)的值。 答案:9 【例8】若有以下程序 int f(int x,int y) { return(y-x)*x; } main() { int a=3,b=4,c=5,d; d=f(f(3,4),f(3,5)); printf("%dn",d); } 执行后输出结果是__ ___。 考点:函数的调用。 分析:先求f(3,4)的值和f(3,5)的值,再求f(f(3,4),f(3,5))的值。 答案:9 【例9】函数YangHui的功能是把杨辉三角形的数据赋给二维数组的下半三 角,形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 其构成规律是: (1)第0列元素和主对角线元素均为1 (2)其余元素为其左上方和正上方元素之和 (3)数据的个数每行递增1 请将程序补充完整。 #define N 6 void yanghui(int x[N][N]) { int i,j; x[0][0]=1; for(i=1;i { x[i][0]= 【1】 =1; for(j=1;j x[i][j]= 【2】 ; } } 考点:函数的参数(二维数组)传递。 分析:要使0列元素为1,每一行i上第0列表示为x[i][0],要使主 对角线元素也为1,每一行i上的主对角线上的元素表示为x[i][i],根 据要求其余元素为其左上方和正上方元素之和,除了为1的元素之外, 其它每一个元素x[i][j]均为x[i-1][j-1]和x[i-1][j]之和。 答案:【1】x[i][i] 【2】x[i-1][j-1]+x[i-1][j] 【例10】以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输 出结果。请填空。 int fun( int n) { int m=0,f=1,i; for(i=1; i<=n; i++) { m+=i*f; f= 【1】 ; } return m; } main() { printf("m=%dn", 【2】 ); } 考点:简单的参数调用。 分析:此题由子函数求要求的内容,主函数只负责输出。在子函数中用 i×f来代表每一个要求的数,用m来累计它们的和,i的值从1变化到 10,由f为控制这10个数的符号。 答案:【1】-f 【2】m 5.2自测练习与参考答案
版权声明:本文标题:C语言各章节单元测试题及答案——函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1713772122a650815.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论