1、国家二级 C语言机试(函数和数组)模拟试卷 20及答案与解析 一、选择题 1 以下选项中叙述错误的是 ( A)在 C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内 ( B) C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值 ( C) C程序函数中定义的自动变量,系统不自动赋确定的初值 ( D) C程序函数的形参不可以说明为 static型变量 2 有以下程序 int flint x); main()int n=1, m; m=f(f(f(n); printf(“ n“, m); int f(int x) return x*2; 程序运行后的输出结果是 (
2、A) 1 ( B) 2 ( C) 4 ( D) 8 3 有以下程序 #include int fun(int x, int y) main() if(x=y)return(x); int a=4, b=5, c=6; else return(x+y) 2); printf(“ d n“, fun(2*a, fun(b, c); 程序运行后的输出结果是 ( A) 3 ( B) 6 ( C) 8 ( D) 12 4 有以下程序 #include main() int flint x, int y) int a=3, b=4, c=5, d; return(y-x)*x); ) d=f(f(a, b
3、), f(a, c); printf(“ d n“, d); 程序运行后的输出结果是 ( A) 10 ( B) 8 ( C) 9 ( D) 7 5 有以下程序 #include double f(double x); main()double f(double x) double a=0; int i; return x*x+1; for(i=0; i int flint x); main() int f(int x) int a, b=0; return x*x+1; for(a=0; a=10) f(z); printf(“ d-“, x 10); f(x 10); else printf
4、(“ d“, x); 则程序的输出结果是 ( A) 6-5-4-3-2-1 ( B) 6-5-4-3-2-1- ( C) 1-2-3-4-5-6 ( D) 1-2-3-4-5-6- 10 以下与函数 fseek(fp, OL, SEEK SET)有相同作用的是 ( A) feof(fp) ( B) ftell(fp) ( C) fgetc(fp) ( D) rewind(fp) 11 以下程序的功能是:给 r输入数据后计算半径为 r的圆面积 s。程序在编译时出错 main() *Beginning* int r; float s; scanf(“ d“, r); s=*r*r; printf(
5、“s= f n“, s); 出错的原因是 ( A)注释语句书写位置错误 ( B)存放圆半径的变量 r不应该定义为整型 ( C)输出语句中格式描述非法 ( D)计算圆面积的赋值语句使用了非法变量 12 以下程序函数 f的功能是:当 flag为 1时,进行由小到大排序:当 flag为 0时,进行由大到小排序 void flint b, int n, int flag) main() int i, j, t; int a10=5, 4, 3, 2, 1, 6, 7, 8, 9, 10, i; for(i=0; iblj: bi main() int k=011; printf(“ d n“, k+)
6、; 程序运行后的输出结果是 ( A) 12 ( B) 11 ( C) 10 ( D) 9 14 有以下程序 #include int fun(int x)int p; if(x=0 x=1)return(3); p=x-fun(x-2); return(p); main()printf(“ d n“, fun(9); 程序运行后的输出结果是 ( A) 5 ( B) 9 ( C) 4 ( D) 7 15 有以下程序 #include int fun(int n)int a; main() if(n=1)return 1; a=n+fun(n-1); printf(“ d n“, fun(5);
7、return(a); j 程序的输出结果是 ( A) 14 ( B) 10 ( C) 15 ( D) 9 16 有以下程序 #include 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(“ d n“, r); 程序运行后的输出结果是 ( A) 15 ( B) 21 ( C) 20 ( D) 31 17 以下选项中函数形参不是指针的是 ( A) fun(int&p) ( B) fun(int a10) ( C) fun(int*a) ( D) fun(int P
8、) 18 设有如下函数定义 int fun(int k) if(k int f(int x) main() int y; int z; if(x=0x=1)return(3); z=f(3); printf(“ d n“, z); y=x*x-f(x-2); return y; 程序的运行结果是 ( A) 9 ( B) 0 ( C) 6 ( D) 8 20 有以下程序 (strcat函数用以连接两个字符串 ) #include #include main() char a20=“ABCD 0EFG 0“, b=“IJK“; strcat(a, b); printf(“ s n“, a); 程序
9、运行后的输出结果是 ( A) ABCDE 0FG 0IJK ( B) ABCDIJK ( C) IJK ( D) EFGIJK 21 有以下程序 int fun(int n) main() if(n=1)return 1; int x; Else scanf(“ d”, &x); x=fun(x); return(n+fun(n 1); printf(“ d n“, x); 执行程序时,给变量 x输入 10,程序的输出结果是 ( A) 54 ( B) 65 ( C) 45 ( D) 55 22 有以下程序 fun(int x) main() int p; if(x=0 x=1)return(3
10、); printf(“ d n“, fun(7); p=x-fun(x-2); return p; 执行后的输出结果是 ( A) 3 ( B) 7 ( C) 0 ( D) 2 23 若有以下程序 int f(int a, int n) main() if(n1) int a=8, 2, 9, 1, 3, 6, 4, 7, 5; int t; t=f(a, n 1); printf(“ d n“, f(a, 9); return tan-1?t: an-1; else return a01; 则程序的输出结果是 ( A) 9 ( B) 1 ( C) 8 ( D) 5 24 在一个 C源程序中所定
11、义的伞局变量。其作用域为 ( A)所在文件的全部范围 ( B)所存程序的全部范围 ( C)所在函数的全部范围 ( D)由具体定义位置和 extern说明来决定范围 25 以下叙述中正确的是 ( A)只有全局变量才有自己的作用域,函数中的局部变量没有作用域 ( B)只要是用户定义的标识符,都有一个有效的作用域 ( C)只有在函数内部定义的变量才是局部变量 ( D)局部变量不能被说明为 static 26 以下叙述中正确的是 ( A)对于变量而言, “定义 ”和 “说明 ”这两个词实际上是同一个意思 ( B)在复合语句中不能定义变量 ( C)全局变量的存储类别可以是静态类 ( D)函数的形式参数不
12、属于局部变量 27 有以下程序 int d=1; void fun(int p) main()int a=3; int d=5; fun(a); d+=p+; d+=a+; printf(“ d“, d); ) printf(“ d n“, d); 程序的输出结果是 ( A) 9 6 ( B) 9 4 ( C) 8 4 ( D) 8 5 28 有以下程序 #include int a=1, b=2; void fun1(int a, int b) main() printf(“ d d“, a, b); )。 fun1(5, 6); fun2(); void fun2() printf(“ d
13、 d n“, a, b); a=3; b=4; 程序运行后的输出结果是 ( A) 1 2 5 6 ( B) 5 6 l 2 ( C) 5 6 3 4 29 在一个 C源程序文件中所定义的全局变量,其作用 域为 ( A)由具体定义位置和 extern说明来决定范围 ( B)所在程序的全部范围 ( C)所在函数的全部范围 ( D)所在文件的全部范围 国家二级 C语言机试(函数和数组)模拟试卷 20答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 在函数定义的静态变量,只需要赋值 1次,即可保存初始值,不需要每次调用时都赋初始值。 【知识模块】 函数和数组 2 【正确答案】 D 【试题解析
14、】 程序考查了函数的调用。对于 m=f(f(f(n);首先计算最内层的函数调用 f(n),执 行 f函数,得到返回值 2,然后计算 f(2),得到返回值为 4,最后计算 f(4),得到计算结果为 8。 【知识模块】 函数和数组 3 【正确答案】 B 【试题解析】 fun(b, c)即 fun(5, 6), 5!=6,所以返回 (5+6) 2=5; fun(2*a, 5)即 fun(8, 5), 8!=5,所以返回 (8+5) 2=6。 【知识模块】 函数和数组 4 【正确答案】 C 【试题解析】 本题考查函数的嵌套调用。首先计算 f(a, b)与 f(a, c), f(a,b)=(b-a)*a
15、=3, f(a, c)=(c-a)*a=6,然后计算 f(3, 6)=(6-3)*3=9。 【知识模块】 函数和数组 5 【正确答案】 C 【试题解析】 由于函数 f的作用是对形参 x求平方再加 1,所以在主函数中,循环第一次执行后变量 a的值等于 1,第二次执行后,变量 a的值等于 102,第三次执行后,变量 a的值等于 503。 【知识模块】 函数和数组 6 【正确答案】 B 【试题解析】 在 C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给形参,在被调用函数中对形参存储单元中的值进行运算,最后通过 return语句
16、把函数值返回调用函数。当调用结束后,形参单元被释放,实参单元仍保留并维持原值。 【知识模块】 函数和数组 7 【正确答案】 C 【试题解析】 函数 fun中采用了变量作为参数,那么参数传递以后,形参 a,b, c的变化对于实参 a, b, c是没有影响的,因此主函数中 a, b, c的值经过 fun调用以后,值没有变化。 【知识模块】 函数和数组 8 【正确答案】 B 【试题解析】 在函数 main()中,第一次执行 for循环 时, b的值等于 1,此时输出字母 B;第二次执行 for循环时, b的值等于 3,此时输出字母 D;第三次执行for循环时, b的值等于 8,此时输出字母 I。 【
17、知识模块】 函数和数组 9 【正确答案】 A 【试题解析】 函数 f的主要功能为逆置输出整数 x的每一位数据,如果 z的值为123456,逆置输出的结果为 6-5-4-3-2-1。 【知识模块】 函数和数组 10 【正确答案】 D 【试题解析】 本题主要考查文件系 IO函数的使用, fseek函数用于设置文件指针的位置, feof函数用于判断是否 已经到了文件结束, ftell函数返回文件指针的当前位置, fgetc从文件读取一个字符, rewind函数将文件指针重新指向文件开始。题目当中 fseek(fp, OL, SEEK_SET)表示把文件指针移动到文件的开始位置 0,和rewind函数
18、功能一致。 【知识模块】 函数和数组 11 【正确答案】 D 【试题解析】 本题考查了 C语言的基本输入输出函数。选项 A错误,代码里面的注释是正确的, “ *”和 “* ”配对;选项 B错误, r变量定义为整型是可以的;选项 C输出语句格式正确;选项 D正确,计算 s的时候 s=*r*r使用了未定义变量 。 【知识模块】 函数和数组 12 【正确答案】 B 【试题解析】 本题主要考查函数的调用。在 min函数中,两次调用 f函数进行排序, f函数有三个参数,第一个参数是数组地址,第二个参数是需要排序的数据个数,第三个参数指定排序依据。第一次调用 f函数的时候,从第三个元素开始对 5个元素进行
19、从大到小的排序,因此调用 f函数转换数组 a的值分别为: 5, 4, 7,6, 3, 2, 1, 8, 9, 10;第二次调用 f函数对数组 a的前 5个元素进行从小到大的排序,因此排序完成后数组 a的值变成: 3, 4, 5, 6, 7, 2, 1, 8, 9, 10。 【知识模块】 函数和数组 13 【正确答案】 D 【试题解析】 本题主要考查基本数据类型和格式化输出函数 printf。变量 k的初值为 011,表示 8进制的 11,十进制值为 9, printf输出 k+的值, +在 k的后面表示先使用后自增,因此输出的值为 9。 【知识模块】 函数和数组 14 【正确答案】 D 【试题
20、解析】 函数 fun的主要功能是: 初值 x的值为 9,因此 fun(9)=9-fun(7)=9-(7-(5一 (3 3),因此答案为 7。 【知识模块】 函数和数组 15 【正确答案】 C 【试题解析】 函数劬为递归定义的函数,当调用fun(5)5+fun(4)5+4+fun(3)5+4+3+fun(2)5+4+3+2+fun(1) ,因此最后的结果为 15。 【知识模块】 函数和数组 16 【正确答案】 B 【试题解析】 本题考查函数的调用,函数 fun功能为求两个数据的和。主函数中表达式 r=fun(funlx, y), z-),首先计算内层调用。 fun(x, y),计算结果为 13,
21、然后外层调用 rune(13, 8),结果为 21。 【知识模块】 函数和数组 17 【正确答案】 A 【试题解析】 C语言中形参数组是指针变量,其数组中元素的个数由传递的实参数组决定,因此可以在定义的时候,不给出元素个数的说明,因此选项 B和 D)形参均为指针变量,选项 A的定义在 C语言中不存在的。 【知识模块】 函数和数组 18 【正确答案】 C 【试题解析】 这道题目考查了函数的递归调用,当执行调用语句 n=fun(3)时,返回 n=fun(2)+1,再执行 fun(2),返回 n=fun(1)+1+1,而 fun(1)等于 1,所以最后 n的值等于 3。而函数 fun总共被调用了 3
22、次。即 fun(3), funt2), fun(1)。 【知识模块】 函数和数组 19 【正确答案】 C 【试题解析】 主函数调用目 )函数,将实参 3传递给 x,进行 if条件语句的判断不成立,接着执行 y=3*3-f(1),再执行 f(1),而 f(1)满足 if条件语句,所以 f(1)的值为 3,代入 y=3*3-f(1)=9-3=6。 【知识模块】 函数和数组 20 【正确答案】 B 【试题解析】 在字符串中字符 0表示字符串的结束 标志,所以字符串 a和 b相连接的结果为 ABCDIJK。 【知识模块】 函数和数组 21 【正确答案】 D 【试题解析】 在 C语言中函数可以递归调用,
23、即直接或间接地自己调用自己。本题在函数 int fun(int n)的定义中又出现了对函数 fun的调用,所以函数 fun是递归函数。因而在主函数中调用 x=fun(x)时,当输入 10赋给变量 x时,递归调用的过程为: fun(10)=10+fun(9)=10+9+fun(8)=10+9+8+fun(7)=10+9+8+7+fun(6) =10+9+8+7+6+fun(6)=10+9+8+7+6+5+fun(4)=10+9+8+7+6+5+4+fun(3) =10+9+8+7+6+5+4+3+fun(2)=10+9+8+7+6+5+4+3+2+fun(1) =10+9+8+7+6+5+4+3
24、+2+1=55 【知识模块】 函数和数组 22 【正确答案】 D 【试题解析】 因为在函数 fun(int x)中,如果参数 x等于 0或等于 1时,返回值为 “3”。否则 “p=x-fun(x-2)”这是一个递归函数,所 以在主函数调用 fun(7)的时候,其过程为: “fun(7)=7-fun(5)=7-(5-fun(3)=7-(5-(3-fun(1)=7-(5-(3 3)=7 5=2”,所以最后的输出结果为 2。 【知识模块】 函数和数组 23 【正确答案】 A 【试题解析】 主函数中调用 f(a, 9),递归函数的调用过程如下: f(a, 9)f(a ,8)f(a , 7)f(a ,
25、6)f(a , 5)f(a , 4)f(a , 3)f(a , 2)f(a , 1), f(a, 1)得到返回值为 a0,值为 8,递归过程开始 回归,回归过程描述如下: 8a1,返回 88a2 不成立,返回 a2的值为 9 因此函数 f的主要功能为计算数组中的最大值。主函数中输出最大值为 9。 【知识模块】 函数和数组 24 【正确答案】 D 【试题解析】 本题考查 C语言的作用域规则。在 C语言中,全局变量的有效范围从定义变量的位置开始到本源文件结束。如果需要在其他源文件中使用该全局变量,则可以在其他源文件中使用 extem关键字来声明该全局变量,这样该全局变量的作用域就被扩展到以 ext
26、em声明了该全局变量的位置开始到此 源文件结束。 【知识模块】 函数和数组 25 【正确答案】 B 【试题解析】 在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也是全局变量。全局变量可以为源文件中其他函数所共用,其作用域为从定义变量的位置开始到源文件结束。因此只要用户定义的标识符,全部都有作用域。局部变量可以说明为 auto、 register以及 static。 【知识模块】 函数和数组 26 【正确答案】 C 【试题解析】 用 static说明符说明全局变量时,此变量可称作静态全局变量。静态全局 变量只限于本编译单位使用,不能被其他编译单位所引用。在一个函数内部定义的变
27、量 (包括形参 )是局部变量,它只在本函数范围内有效。不同函数中可以使用相同名字的局部变量,它们代表不同的对象,互不影响。在函数内部复合语句中也可以定义变量,这些变量都是局部变量,只在本复合语句中有效。 【知识模块】 函数和数组 27 【正确答案】 C 【试题解析】 代码考查点为全局变量和局部变量的同名问题,若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量 不发生任何关系。主函数执行。 fun(3)时候,执行调用函数 fun,使用局部变量 d=5,执行 d+=p+,相当于 d=d+(p+),得到 d的值为 8,输出。函数调用结
28、束,转到主函数,继续执行 d+=a+,此时 d为全局变量,执行语句以后, d值为 4。 【知识模块】 函数和数组 28 【正确答案】 D 【试题解析】 函数 fun1()的作用是输出局部变量 a和 b的值,在主函数中执行fun1(5, 6)的结果是输出 5, 6:函数 fun2()的作用是给变量 a和 b分别赋值 3,4;执行 fun2()的作用是输出 3, 4。 【知识模块】 函数和数组 29 【正确答案】 A 【试题解析】 全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。在同一编译单位内用 extern说明符扩展全局变量的作用域 (当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用 extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需要再为它分配存储单元。这时全局变量的作用域从 extern说明处起,延伸到该函数末尾 )。当一个程序由多个编译单位构成,并且在每个文件中均需要引用同一个全局变量,这时只在其中一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用 extem对这些变量进行说明。 【知识模块】 函数和数组