一、单项选择题
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 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个数排序,两两比较,小的放前,大者放后。 交换。 因篇幅问题不能全部显示,请点此查看更多更全内容