第七章函数
一、选择题
1.以下函数声明正确的是: C 。(02~03 第一学期试题)
A)double fun(int x, int y) B) double fun(int x; int y)
C) double fun(int x, int y) ; D) double fun(int x , y)
2.C 语言规定,简单变量作实参,它与对应形参之间的数据传递方式是:
B 。(0 级)
A)地址传递;B)单向值传递;
C)双向值传递;D)由用户指定传递方式
3.以下关于C语言程序中函数的说法正确的是: B 。(0 级)
A)函数的定义可以嵌套,但函数的调用不可以嵌套;
B)函数的定义不可以嵌套,但函数的调用可以嵌套;
C)函数的定义和调用均不可以嵌套;
D)函数的定义和点用都可以嵌套。
4.以下正确的函数形式是: D 。(1 级)
A)double fun(int x,int y) B)fun (int x,y)
{z=x+y;return z;} {int z;return z;} C)fun(x,y)
D)double fun(int x,int y)
{int x,y ; double z; {double z;
z=x+y; return z;} z=x+y; return z;}
5.以下说法不正确的是: B 。(1 级)
C 语言规定A)实参可以是常量、变量或表达式
B)形参可以是常量、变量或表达式
C)实参可以是任意类型
D)形参应与其对应的实参类型一致
6.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 B 。(0 级)
A)float 型B) int 型C)long 型D)double 型
7.以下错误的描述是 D 。(0 级)
函数调用可以
A)出现在执行语句中B)出现在一个表达式中C)
做为一个函数的实参D)做为一个函数的形参
8.若用数组名作为函数调用的实参,传递给形参的是 A 。(0 级)
A)数组的首地址B)数组第一个元素的值
C)数组中全部元素的值D)数组元素的个数
9.以下正确的说法是 A 。(0 级)
如果在一个函数中的复合语句中定义了一个变量,则该变量
A)只在该复合语句中有效B)在该函数中有效C)
在本程序范围内有效D)为非法变量
10.以下不正确的说法为 D 。(0 级)
A)在不同函数中可以使用相同名字的变量
B)形式参数是局部变量
C)在函数内定义的变量只在本函数范围内有效
D)在函数内的复合语句中定义的变量在本函数范围内有效
11.凡是函数中未指定存储类别的局部变量,其隐含的存储类别为 A 。(0 级)
A)自动(auto)B)静态(static)
C)外部(extern)D)寄存器(register)
12.下面程序的正确运行结果是: D 。(1 级)
main( )
{int a=2, i;
for(i=0;i<3;i++) printf(“%4d”,f(a) ); }
f( int a)
{ int b=0; static int c=3;
b++; c++;
return (a+b+c);}
A)777B)71013C)7911D)789
13.C 语言规定:函数返回值类型是由: D 。(0 级)
A)return 语句中的表达式类型决定B)调用该函数时的主调函数类型决定
C)调用该函数时系统临时决定
D)定义该函数时所指定的函数类型
14 决定下面函数调用语句中实参的个数为: B 。(1 级)
func((exp1,exp2),(exp3,exp4,exp5))
A) 1 B) 2 C) 4 D) 5
15返回值的类型int 。(1 级)f(float a){ return a ;}
A)与参数a 的类型相同B) void 类型
C) 没有返回值D) 无法确定
16建立函数的目的之一是: B 。(0 级)
A)提高程序的执行效率B) 提高程序的可读性
C)减少程序的篇幅D) 减少程序文件所占内存
17.正确 C 。(0 级)
A)定义函数时,形参的类型说明可以放在函数体内
B)return 后边的值不能为表达式
C)如果函数值的类型与返回值类型不一致,以函数值类型为准
D)如果形参与实参的类型不一致,以实参类型为准
18.以下正确的说法是 B 。(0 级)
A)用户若需调用标准库函数,调用前必须重新定义
B)用户可以重新定义标准函数,若如此,该函数将失去原有含义
C)系统根本不允许用户重新定义标准库函数
D)用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到
用户源文件中,系统自动去调
19.以下正确的说法是 A 。(0 级)
在C 语言中:A)实参和与其对应的形参各占用独立的存储单元
B)实参和与其对应的形参共占用一个存储单元
C)只有当实参和与其对应的形参同名时才共占用存储单元
D)形参是虚拟的,不占用存储单元
20.若使用一维数组名作函数实参,则以下正确的说法是 A 。(0 级)
A)必须在主调函数中说明此数组的大小
B)实参数组类型与形参数组类型可以不匹配
C)在被调函数中,不需要考虑形参数组的大小
D)实参数组名与形参数组名必须一致
21.有如下函数调用语句
func(rec1,rec2+rec3,(rec4,rec5);
该函数调用语句中,含有的实参个数是 A 。(1 级)
A)3 B) 4 C) 5 D)有语法错
22.有如下程序
int runc(int a,int b)
{ return(a+b);}
main( )
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
printf(“%\d\n”,r);
}
该程序的输出的结果是 D 。(1 级)
A) 12 B) 13 C) 14 D) 15
23.有如下程序
long fib(int n)
{ if(n>2) return(fib(n-1)+fib(n-2));
else return(2);
}
main( )
{ printf(“%d\n”,fib(3));
该程序的输出结果是 B 。(1 级)
A}2 B}4 C}6 D} 8
24.有以下程序
voidf(int x,int y)
{ int t;
if(x } main() { int a=4,b=3,c=5; f(a,b); f(a,c); f(b,c); printf("%d,%d,%d\n",a,b,c); } 执行后输出的结果是 D 。(1 级) A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 4,3,5 25.以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。 #define N 10 void arrin(int x[N]) { int i=0; while(i scanf("%d", ); } 在下划线处应填入的是 C 。(2 级) A) x+i B) &x[i+1] C) x+(i++) D) &x[++i] 26.有以下程序 main() { char s[]="\n123\\"; printf("%d,%d\n",strlen(s),sizeof(s)); } 执行后输出结果是 C 。(1 级) A)赋初值的字符串有错B) 6,7 C) 5,6 D) 6,6 27.以下叙述中正确的是 B 。(0 级) A)全局变量的作用域一定比局部变量的作用域范围大 B)静态(static)类别变量的生存期贯穿于整个程序的运行期间 C)函数的形参都属于全局变量 D)未在定义语句中赋初值的auto 变量和static 变量的初值都是随机值 28.main() {int a=4,b=3,c=5,d,e,f; d=f1(a,b); d=f1(d,c); e=f2(a,b); e=f2(e,c); f=a+b+c-d-e; printf("%d,%d,%d\n",d,f,e); } f1(int x, int y) {int z; z=(x>y)?x:y; return(z); } f2(int x, int y) {int z; z=(x 执行后输出的结果是 C 。(1 级) A) 3,4,5 B) 5,3,4 C) 5,4,3 D)3,5,4 29.以下程序的输出结果是 C 。(1 级) #include int f(void) { static int i = 0; int s =1; s += i; i++; return (s); } void main(void) { int i, a = 0; for (i=0; i<5; i++) a += f() printf(“%d\n”, a); } A) 1 B) 0 C) 非0 的数D) –1 30.以下C 语言中,对函数不正确的描述是 D 。(0 级) A)当用数组名作形参时,形参数组改变可使实参数组随之改变 B)允许函数递归调用 C)函数形参的作用范围只是局限于所定义的函数内 D)函数说明必须在主调函数之前 31.以下所列的各函数首部中,正确的是 C 。(1 级) A) void play(var :Integer,var b:Integer) B) void play(int a,b) C) void play(int a,int b) D) Sub play(a as integer,b as integer) 32.以下叙述中不正确的是 C 。(0 级) A)在C 中,函数中的自动变量可以赋初值,每调用一次,赋一次初值。 B)在C 中,在调用函数时,实参数和对应形参在类型上只需赋值兼容。 C)在C 中,外部变量的隐含类别是自动存储类别。 D)在C 中,函数形参可以说明为register 变量。 33.以下对C 语言函数的有关描述中,正确的是 A 。(0 级) A)在C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B)C 函数既可以嵌套定义又可以递归调用 C)函数必须有返回值,否则不能使用函数 D)C 程序中有调用关系的所有函数必须放在同一个源程序文件中 34.一个数据类型为void 的函数中可以没有return 语句,那么函数的被调用时 D 。(0 级) A)没有返回值B) 返回一个系统默认值 B)返回值由用户临时决定D) 返回一个不确定的值 35.在下面的函数声明中,不存在着语法错误的是 D 。(1 级) A)BC(int a, int);B)BC(int,int); C)DC(int,int=5);D)BC(int x, int y); 36.以下函数值的类型是 A 。(1 级) fun ( float x ) { float y; y= 3*x-4; return y; } A)int B)不确定C)void D)float 37.有如下程序段,在Turbo C 环境下运行的结果为 B 。(01~02 第二学期试题) main( ) { int i=2,p,k=1; int f(int a,int b) p=f(i,++k); { int c; printf(“I=%d,p=%d”,k,p);if(a>b) c=1; } else if (a==b) c=0; else c=-1; return(c); } A)1,0 B)2,0 C)2,-1 D)1,1 38.下面程序的输出结果是: B 。(往届试题) int m=13; int fun( int x, int y) { int m=3; return( x*y-m); } main( ) {int a=7,b=5; printf(“%d\n”, fun(a,b)/m); } A)1 B)2 C)7 D)10 39.若有说明语句:static int a[3][4]={0}; 则下面叙述正确的是: B 。(往届试题) A)只有a[0][0]元素可得到初值0; B)数组a 中每个元素均可得到初值0。 C)数组a 中各元素都可得到初值,但值不一定为0; D)此说明语句不正确 40.以下程序的运行结果是: B 。(往届试题) main( ) { int a=2, i ; for(i=0;i<3;i++) printf(“%4d”,f(a) ) ; } f( int a) { int b=0,c=3; b++; c++; return(a+b+c); } A)7 10 13 B)7 7 7 C)7 9 11 D)7 8 9 二、填空题 1.C 语言规定,可执行程序的开始执行点是 main 。(0 级) 2.在C 语言中,一个函数一般由两个部分组成,它们是函数首部和函数体。(0级) 3.函数swap(int x,int y)可完成对x 和y 值的交换。a[0]=1,a[1]=2 在运行调用函数中的如下语句后,a[0]和a[1] 的值分别为a[0]=1,a[1]=2 ,原因单向值传递,不能返回交换后的值。(1 级) 4.函数swap(arr,n)可完成对arr 数组从第1 个元素到第n 个元素两两交换。在运行调 用函数中的如下语句后,a[0] 和a[1]的值分别为 a[0]=2,a[1]=1 ,原因实参是地址, 已对指定地址中的内容进行了交换。(1 级) 5.设在主函数中有以下定义和函数调用语句,且f un 函数为void 类型;请写出fun 函 数的首部fun (double b[][]) 。要求形参名为b。(1 级) main() { double s[10][22]; int n; ┆ ┆ fun(s); ┆ } 6.返回语句的功能是从包含它的函数返回调用函数。(0 级) 三、程序填空题 1. (1)d=a*b/c (2)num1 (3)x%y 2. (1)break (2)getchar( ) 3. (1)(int)((value﹡10+5)/10) 4.(1)2﹡i+1 (2)a(i) (3)a(i) 5.(1)j (2)str[j-1] 6. (1)n*fac(n-1) (2)fac(n) 7.(1)i<10 (2)array[i] (3)average(score) 1.下面程序的功能是利用函数调用求两整数的最大公约数和最小公倍数,请填空。(1 级) main( ) { int a, b ,c,d; scanf(“%d, %d”, &a, &b ) ; c = gongyue( a, b ) ; (1); printf(“gongyue=%d,gongbei=%d\n”, c,d ) ; } gongyue( int num1, int num2 ) { int temp, x, y ; if ( (2)) { temp=num1; num1=num2 ; num2=temp ; } x=num1 ; y=num2 ; while( (3)) { temp=x%y ; x=y ; y = temp ; } return (y) ; } # include { switch(ch) {case ‘y’:case ‘Y’: printf(“\nThis is YES.\n”);(1); case ‘n’:case ‘N’: printf(“\nThis is NO.\n”); } } main( ) {char ch; printf(“\nEnter a char ‘y’,’Y’or’n’,’N’:”); ch= (2); printf (”ch:%c”,ch);YesNo(ch); } 3.以下Check 函数的功能是对value 中的值进行四舍五入计算,若计算后的值与ponse 值相等,则显示“ WELL DONE!!”,否则显示计算后的值。已有函数调用语句Check(ponse,value);请填空。(1 级) viod Check ( int ponse, float value) { int val; val= (1); printf (“计算后的值: %d”, val); if (val= =ponse) printf(“\n WELL DONE!! \n”); else printf (“\nSorry the correct answer is %d\n”, val); } 4.以下程序的运行结果是输出如下图形。请填空。(1 级) * * * * * * * * * * * * * * * * * * * * * * * * * * # include void a (int i) { int j, k; for (j=0; j<=7-i; j++) printf (““); for (k=0; k< (1); k++) printf(“﹡”); printf(“\n”);} main ( ) { int i; for( i=0; i<3; i++) (2); for( i=3; i>=0; i--) (3); } 5.函数fun 的功能是:使字符串str 按逆序存放。(2 级) void fun (char str[]) { char m; int i, j; for (i=0, j=strlen(str); i< (1); i++, j--) { m = str[i]; str[i] = (2); str[j-1] = m; } printf("%s\n",str); } 6.以下程序使用递归法求n!, 请填空。(03 试题) float fac(int n) { float f; if(n<0) {printf(“n<0” data error); f=-1;} else if(n==0||n==1) f=1; else f= (1); return( f ); } main( ) { int n; float y; printf(“input a integer number”); scanf(“%d”,&n); y= (2); printf(“%d!= %15.0f”, n, y ); } 7.以下程序可计算10 名学生1 门功课成绩的平均分,请填空。(往届试题) float average( float array[10] ) { int i; float aver, sum=array[0]; for ( i=1; (1);i++) sum+= (2); aver=sum/10; return(aver); } main( ) { float score[10], aver ; int i ; printf(“\ninput 10 scores:”); for(i=0; i<10;i++) scanf(“%f”,&score[i] ); aver = (3); printf(“\naverage score is %5.2f\n”, aver); } 四、读程序写结果题 1. 15 2. i=7;j=6;x=7 3. 111 4. A+B=9 5. 123 6. 246 7. 1:a=1,b=1 2:a=1,b=2 3:a=1,b=3 8. x=9 x=10 9. 9 10. input a integer number:5 5!=120 11. 21 12. 777 13. 15 14. 0 15.sum=6 1.下面程序的运行结果是:。(1 级)main( ) { int i=5; printf(“%d\n”, sub(i) ) ; } sub { ( int n ) int a ; if ( n==1) a=1; else a=n+sub(n-1); return( a ) ; } 2.下面程序的运行结果是:。(1 级)main( ) { int i=2, x=5, j=7; fun (j,6); printf(“i=%d; j=%d; x=%d\n”, i, j, x ) ; } printf(“i=%d; j=%d; x=%d\n”, i, j, x) ; 。(1 级) main( ) { increment ( ); increment ( ); increment ( ); } increment ( ) { int x=0; x+=1; printf (“%d”, x); }4.以下程序的运行结果是。(1 级) int a=5; int b=7; main( ) { int a=4, b=5,c; c=plus (a,b); printf(“A+B=%d\n”,c) ; } plus (int x, int y) { int z; z=x+y; return (z); } 。(1 级) main( ) { increment ( ); increment ( ); increment ( ); } increment ( ) {static int x=0; x+=1; printf (“%d”, x); } 6.以下程序的输出结果是。(2 级) void fun() { static int a=0; a+=2; printf(“%d”,a); } main() { int cc; for(cc=1;cc<4;cc++) fun() printf(“\n”); } 7.以下程序的输出结果是。(2 级) #include void f(int c) { int a=0; static int b=0; a++; b++; printf("%d: a=%d, b=%d\n", c, a, b); } void main(void) { int i; for (i=1; i<=3; i++) f( i ); } 8.以下程序的输出结果是。(2 级) #include void increment(void); void main(void) { increment(); increment(); } void increment(void) { static int x = 8; x ++; printf("x = %d\n", x); } 9.若有以下程序,执行后输出结果是。(2 级) 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("%d\n",d); } 10.假如在运行程序时输入5 ,写出程序的运行情况及最终结果: 。(01~02第二学期试题) float fac(int n) { float f ; if(n<0){printf(“n<0,dataerror!”); f=-1;} else if (n==0||n==1) f=1; else f=fac(n-1)*n; return(f); } main( ) {int n ; float y ; printf(“input a integer number:”); scanf(“%d”,&n); y=fac(n); printf(“%d!=%5.0f”, n,y); } 11.下面程序的运行结果是:。(03 试题) func( int x, int y) { int z; z=x+y; return(z); } main( ) { int a=6, b=7, c=8, r; r=func( ( a--, b++, a+b), c--); printf(“%d”, r) ; } 12.下面程序的运行结果是:。(04~05 第二学期试题) func( int a) { int b=0,c=3; b++;c++; return(a+b+c);} main( ) { int a=2,i; for(i=0;i<3;i++) printf(“%d”,func(a));} 13.下面程序的运行结果是:。(往届试题) main( ) { int i=5 ; printf(“%d\n”, sub(i) ); } sub( int n) { int a; if(n==1) a=1; else a= n+sub(n-1); return(a); } 14.下面程序的运行结果是:。(往届试题)main( ) { int i=2,p; p=f( i++, ++i ); printf(“%d”, p); } int f( int a, int b ) { int c; if(a>b) c=1; else if(a==b) c=0; else c=-1; return(c); } 15.以下程序的运行结果是:。(往届试题) main( ) { int a[3][3] = { 1, 3, 5, 7, 9, 11, 13, 15, 17 } ; int sum ; sum = func ( a ) ; printf ( “\nsum = %d\n”, sum ) ; } func ( int a[ ][3] ) { int i, j, sum = 0; for ( i=0; i<3; i++ ) for ( j=0; j<3; j++ ) { a[i][j] = i + j ; if ( i==j ) sum = sum + a[i][j] ; } return ( sum ); }