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