1、国家二级 C语言机试(函数)模拟试卷 2及答案与解析 一、选择题 1 若各选项中所用变量已正确定义,函数 fun中通过 return语句返回一个函数值,以下选项中错误的程序是( )。 ( A) main() x=fun(2,10); float fun(int a,int b) ( B) float fun(int a,int b) main() x=fun(i,j); ( C) float fun(int ,int); main() x=fun(2,1 0); float fun(int a,int b) ( D) main() float fun(int i,int j); x=fun(i
2、,j); float fun(int a,int b) 2 有以下程序 #include void fun(int *a, int n) /* fun函数的功能是将 a所指数组元素从大到小排序 */ int t, i, j; for (i=0; i char f(char x) return x*x+a; main() char a, b=0; for ( a=0; a #define N 4 void fun(int aN, int b, int flag) int i,j; for(i=0; i aij) : (bi void fun(int a , int n) int t,i,j; f
3、or (i=1; i aj) t=ai; ai=aj;aj=t; main() int c10=10,9,8,7,6,5,4,3,2,1,i; fun(c, 10); for (i=0;i char f(char x) return x*x%10 + 0; main() char a; int b=0; for ( a=0; a #define N 4 void fun( int aN, int b, int flag ) int i,j; for( i=0; i aji) : (bi void fun(int a , int n) int t, i, j; for ( i=0; i aj )
4、 t=ai; ai=aj; aj=t; main() int c10=10,9,8,7,6,5,4,3,2,1,i; fun(c, 10); for ( i=0; i int fun( int a, int b) return a+b; main() int x=6, y=7, z=8, r ; r = fun ( fun(x,y), z- ); printf (“ %dn“ , r ); 程序运行后的输出结果是( )。 ( A) 21 ( B) 15 ( C) 20 ( D) 31 10 以下选项中函数形参不是指针的是( )。 ( A) fun( int int funb( int a, i
5、nt b) return a-b; int sss( int (*t)(), int x, int y ) return( (*t)(x,y) ); main() int x; x=sss( funa, 9,3 ); x+=sss(funb,8,3 ); printf(“%dn“, x ); 程序运行后的输出结果是( )。 ( A) 17 ( B) 23 ( C) 24 ( D) 22 12 有以下程序 #include void fun( int a, int b, int c ) a=b; b=c; c=a; main() int a=10 , b=20, c=30; fun( a, b,
6、 c ); printf(“%d,%d,%dn“,c,b,a); 程序 运行后的输出结果是( )。 ( A) 30,20,10 ( B) 10,20,30 ( C) 20,30,10 ( D) 0,0,0 13 有以下程序 #include #define N 4 void fun(int aN) int bNN,i,j; for(i=0; i void fun(int a , int n) int i,j=0,k=n/2, b10; for (i=n/2-1; i=0; i-) bi =aj; bk =aj+1; j+=2; k+; for (i=0; i main() int a10, i
7、=0; while( i int sum(int a, int b) return a + b - 2; main() int i; for (i=0; i int sub(double a, double b) return (int)(a - b); main() printf(“%dn“, sub(3.8, 2.1); 程序运行后的输出结果是( )。 ( A) 1 ( B) 1.7 ( C) 2 ( D) 2.0 19 以下关于函数的叙述中正确的是( )。 ( A)函数形参的类型与返回值的类型无关 ( B)函数必须要有形参 ( C)函数必须要有返回值 ( D)函数调用必须传递实参 20
8、设有函数定义: void sub(int k,char ch) 则以下对函数 sub的调用语句中,正确的是( )。 ( A) sub(1,97); ( B) sub(2,97); ( C) n=sub(3,a); ( D) sub(4,“a“); 21 有以下程序 #include fun(int x, int y) static int m=0, i=2; i+=m+1; m=i+x+y; return m; main() int j=1, m=1, k; k=fun(j,m); printf(“%d,“,k); k=fun(j,m); printf(“%dn“,k); 执行后的输出结果是(
9、 )。 ( A) 5, 11 ( B) 5, 5 ( C) 11, 11 ( D) 11, 5 22 在 C语言中,只有在使用时才占用内存单元的变量,其存储类型是( )。 ( A) auto和 register ( B) extern和 register ( C) auto和 static ( D) static和 register 23 有以下程序 #include int fun() static int x=1; x*=2; return x; main() int i, s=1; for( i=1; i int fun( int k ) if (k int f(int n); main
10、() int a=3,s; s=f(a);s=s+f(a); printf(“%dn“,s); int f(int n) static int a=1; n+=a+; return n; 程序运行后的输出结果是( )。 ( A) 9 ( B) 8 ( C) 7 ( D) 10 27 有以下程序 #include void fun2(char a, char b) printf(“%c %c “,a,b); char a=A, b=B; void fun1() a=C; b=D; main() fun1( ); printf(“%c %c “,a,b); fun2(E, F); 程序的运行结果是
11、( )。 ( A) C D E F ( B) A B E F ( C) A B C D ( D) C D A B 28 有以下程序 #include int f(int x) int y; if (x = 0 | x= 1) return (3); y = x*x - f(x-2); return y; main() int z; z = f(3); printf(“%dn“, z); 程序的运行结果是( )。 ( A) 6 ( B) 9 ( C) 0 ( D) 8 29 有以下程序 #include int f ( int m ) static int n=0; n+=m; return n
12、; main() int n=0; printf ( “%d,“, f(+n) ); printf ( “%dn“, f(n+) ); 程序运行后的输出结果是( )。 ( A) 1,2 ( B) 1,1 ( C) 2,3 ( D) 3,3 30 有以下程序 #include int fun(int a, int b) if(b=0) return a; else return(fun(-a,-b); main() printf(“%dn“, fun(4,2); 程序的运行结 果是( )。 ( A) 2 ( B) 1 ( C) 3 ( D) 4 31 以下选项中叙述错误的是( )。 ( A) C
13、程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值 ( B)在 C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内 ( C) C程序函数中定义的自动变量,系统不自动赋确定的初值 ( D) C程序函数的形参不可以说明为 static型变量 32 有以下程序 #include int fun(int x) int p; if(x=0|x=1) return(3); p=x-fun(x-2); return p; main() printf(“%dn“,fun(7); 执行后的输出结果是( )。 ( A) 2 ( B) 3 ( C) 7 ( D) 0 33 有以下程序
14、 #include int fun() static int x=1; x*=2; return x; main() int i,s=1; for(i=1;i int a=4; int f(int n) int t = 0; static int a=5; if (n%2) int a=6; t += a+; else int a=7; t += a+; return t + a+; main() int s=a, i=0; for (; i2;i+) s += f(i); printf(“%dn“, s); 程序运行后的输出结果是( )。 ( A) 28 ( B) 24 ( C) 32 (
15、D) 36 国家二级 C语言机试(函数)模拟试卷 2答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 被调函数的定义要在调用语句之前,若不是,则在调用语句之前要对被调函数进行声明,选项 A)缺少对被调函数 fun()的声明语句,答案选 A)。 【知识模块】 函数 2 【正确答案】 A 【试题解析】 考查数组名作为函数参数。数组名作为函数参数属于地址传参,形参和实参为同一数组 ,变化同步。数组名可以看做一个指针常量,对其进行自加自减运算相当于指针变量的自加自减,所以传递给函数 fun()的参数是数组第五个元素的地址,调用函数 fun()结束后,数组后 6位数字按照从大到小排列,答案选A
16、。 【知识模块】 函数 3 【正确答案】 A 【试题解析】 函数 f()返回的是 “x*x+?a?“对应的字符,分别是 “0*0+?a?“、“1*1+?a?“、 “2*2+?a?“、 “3*3+?a?“,而 “1+?a?= ?b?“,所以答案选 A。 【知识模块】 函数 4 【正确答案】 A 【试题解析】 考查数组名作为函数参数。函数 fun()的作用是如果 flag为 1则用bi记录 ai0至 ai3(即当前行)中最小的值,若 flag为 0,则用 bi记录ai0至 ai3(即当前行)中最大的值。所以答案选 A。 【知识模块】 函数 5 【正确答案】 A 【试题解析】 考查一维数组名作为函数
17、参数。函数 fun()的作用是将数组下标为奇数的元素按照从小到大的次序排序,所以答案选 A。 【知识模块】 函数 6 【正确答案】 A 【试题解析】 函 数 f()返回的是 “x*x%10 + ?0?“对应的字符,分别是“0*0%10+?0?“、 “1*1%10+?0?“、 “2*2%10+?0?“、 “3*3%10+?0?“、“4*4%10+?0?“,而 “1+?0?=?1?“, “4+?0?=?4?“, “9+?0?=?9?“, “6+?0?=?6?“。 【知识模块】 函数 7 【正确答案】 A 【试题解析】 考查数组名作为函数参数。函数 fun()的作用是如果 flag为 1则用bi记录
18、 a0i至 a3i(当前列)中最小的值,若 flag为 0,则 用 bi记录 a0i至 a3i(当前列)中最大的值。所以答案选 A。 【知识模块】 函数 8 【正确答案】 A 【试题解析】 考查一维数组名作为函数参数。函数 fun()的作用是将数组下标为偶数的元素按照从小到大的次序排序,所以答案选 A。 【知识模块】 函数 9 【正确答案】 A 【试题解析】 考查函数的递归调用,函数 fun()返回的是 a和 b之和,所以调用的次序是 fun(6,7)=13, fun(13,z-),自减运算符后置是先使用该变量参与其他运算再自减,所以为 fun(13,8)=21。答案选 A。 【知识模块】 函
19、数 10 【正确答案】 A 【试题解析】 数组名作为函数参数时, a10、 a、 *a做形参都是接受实参数组首地址,效果一样,而形参形式为 “执行结束后, x=12。语句 “x+=sss(funb,8,3);“执行结束后, x=12+5=17,答案选 A。 【知识模块】 函数 12 【正确答案】 A 【试题解析】 值传参过程中形参不会对实参造成影响,所以函数调用结束后 a、b、 c的值没有变化。答案选 A。 【知识模块】 函数 13 【正确答案】 A 【试题解析】 函数 fun()的功能就是经由数组 b,将二维数组 a中的元素的行和列的逆序互换,调用两次 fun()的结果是16,15,14,1
20、3,12,11,10,9,8,7,6,5,4,3,2,1,输出时输出对角线 元素,答案选A。 【知识模块】 函数 14 【正确答案】 A 【试题解析】 函数 fun()的功能是经由数组 b,将数组 a中下标为偶数的元素逆序放在数组 a的前半部分,将数组 a中下标为奇数的元素顺序放在数组 a的后半部分,答案选 A。 【知识模块】 函数 15 【正确答案】 A 【试题解析】 函数调用的参数之间用逗号分隔,表达式 “exp1, exp2“和 “exp1, exp2, exp3“为逗号表达式,各为一个参数,总共参数个数为 2,答案选 A。 【知识模块】 函数 16 【正 确答案】 A 【试题解析】 选
21、项 B)、 C)会造成死循环,选项 D)的写法有误。数组名是一个地址常量, a+i表示数组 a中第 i个元素的地址,选项 A)的使用正确,答案选A)。 【知识模块】 函数 17 【正确答案】 A 【试题解析】 函数 fun()的作用是返回 a+b-2的值,所以循环依次输出sum(0,3)、 sum(1,3)、 sum(2,3)、 sum(3,3)、 sum(4,3),输出结果为选项 A)。 【知识模块】 函数 18 【正确答案】 A 【试题解析】 函数 sub()返回的 是 a与 b差的取整值,所以 sub(3.8,2.1)的计算结果为 (int)1.7=1,答案选 A。 【知识模块】 函数
22、19 【正确答案】 A 【试题解析】 函数分为有参函数和无参函数,所以一个函数定义时可以有形参也可以没有形参,调用函数时必须和被调函数的参数列表保持一致,所以选项B)、 D)错误;函数调用时可以没有返回值,此时函数的类型用 void标识,选项C)错误;选项 A)描述正确,答案选 A)。 【知识模块】 函数 20 【正确答案】 A 【试题解析】 字符常量与其 ASCII码值一 一对应,在计算的时候,可以用字符数据对应的 ASCII码代表该字符参与运算,另外,该函数的函数类型为 void,没有返回值,所以答案选 A。 【知识模块】 函数 21 【正确答案】 A 【试题解析】 静态变量在编译时就被分
23、配存储空间,所占用存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在,且变量的初始化只进行一次。所以第一次调用函数 fun()时,得 m=5,输出结果为 5;第二次调用函数 fun()初始, m和 i的值不再初始化,保留第一次调用的计算结果 5和 3,计算后 m=11,所以答案选 A。 【知识模块】 函数 22 【正确答案】 A 【试题解析】 全局变量( extern)和用 static修饰的局部变量都是静态变量,该变量是在编译时给变量分配存储空间,所占用存储单元直到程序结束时才释放。而自动变量( auto)和寄存器变量( register)为动态局部变量,只在程序执行到定义它的函数
24、或者语句块时才为其分配内存,答案选 A)。 【知识模块】 函数 23 【正确答案】 A 【试题解析】 静态变量是在编译时就被分配存储空间,所占用存储单元直到程序结束时才释放,其初始化只进行一 次。所以调用三次 fun()函数,计算的结果为s=s*2*4*8=64,答案选 A。 【知识模块】 函数 24 【正确答案】 A 【试题解析】 全局变量( extern)用 static修饰时具有特定的含义,限制该变量只能在当前文件有效而不能被其他文件访问,所以全局变量的作用域和该变量具体定义位置以及 extern的修饰符来决定作用范围。答案选 A。 【知识模块】 函数 25 【正确答案】 A 【试题解析
25、】 考查递归调用。函数 fun()的调用规律是若 k大于 1,则不断调用自身直到 k值为 1, 该函数调用次数与 k值相符合,答案选 A。 【知识模块】 函数 26 【正确答案】 A 【试题解析】 静态变量是在编译时就被分配存储空间,所占用存储单元直到程序结束时才释放,其初始化只进行一次。所以第一次调用 f()函数,计算的结果为n=4, a=2, s=4;第二次调用 f()函数时,函数 f()内的 a初值为 2, n=5,s=4+5=9,答案选 A。 【知识模块】 函数 27 【正确答案】 A 【试题解析】 调用函数 fun1()时,将全局变量 a、 b分别赋值为 ?C?、 ?D?,第一次输出
26、的为全局 变量 a、 b的值,即 C D。当局部变量定义名称和全局变量相同时,以局部变量为先,所以第二次输出结果为 E F,答案选 A。 【知识模块】 函数 28 【正确答案】 A 【试题解析】 考查函数的递归调用, z=fun(3)=3*3-f(1)=3*3-3=6,答案选 A。 【知识模块】 函数 29 【正确答案】 A 【试题解析】 静态变量是在编译时就被分配存储空间,所占用存储单元直到程序结束时才释放,其初始化只进行一次。函数 f()的功能是用 n累加所有调用该函数时传入的 m的值,所以第一次调用 函数 f(+n),传入的参数为 1,返回的值为 1;第二次调用函数 f(n+),传入的参
27、数仍为 1,返回时 n在原先的基础上继续累加1,返回值为 2,所以输出结果为选项 A)。 【知识模块】 函数 30 【正确答案】 A 【试题解析】 考查函数的递归调用。在函数 fun()中,如果 b值不为 0则继续调用 a、 b自减后继续作为函数 fun()参数,直到 b值为 0时方返回 a值,而当前的 a值等于第一次调用时的 a-b,所以函数 fun()的功能是返回 a-b的值,故而输出的结果为 2,答案选 A。 【知识模块】 函数 31 【正确答案】 A 【试题解析】 静态变量是在编译时就被分配存储空间,所占用存储单元直到程序结束时才释放,其初始化只进行一次。所以选项 A)的表述错误,答案
28、选 A)。 【知识模块】 函数 32 【正确答案】 A 【试题解析】 考察函数的递归调用, fun(7)=7-fun(5)=7-(5-fun(3)=2+(3-fun(1)=2,所以输出结果为 2。 【知识模块】 函数 33 【正确答案】 A 【试题解析】 fun()中的 x为一个静态变量。静态变量在编译时就被分配存储空间,所占用存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在,且变量的初始化只进行一次。所以第一次调用函数 fun()时,得 s=2;第二次调用函数 fun()时, x仍保留第一次调用时的计算结果 2,计算后 s=4,所以答案选A。 【知识模块】 函数 34 【正确答案】 A 【试题解析】 在一个源文件中如果外部变量和局部变量同名,则在该局部变量的作用域内,该外部变量会被 “屏蔽 “, main()函数中调用两次 f()函数,第一次调用为 f(0),进入 else选择支句, t=7,返回 7+5=12,此时静 态变量 a=6;第二次调用为 f(1),进入 if选择支句, t=6,返回 6+6=12,静态变量 a=7;在主函数内 s用全局变量 a来初始化,其值为 4,所以计算得 s=4+f(0)+f(1)=28,答案选 A。 【知识模块】 函数