C语言函数题库及答案.pdf
C 语言函数题库及答案 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-第六部分 函数 一、单项选择题 1C 语言中的函数返回值的类型是由(D)决定 Areturn 语句中的表达式 B调用函数的主调函数 C调用函数时临时 D定义函数时所指定的函数类型 2.下面不正确的描述是(B )。A调用函数时,实参可以是表达式 B调用函数时,实参和形参可以共用内存单元 C调用函数时,将形参分配内存单元 D调用函数时,实参与形参的类型必须一致 3.在 C 语言中,调用一个函数时,实参变量和形参变量之间的数据传递是(D )A地址传递 B值传递 C由实参传递给形参,并由形参传回给实参 D由用户指定传递方式 4.下面的函数调用语句中含有(A)个实参 int a,b,c;int sum(int x1,int x2);total=sum(a,b),c);A2 B3 C4 D5 5.在 C 语言中(C )A函数的定义可以嵌套,但函数的调用不可以嵌套 B函数的定义和调用均不可以嵌套 C函数的定义不可以嵌套,但是函数的调用可以嵌套 D函数的定义和调用均可以嵌套 6.关于语言中的 return 语句正确的是(C)A只能在主函数中出现 B在每个函数中都必须出现 C可以在一个函数中出现多次 D只能在除主函数之外的函数中出现 7.两个形参中,第一个形参为指针类型、第二个形参为整型,则对函数形参的说明有错误的是(D)A.int a(float x,int n)B.int a(float*x,int n)C.int a(float x10,int n)D.int a(float x,int n)8.在 C 语言中,函数的数据类型是指(A )A.函数返回值的数据类型 B.函数形参的数据类型 C.调用该函数时的实参的数据类型 D.任意指定的数据类型 9.已知如下定义的函数:fun1(a)printf(n%d,a);则该函数的数据类型是(C)A与参数 a 的类型相同 Bvoid 型 C 整型 D 无法确定 10.定义一个函数实现交换 x 和 y 的值,并将结果正确返回。能够实现此功能的是(D )A.swapa(int x,int y)int temp;temp=x;x=y;y=temp;B.swapb(int*x,int*y)int temp;temp=x;x=y;y=temp;C.swapc(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;D.swapd(int*x,int*y)int*temp;temp=x;x=y;y=temp;11.求一个角的正弦函数值的平方。能够实现此功能的函数是(B)A.sqofsina(x)float x;return(sin(x)*sin(x);B.double sqofsinb(x)float x;return(sin(double)x)*sin(double)x);C.double sqofsinc(x)return(sin(x)*sin(x);D.sqofsind(x)float x;return(double(sin(x)*sin(x);12.已知函数定义如下:float fun1(int x,int y)float z;z=(float)x/y;return(z);主调函数中有 int a=1,b=0;可以正确调用此函数的语句是(D )A.printf(%f,fun1(a,b);B.printf(%f,fun1(&a,&b);C.printf(%f,fun1(*a,*b);D.调用时发生错误 13.下面函数的功能是(B)a(s1,s2)char s1,s2;while(s2+=s1+);A.字符串比较 B.字符串复制 C.字符串连接 D.字符串反向 二、填空题 1.在 C 语言中,存储类型为 局部和自动型的变量,只能在使用它们时才占用存储空间。2.在一个源文件中定义的全局变量的作用域为整个源程序。3.下面程序的执行结果是 84 int d=1;fun(int p)int d=5;d+=p+;printf(“%d”,d);main()int a=3;fun(a);d+=a+;printf(“%d”,d);4.该 fun 函数的功能是求 10 的阶乘。1)#include 2)long fun(int n)3)if(_1_)4)return(n*fun(_2_);5)else if(_3_)6)return 1;第一处:n1 第二处:n-1 第三处:n=1 解析:从第 2、4 行看到了函数名,函数体中又出现了函数的调用,则是递归。我们知道:n!=n*(n-1)!这就是一个递归的表达式,写成函数就是 fun(n)=n*fun(n-1)。因此,4 行处填写 n-1。又:1!=1 故 3,5行就好填了。因此答案是 n1 n-1 n=1。还有 0!=1 故,还可填写:n0 n-1 n=0 注意:3 5 行的条件是相反的,这也是 if 与 else 条件的互斥性。5.程序的功能是计算 s=1!+2!+3!+n!1)long fun(int n)2)int i;3)long s;4)s=_1_;5)for(i=1;i=n;i+)6)s=_2_;7)return s;8)9)main()10)long s;11)int k,n;12)scanf(%d,&n);13)s=_3_;14)for(k=1;k=n;k+)15)s=_4_;16)printf(%ldn,s);17)第一处:1 第二处:s*i 第三处:0 第四处:s+fun(k)解析:首先,搞清楚函数 fun、main 各自的功能。Fun 是求一个数的阶乘,我们知道:n!=1*2*3*n 同时要死记住:求积,积的初值一般等于 1。故 fun 中 s 是用来存放积的,其初值等于 1;求阶乘是连乘,故 s=s*i Main 是求和,记住:和的初值一般等于 0.两个函数中的局部变量 s 的作用是不同的。Main 中的 s 是存放和的。最后:注意一些变量的类型。阶乘是求积,积的增长速度是比较快的,为防止溢出,fun 的返回值类型是 long。输出中 ld 是输出长整数。6.请在函数 fun 的横线上填写若干个表达式,使从键盘上输入一个整数 n,输出斐波纳契数列。斐波契数列是一种整数数列,其中每数等于前两数之后,如:0 1 1 2 3 5 8 13 1)int fun(int n)2)if(_1_)3)return 0;4)else if(_2_)5)return 1;6)else 7)return_3_;8)第一处:n=0 第二处:n=1 第三处:fun(n-1)+fun(n-2)解析:求斐波契数列:一项等于其前两项的和。这也是一个递归。求斐波契数列的第 n 项的值,n 从 0 开始。7.请补全函数 fun,该函数的功能是求出以下分数序列的前 n 项之和。和值通过函数值返回到 main 函数。1)#include 2)#include 3)_1_ fun(int n)4)int a,b,c,k;5)double s;6)s=0.0;7)a=2;8)b=1;9)for(k=1;k=n;k+)10)11)s=s+(_2_)a/(_3_)b;12)c=a;13)a=a+b;14)b=c;15)16)return s;17)第一处:double 第二处:double 第三处:double 解析:从第 11-14 总结出数列的表达式。第 1 项是 a/b=2/1;3/2 4/3 故:s=2/1+3/2+4/3+和的初值是 0。记住:两个整数进行算术运算结果也是整数,算术运算中只要有一个操作数是实数,运算结果就是实数。本题希望结果是实数,故要进行强制类型转换,2,3 只要有一个进行强制转换就可以了。最后,函数需要有一个返回值类型,当然也是双精度浮点数了。8.给定程序的功能是计算并输出下列级数的前 N 项之和 SN,直到 SN 大于 q 为止,q 的值通过形参传入。1)double fun(double q)2)int n;3)double s;4)n=2;5)s=2.0;6)while(s _1_ q)7)8)s=s+(double)(n+1)/n;9)_2_;10)11)printf(n=%dn,n);12)_3_;13)第一处:s=q 第二处:n+第三处:return s 解析:从第 8 行,从数学的角度总结出数列的表达式。(n+1)/n n 从 2 开始,每次增加 1,故:SN=2+3/2+4/3+和的初值是 2.0 循环条件是“SN 大于 q 为止”,while 是满足条件才循环,故填写s=q 最后,函数需要有一个返回值。9.给定程序功能是计算 S=f(-n)+f(-n+1)+f(0)+f(1)+f(2)+f(n)的值。float f(double x)if(x=0.0|x=2.0)return _1_;else if(x 0.0)return(x-1)/(x-2);else return(x+1)/(x-2);double fun(int n)int i;double s=0.0,y;for(i=-n;i=_2_;i+)y=f(1.0*i);s+=y;return _3_;main()printf(%fn,fun(5);第一处:0.0 第二处:n 第三处:s 解析:函数 f(double x)求每个单项的值。ifelse 的条件是互斥的。fun()是求和。10.给定程序的功能是计算 score 中 m 个人的平均成绩 aver,将低于aver 的成绩放在 below 中,通过函数名返回人数。int fun(int score,int m,int below)int i,j=0;float aver=0.0;for(i=0;i m;i+)aver+=scorei;aver/=(float)m;for(i=0;i m;i+)if(scorei aver)belowj+=_1_;return j;main()int i,n,below9;int score9=10,20,30,40,50,60,70,80,90;n=fun(score,9,_2_);printf(nBelow the average score are:);for(i=0;i n;i+)printf(%d,_3_);第一处:scorei 第二处:below 第三处:belowi 解析:求平均值,应先求和。此处,和 与平均值使用了同一个变量。Score 是原来的成绩,Below【】存放低于平均分的分数,还有人数。Below 的长度一定不大于 score 的长度。Below 的长度必须通过计数才能得到,且是在比较的过程中得到的。Below 数组的长度用 j 来计数,其初值当然为 0。Fun 函数中:先求总分,平均分;再比较,比平均分低,存于below,j+。J 是后加,不能错了。函数 fun 的返回值赋值给 n,n 就是 below 数组的长度。11.在主函数中从键盘输入若干个数放入数组 x 中,用 0 结束输入但不计入数组。下列给定程序中,函数 fun 功能是:输出数组元素中小于平均值的元素。void fun(_1_,int n)double sum=0.0;double average=0.0;int i=0;for(i=0;iN;I+)_2_;average=_3_;for(i=0;iN;I+)if(xiAVERAGE)if(i%5=0)printf(n);printf(%d,xi);第一处:int x 第二处:sum+=xi 第三处:sum/n 解析:算法思想同上题 12.请补全 fun 函数,该函数的功能是求不超过给定自然数的各个偶数之和。int fun(int x)int i,s;s=_1_;for(_2_)s+=i;return s;第一处:0 第二处:i=2;i 解析:求和,和的初值 s 为 0。最小的非负偶数是 0,偶数间的大小关系是 相差 2。13.请补全 main 函数,该函数的功能是:计算并输出下列多项式的值。S=1+1/(1+2)+1/(1+2+3)+1/(1+2+3+50)#include _1_ fun(int n)int i,j;double sum=0.0,t;for(i=1;i=n;i+)t=0.0;for(j=1;j=i;j+)t+=_2_;sum+=_3_;return sum;第一处:double 第二处:j 第三处:1.0/t 解析:S 中的每一项的分母是 1+2+3+i 需要用一个一重循环实现,把所有商相加,需要用一个循环;组合起来整个就需要二重循环。内循环求每个单项的和,外循环求商的和。每单项的分子是 1,应该用浮点数 1.0;每单项的分母是求和,和的初值为 0.0;函数的返回值是浮点数。14.请补全 main 函数,该函数的功能是,计算两个自然数 n 和m(m10000)之间所有数的和。n 和 m 从键盘输入。main()int n,m;long sum;_1_;clrscr();printf(nInput n,mn);scanf(%d,%d,&n,&m);while(nb)_1_;else _2_;if(maxC)_3_;printf(max=%dn,max);第一处:max=a 第二处:max=b 第三处:max=c 解析:若 ab 则 a 较大,将其放入 max 中;否则将 b 存于 max。此时,max 中存放的就是前两个数中较大的,再将 max 与 c 比较。16.函数 fun 的功能是:从三个形参 a,b,c 中找出中间的那个数,作为函数值返回。int fun(int a,int b,int c)int t;t=(ab)?(bc?b:(ac?c:_1_):(ac)?_2_:(bc)?c:_3_);return t;第一处:a 第二处:a 第三处:b 解析:条件表达式的理解。17.请补全 fun 函数,该函数的功能是把从键盘输入的 3 个整数按从小到大输出。main()int x,y,z,t;clrscr();printf(Input x,y,zn);scanf(%d%d%d,&x,&y,&z);if(_1_)t=x;x=y;y=t;/*交换 x,y 的值*/if(_2_)t=z;z=x;x=t;/*交换 x,z 的值*/if(_3_)t=y;y=z;z=t;/*交换 z,y 的值*/第一处:xy 第二处:xz 第三处:yz 解析:3 个数排序,两两比较,小的放前,大者放后。交换。