搜索
您的当前位置:首页正文

C语言函数题库及答案

来源:抵帆知识网
第六部分 函数

一、单项选择题

1.C语言中的函数返回值的类型是由(D)决定

A.return语句中的表达式

B.调用函数的主调函数

C.调用函数时临时 D.定义函数时所指定的函数类型 2.下面不正确的描述是( B )。

A.调用函数时,实参可以是表达式

B.调用函数时,实参和形参可以共用内存单元 C.调用函数时,将形参分配内存单元 D.调用函数时,实参与形参的类型必须一致

3.在C语言中,调用一个函数时,实参变量和形参变量之间的数据传递是( D ) A.地址传递

B.值传递

D.由用户指定传递方式

C.由实参传递给形参,并由形参传回给实参 4.下面的函数调用语句中含有( A )个实参 int a,b,c;

int sum(int x1,int x2); ……

total=sum((a,b),c);

A.2 B.3 C.4 D.5 5.在C语言中( C )

A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义和调用均不可以嵌套

C.函数的定义不可以嵌套,但是函数的调用可以嵌套 D.函数的定义和调用均可以嵌套

6.关于C语言中的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 x[10],int n) D.int a(float x,int n)

8.在C语言中,函数的数据类型是指( A ) A.函数返回值的数据类型 B. 函数形参的数据类型

C.调用该函数时的实参的数据类型 D. 任意指定的数据类型 9.已知如下定义的函数: fun1(a)

{ printf(\"\\n%d\; }

则该函数的数据类型是( C ) A.与参数a的类型相同 B.void型 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\; B. printf(\"%f\; C. printf(\"%f\; 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;} 第一处:n>1 第二处:n-1· 第三处:n==1

解析:从第2、4行看到了函数名,函数体中又出现了函数的调用,则是递归。我们知道:n!=n*(n-1)! 这就是一个递归的表达式,写成函数就是fun(n)=n*fun(n-1)。因此,4行处填写n-1。又:1!=1 故3,5行就好填了。因此答案是 n>1 n-1 n==1。还有 0!=1 故,还可填写:n>0 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\ 13) s=___3___; 14) for (k=1; k<=n; k++) 15) s=___4___; 16) printf(\"%ld\\n\ 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=%d\\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(\"%f\\n\ }

第一处:0.0 第二处:n 第三处:s

解析:函数f ( double x) 求每个单项的值。 if……else的条件是互斥的。 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 += score[i] ; aver /= (float) m ; for(i = 0 ; i < m ; i++)

if(score[i] < aver) below[j++] = ___1___ ; return j ; } main()

{int i, n, below[9] ;

int score[9] = {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 \ }

第一处:score[i] 第二处:below 第三处:below[i]

解析:求平均值,应先求和。此处,和 与平均值使用了同一个变量。 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;i ___2___; average=___3___; for (i=0;i if(x[i] {

if(i%5==0) printf(\"\\n\"); printf(\"%d, \ } }

第一处:int x[] 第二处:sum+=x[i] 第三处: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(m<10000)之间所有数的和。n和m从键盘输入。 main() {int n,m; long sum; ___1___; clrscr();

printf(\"\\nInput n,m\\n\"); scanf(\"%d,%d\ while( n<=m ) {

___2___; n++; }

printf(\"sum=% ___3___\\n\ }

第一处:sum=0 第二处:sum += n 第三处:ld 解析:求和问题

15.请补全main函数,该函数的功能是:从键盘上输入3个整数,然后找出最大的数并输出。 main() {int a,b,c,max; clrscr();

printf(\"\\nInput three numbers:\\n\"); scanf(\"%d,%d,%d\

printf(\"Thethree numbers are:%d,%d,%d\\n\ if (a>b) ___1___; else ___2___; if(max

___3___;

printf(\"max=%d\\n\ }

第一处:max=a 第二处:max=b 第三处:max=c 解析:

若a>b 则a较大,将其放入max中;否则将b存于max。

此时,max中存放的就是前两个数中较大的,再将max与c比较。

16.函数fun的功能是:从三个形参a,b,c中找出中间的那个数,作为函数值返回。 int fun(int a, int b, int c) {int t;

t = (a>b) ? (b>c? b :(a>c?c:___1___)) : ((a>c)?___2___ : ((b>c)?c:___3___)); return t; } 第一处:a 第二处:a 第三处:b

解析:条件表达式的理解。

17.请补全fun函数,该函数的功能是把从键盘输入的3个整数按从小到大输出。 main() {int x,y,z,t;

clrscr();

printf(\"Input x,y,z\\n\"); scanf(\"%d%d%d\ 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的值*/ 第一处:x>y

第二处:x>z 第三处:y>z 解析:

3个数排序,两两比较,小的放前,大者放后。 交换。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top