1、国家二级 C语言(函数和数组)机试模拟试卷 8及答案与解析 一、选择题 1 若有定义语句: char s10=“1234567 0 0“;则 strlen(s)的值是 ( A) 8 ( B) 7 ( C) 9 ( D) 10 2 有以下程序 #include stdio h int fun(int a, int b) main() if(b=0)return a; printf(“ d n“, fun(4, 2); else return(fun(-a, -b); 程序的运行结果是 ( A) 1 ( B) 2 ( C) 3 ( D) 4 3 当用户要求输入的字符串中含有空格时,应使用的输入函数
2、是 ( A) scanf() ( B) getchar() ( C) gets() ( D) getc() 4 已定义以下函数 int fun(int*p)return*p; fun函数返回值是 ( A)不确定的值 ( B)一个整数 ( C)形参 p中存放的值 ( D)形参 p的地址值 5 程序中若有如下说明和定义语句 char fun(char*); main() char*s=“one“, a5=0, (*f1)()=fun, ch; 以下选项中对函数 fun的正确调用语句是 ( A) (*f1)(a); ( B) *f1(*s); ( C) fun(a); ( D) ch=*f1(s);
3、 6 以下选项中叙述错误的是 ( A)在 C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内 ( B) C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值 ( C) C程序函数中定义的自动变量,系统不自动赋确定的初值 ( D) C程序函数的形参不可以说明为 static型变量 7 若函数调用时的实参 为变量时,以下关于函数形参和实参的叙述中正确的是 ( A)形参只是形式上的存在,不占用具体存储单元 ( B)函数的形参和实参分别占用不同的存储单元 ( C)同名的实参和形参占同一存储单元 ( D)函数的实参和其对应的形参共占同一存储单元 8 以下程序的功能是:给
4、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)计算圆面积的赋值语句使用了非法变量 9 有以下程序 #include stdio h int fun(int a, int b)retum a+b; main()int x=6, y=7, z=8, r; r=fun(fun(x, y), z-);
5、printf(“ d n“, r); 程序运行后的输出结果是 ( A) 15 ( B) 21 ( C) 20 ( D) 31 10 有以下程序 int fun(int n) main() if(n=1)return1; int x; Else scanf(“ d“, &x); x=fun(x); retum(n+fun(n-1); printf(“ d n“, x); 执行程序时,给变量 x输入 10,程序的输出结果是 ( A) 54 ( B) 65 ( C) 45 ( D) 55 11 以下叙述中正确的是 ( A)对于变量而言, “定义 ”和 “说明 ”这两个词实际上是同一个意思 ( B)在
6、复合语句中不能定义变量 ( C)全局变量的存储类别可以是静态类 ( D)函数的形式参数不属于局部变量 12 有以下程序 #include stdio h main()int k=4, m=1, p; fun(int a, int b)int static m=0, i=2: p=fun(k, m); i: i+m+1; printf(“ d, “, p); m=i+a+b; p=fun(k, m); return m; printf(“ d n“, p); 程序运行后的输出结果是 ( A) 8, 17 ( B) 7, 16 ( C) 8, 8 ( D) 7, 17 13 有以下程序 #incl
7、ude stdio_h int f(int n); main()int a=3, s; int f(int n)static int a=1; s=f(a); n+=a+; s=s+f(a); return n; printf(“ d n“, s); 程序运行后的输出结果是 ( A) 9 ( B) 8 ( C) 7 ( D) 10 14 有下列程序: int a=4; int f(int n) main() int t=0; static int a=5; int s=a, i=0; if(n 2)int a=6; t+=a+; for(; i 2; i+)s+=f(i); elseint a
8、=7; t+=a+; printf(“ d n“, s); return t+a+; 程序运行后的输出结果是 ( A) 28 ( B) 24 ( C) 32 ( D) 36 15 若要定义一个具有 5个元素的整型数组,以下错误的定义语句是 ( A) int a5=0; ( B) int b=0, 0, 0, 0, 0); ( C) int c2+31 ( D) int i=5, di; 16 有以下程序 #include stdio h main() void fun(int a, int b) int c10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0), i; int t;
9、for(i=0; i 10; i+=2) t=a; a=b; b=t; fun(ci, ci+1); for(i=0; i 10; i+)printf(“ d, “, ci); printf(“ n“); 程序的运行结果是 ( A) 2, 1, 4, 3, 6, 5, 8, 7, 0, 9, ( B) 0, 7, 9, 8, 7, 6, 5, 4, 3, 2, 1, ( C) 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ( D) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17 有以下程序 #include stdio h main() int s12=1, 2
10、, 3, 4, 4, 3, 2, 1, 1, 1, 2, 3, c5=0, i; for(i=0; i 12; i+)csi+; for(i=1; i 5; i+)printf(“ d“, ci); printf(“ n“); ( A) 4 3 3 2 ( B) 2 3 4 4 ( C) 1 2 3 4 ( D) 1 1 2 3 18 如果定义 float a10, x;则以下叙述中正确的是 ( A)表达式 a+1是非法的 ( B)语句 a=&x;是非法的 ( C)三个表达式 a1、 *(a+1)、 *&a1表示的意思完全不同 ( D)表达式 *&a1是非法的,应该写成 *(&(a1) 19
11、以下能正确定义二维数组是 ( A) int a3; ( B) int a3=2*3; ( C) int a3=; ( D) int a23=1, 2, 3, 4); 20 若有定义: int a2113;,以下选项中对 a数组元素正确引用的是 ( A) a211 ( B) a23 ( C) a03 ( D) a1 211 21 有下列程序: main() int x32=0, i; for(i=0; i 3; i+)scanf(“ d“, xi); printf(“ 3d 3d 3d n“, x00, x01, x10); 若运行时输入: 2 4 6 CR,则输出结果为 ( A) 2 0 0
12、( B) 2 4 0 ( C) 2 0 4 ( D) 2 4 6 22 若有定义: int w35;则以下不能正确表示该数组元素的表达式是 ( A) *(*w+3) ( B) *(*(w+1) ( C) *(w+1)4 ( D) *(&w00+1) 23 以下语句中存在语法错误的是 ( A) char ss20=“right?“; ( B) char*ss6; ss1=“right?“; ( C) char*ss=“right?“); ( D) char ss620; ss1=“right?“; 24 有以下程序 #include stdio h int fun(char s)char*p=s
13、; while(*p=0)p+; return(p-s); main()printf(“ d n“, fun(“0ABCDEF“); 程序运行后的输出结果是 ( A) 6 ( B) 7 ( C) 1 ( D) 0 25 以下叙述中正确的是 ( A)不能用字符串常量对字符数组名进行整体赋值操作 ( B)字符串常量 “Hello”会被隐含处理成一个无名字符型数组, 它有 5个元素 ( C) “char str7=“string!“; ”在语法上是合法的,运行也是安全的 ( D) “char*str; str=“Hello“; ”与 “charstr; str=“Hello“; ”效果是一样的 26
14、 有以下程序 main() char a510=“one“, “two“, “three“, “four“, “five“; int i, j; char t; for(i=0; i 4; i+) for(j=i+1; j 5; j+) if(ai0 aj0) t=ai0; ai0=aj0; aj0=t; puts(a1); 程序运行后的输出结果是 ( A) fwo ( B) owo ( C) two ( D) fix 27 以下不能将 s所指字符串正确复制到 t所指存储空间的是 ( A) for(i=0; ti=si; i+); ( B) while(*t=*s)t+; s+; ( C) f
15、or(i=0, j=0; ti+=sj+; ); ( D) do*t+=*s+; while(*s); 28 以下关于字符串的 叙述中正确的是 ( A)两个字符串中的字符个数相同时才能进行字符串大小的比较 ( B)可以用关系运算符对字符串的大小进行比较 ( C)空串比空格打头的字符串小 ( D) C语言中有字符串类型的常量和变量 国家二级 C语言(函数和数组)机试模拟试卷 8答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 字符串长度函数 strlen(s)表示计算出以 s为起始地址的字符串的长度,并作为函数值返回。这个长度值不包括串尾的结束标志 0。 【知识模块】 函数和数组 2
16、【正确答案】 B 【试题解析】 由程序可知函数 fun(int a, int b)是一个递归函数。所以当主函数中调用 fun(4, 2)时,其执行过程如下: fun(4, 2)- fun(3, 1)- fun(2, 0),其返回值为 2。 【知识模块】 函数和数组 3 【正确答案】 C 【试题解析】 本题考查基本输入输出函数。选项 A)中的 scanf函数接收输入字符串时会把空格当成结束符:选项 B)中的 getchar是读取输出的一个字符,不能用作字符串输入:选项 C)中的 gets满足要求:选项 D)没有 getc函数。 【知识模块】 函数和数组 4 【正确答案】 B 【试题解析】 由函数
17、 int fun(int*p)retum*p的定义可知,返回值为整型指针变量 p所指向的数据。 【知识模块】 函数和数组 5 【正确答案】 A 【试题解析】 本题主要考查函数调用和函数指针的使用。根据定义 f1是一个函数指针,且指向 fun函数,因此可以使用函数指针来调用函数。使用函数指针调用函数的时候使用 *运算符,即 *f1和 fun是一样的, fun函数有参数,通过 f1调用 fun函数写法为: (*f1)(a),括号是必 须的,这样才能保证各部分正确结合。 【知识模块】 函数和数组 6 【正确答案】 B 【试题解析】 在函数定义的静态变量,只需要赋值 1次,即可保存初始值,不需要每次调
18、用时都赋初始值。 【知识模块】 函数和数组 7 【正确答案】 B 【试题解析】 在 C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给形参,在被调用函数中对形参存储单元中的值进行运算,最后通过 retufn语句把函数值返回调用函数。当调用结束后,形 参单元被释放,实参单元仍保留并维持原值。 【知识模块】 函数和数组 8 【正确答案】 D 【试题解析】 本题考查了 C语言的基本输入输出函数。选项 A)错误,代码里面的注释是正确的, “ *”和 “* ”配对;选项 B)错误, r变量定义为整型是可以的;选项 C)输出语句格式正
19、确:选项 D)正确,计算 s的时候 s=*r*r使用了未定义变量 。 【知识模块】 函数和数组 9 【正确答案】 B 【试题解析】 本题考查函数的调用,函数 fun功能为求两个数据的和。主函数中表达式 r=fun(fub(x, y), z-),首先计算内层调用 fun(x, y),计算结果为 13,然后外层调用 fun(13, 8),结果为 21, 【知识模块】 函数和数组 10 【正确答案】 D 【试题解析】 在 C语言中函数可以递归调用,即直接或间接地自己调用自己。本题在函数 int fun(int n)的定义中又出现了对函数 fun的调用,所以函数 fun是递归函数。因而在主函数中调用
20、x=fun(x)时,当输入 10赋给变量 x时,递归调用的过程为: fun(10)=10+fun(9)=109+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。 【知识模块】 函数和数组 11 【正确答案】 C 【试题解析】 用 static说明符说明全局变量时,此变量可称作静态全局变量。静态全局变
21、量只限于本编译单位使用,不能 被其他编译单位所引用。在一个函数内部定义的变量 (包括形参 )是局部变量,它只在本函数范围内有效。不同函数中可以使用相同名字的局部变量,它们代表不同的对象,互不影响。在函数内部复合语句中也可以定义变量,这些变量都是局部变量,只在本复合语句中有效。 【知识模块】 函数和数组 12 【正确答案】 A 【试题解析】 本题考查了静态变量以及局部变量的同名问题。主函数中调用 fun函数两次,第一次调用 fun(4, 1),形参 a和 b接收以后, i值为 3, m的值为 8,调用结束返回 8存放到 p中并且输出 p的值为 8,除了 静态变量 m和 i。变量 a,b撤销。第二
22、次调用 fun(4, 1),接收实参值以后, i为 3+8+1,而 m为 12+4+1,即输出函数值 17。 【知识模块】 函数和数组 13 【正确答案】 A 【试题解析】 在主函数中第一次调用 f(a)时,得到变量 s的值等于 4,在第二次调用 f(a)时,在子函数 f中由于变量 a是一个局部静态变量,所以这次其值等于2因而在主函数中第二次调用 f(a)后,其返回值等于 5,最后变量 s的值等于 9。 【知识模块】 函数和数组 14 【正确答案】 A 【试题解析】 程序 中定义了全局整型变量 a=4。在 int f(int n)函数中定义了局部静态整型变量并进行了初始化即 static nt
23、 a=5。在 int f(int n)函数中对 n是否是偶数进行判断,如果 n是奇数,则函数的返回值为 11,局部静态整型变量 a=6:如果 n是偶数,则函数的返回值为 12,局部静态整型变量 a=6。所以在 main()函数中循环首先执行 s+=f(0)语句,而 f(0)返回值 12,所以第一次循环结束 s的值等于4+12=16;第二次开始执行 f(1)时,在 f(1)中执行 “if(n 2)int a=6; t+=a+; ”和“return t+a+; ”这两条语句,这时 t=6, a=6(静态局部变量第一次循环后其值加 1值不释放,执行第二次循环量,其值仍有效 ),所以 f(1)的返回值
24、等于 12。再在主函数中执行 s+=f(1)语句,即 16+12=28。 【知识模块】 函数和数组 15 【正确答案】 D 【试题解析】 本题考查一维数组的定义, C语言中一维数组的定义方式为:类型说明符 数组名 常量表达式 ;。 选项 A)正确;选项 B)初始化了 5个元素,因此数组长度为 5;选项 C)常量表达式2+3的值为 5,正确;选项 D)数 组长度不是常量表达式,错误。 【知识模块】 函数和数组 16 【正确答案】 C 【试题解析】 C语言规定,实参变量对形参变量的数据传递是 “值传递 ”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存储单元,并
25、将实参对应的值传递给形参,调用结束后形参单元被释放,实参单元仍保留并维持原值。由此可知,在本题中,函数矗 fun(int a, int b)的功能是实现形参整形变量 a和 b值的互换。当在主函数中调用 fun(ci, ci+1)时,把实参变量 ci和 ci+1的值赋给形参变量 a和 b,执行完函数 fun(ci, ci+1)时,形参变量 a和 b的值发生了互换,实参变量 ci和 ci+1的值并没有发生互换,所以输出的值为 1, 2, 3, 4, 5, 6, 7, 8, 9, 0。 【知识模块】 函数和数组 17 【正确答案】 A 【试题解析】 本题考查 for语句的循环控制,首先定义了两个数组
26、并赋予了初始值,第一个 for循环语句循环 12次遍历 s数组的各个元素,将 s中的原素值作为c数组中的下标,使相应的值自加。例如当 i=0, cs0+为 c1+, 其值变为1,当执行 i=1, 2, 11 后, c1、 c2、 c3、 c4分别为 4、 3、 3、 2,故选项 A)为正确的运行结果。 【知识模块】 函数和数组 18 【正确答案】 B 【试题解析】 定义语句 “float a10, x; ”以后,数组名 a表示了数组元素的首地址,是常量在程序中不能更改,因此选项 A)是的描述是正确的。而指向运算符和取址运算符,是互反运算符优先级相同, *&a1和 *(&la1)含义相同。 【知
27、识模块】 函数和数组 19 【正确答案】 B 【试题解析 】 C语言中定义二维数组,必须指定二维数组每一维的大小。选项 A)没有指定数组 a行的大小,错误;选项 B),虽然没有指定行大小,但是可以通过大括号里面的元素个数计算出行的大小为 l,因此是正确的:选项 C)同样没有指定行的大小,也不能通过元素个数计算行的个数,错误:选项 D)定义的是二行三列数组,但是后面数据是三行,超出范围,所以错。 【知识模块】 函数和数组 20 【正确答案】 D 【试题解析】 本题考查数组的使用, C语言中数组的下标从 0开始。本题中 a是一个二维数组,两个下标的范围分别是 0-1和 0-2。选项 A)中第一个下
28、标越界,超出了范围;选项 B)中第一个和第二个下标都超出了范围;选项 C)中第二个下标超出范围;选项 D)中, 1 2的值为 0, !1的值为 0,因此选项 D)实际是访问a00。 【知识模块】 函数和数组 21 【正确答案】 C 【试题解析】 语句 x32=0表示将二维数组 x的所有元素赋初值 0,而循环语句 for(i=0; i 3; i+)scanf(“ dt“, xi)表示对数组元素 x00、 x10、 x20赋值。所以当运行程序时,输入 246 CR时,数组元素 x00=2、 x10=4、x20=6,因此,输出数组元素 x00=2、 x01=0、 x10=4的值 204。 【知识模块
29、】 函数和数组 22 【正确答案】 C 【试题解析】 在 C语言中,二维数组的名字表示的是二维数组的地址,对于二维数组 int w35,可以认为 w为一个一维数组,含有 3个元素,而每个元素为一个含有 5个元素的一维数组。而 (w+1)为一个含有两个元素的一维数组,首先和(w+1)4结合非法, 4超出了二维数组的边界,取 值也就是非法的了。 【知识模块】 函数和数组 23 【正确答案】 A 【试题解析】 选项 A)中定义了二维数组 ss,可以用于存储字符串,但是字符串的存储不能通过赋值,仅可以初始化或者输入得到,而选项 C)和 A)不同,选项C)为指针数组,对于指针变量可以保存常量字符串的地址
30、。 【知识模块】 函数和数组 24 【正确答案】 B 【试题解析】 函数 fun的主要功能是计算字符串中实际字符的个数,因此主函数中调用。 fun得到结果为 7。 【知识模块】 函数和数组 25 【正确答案】 A 【试题解析】 字符数组仅仅可以采用定义时初始化以及输入得到数据,在程序其他部分不允许对其进行赋值,字符串常量中除了实际字符之外还有结束标志,选项 B)错误,而选项 C)中,没有空间存放字符串结束标志,因此运行是不安全的。选项 D)中第一个 str为指针,可以赋值,而后面的为数组,在程序中赋值出错。 【知识模块】 函数和数组 26 【正确答案】 A 【试题解析】 这个程序的执行过程是当
31、 i=0时, j=1, a00=o a10=t;不置换;当 i=1时, j=2, a10=t=a20=t;不置换:当 i=时, j=3, a20;a30=t置换 a20=f, a30=t;此时, a20=f, a10=t再置换 a20=t,a10=f;当 i=3时, j=4, a30=f=a30=f;不置换:所以 a1的结果为 fwo。 【知识模块】 函数和数组 27 【正确答案】 D 【试题解析】 在选项 D)中,不能把 s所指字符串的结束标志符赋给字符串 t。 【知识模块】 函数和数组 28 【正确答案】 C 【试题解析】 C语言本身并没有设置一种类型来定义字符串变量,却允许使用“字符串常量 ”。字符串常量是由双引号括起来的一串字符。任意两个字符串的大小比较要调用字符串比较函数 strcmp(s1, s2)来进行。其比较的方法是依次对 s1和 s2中对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小 (比较字符大小的依据是其 ASCII码值 )。 【知识模块】 函数和数组