1、国家二级 C语言机试(函数和数组)模拟试卷 17及答案与解析 一、选择题 1 以下程序的输出结果是 ( )。 #include #include main() char a10=abc, b10=012, c10=xyz; strcpy(a+1, b+2); puts(strcat(a, c+1); ( A) 12yz ( B) a2yz ( C) abcyz ( D) abyz 2 关于子函数调用的叙述中正确的是 ( )。 ( A)实用 的 C语言源程序总是由一个或多个函数组成 ( B)不同函数的形式参数不能使用相同名称的标识符 ( C)在 C语言的函数内部,可以定义局部嵌套函数 ( D)用
2、户自己定义的函数只能调用库函数 3 设 int fun(int *p)return *p; ,则此函数返回值是 ( )。 ( A) NULL ( B)一个整数 ( C)形参 p中存放的值 ( D)形参 p的地址值 4 关于函数调用的叙述中错误的是 ( )。 ( A) C程序必须由一个或一个以上的函数组成 ( B)函数形参的值也可以传回给对应的实参 ( C) 若函数有返回值,必须通过 return语句返回 ( D)函数调用可以作为一个独立的语句存在 5 关于 void fun()的叙述中正确的是 ( )。 ( A) fun函数无返回值 ( B) fun函数的返回值是 NULL ( C) fun函
3、数的返回值是无值型的指针类型 ( D)指针 fun指向一个函数,该函数无返回值 6 关于静态变量的叙述中错误的是 ( )。 ( A) C程序函数的形参不可以说明为 static型变量 ( B) C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值 ( C) C程序函数中定义 的自动变量,系统不自动赋确定的初值 ( D)在 C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内 7 以下程序的输出结果是 ( )。 #include int fun(int x, int y) if(x=y)return x; return(x+y) 2); main() int a=4
4、, b=5, c=6; printf( d n, fun(2*a, fun(b, e); ( A) 12 ( B) 6 ( C) 3 ( D) 1 8 以下程序的输出结果 是 ( )。 #include double f(double x); double f(double x) return x*x+1; main() double a=0; int i; for(i=0; i 30; i+=10)a+f(double)i); prinff( 5 0f n, a); ( A) 1401 ( B) 53 ( C) 503 ( D) 404 9 若执行调用语句: n=fun(3);,则函数 fu
5、n总共被调用的次数是 ( )。 int fun(int k) if(k 1)return 0; else if(k=1)return 1; else return fun(k一 1)+1; ( A) 1 ( B) 2 ( C) 3 ( D) 4 10 以下程序的输出结果是 ( )。 (strcat函数用以连接两个字符串 ) #include #include main() char a 20=ABCD 0EFG 0, b=IJK; strcat(a, b); printf( s n, a); ( A) OFG OIJK ( B) ABCDIJK ( C) UK ( D) EFG 11 以下程序
6、的输出结果是 ( )。 fun(intx) main() int p; if(x=0x=1)return(3); printf( d n, fun(7); p=x一 fun(x一 2); return p; ( A) 4 ( B) 3 ( C) 0 ( D) 2 12 关于全 局变量作用域的叙述中正确的是 ( )。 ( A)所有文件的所有范围 ( B)所在程序的全部范围 ( C)所在函数的全部范围 ( D)由具体定义位置和 extern说明来决定范围 13 关于变量的定义和说明的叙述中正确的是 ( )。 ( A)对于变量而言, “定义 ”和 “说明 ”这两个词实际上是同一个意思 ( B)在复合
7、语句中不能定义变量 ( C)全局变量的存储类别可以是静态类 ( D)函数的形式参数不属于局部变量 14 以下程序的输出结果是 ( )。 int f(int m) main()int n=0; static int n=0; printf( d, , f(+n); n+=m; return n; printf( d n, , f(+n); ( A) 3, 2 ( B) 1, 2 ( C) 2, 3 ( D) 3, 1 15 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+=
8、a+; for(; i 2; i+)s+=f(i); elseint a=7; t+=a+; printf( d n, s); retum t+a+; ( A) 28 ( B) 30 ( C) 32 ( D) 34 16 若 char *line5;,则以下叙述中正确的是 ( )。 ( A)定义 line是一个数组,每个数组元素是一个基类型为 char的指针变量 ( B)定义 line是一个指向字符型函数的指针 ( C)定义 line是一个指针数组,语句中的 ,一 c号称为间址运算符 ( D)定义 line是一个指针变量,该变量可以指向一个长度为 5的字符型数组 17 若有定义语句: floa
9、t x5=1 0, 2 0, 3 0, 4 0, 5 0, *p=x;则错误引用 x数组元素的是 ( )。 ( A) *P ( B) x5 ( C) *(p+1) ( D) *x 18 合法定义一维数组的是 ( )。 ( A) int a5=0, 1, 2, 3, 4, 5; ( B) char a一 1, 2, 3, 4, 5; ( C) char a=A, B, C; ( D) int a5=0123 19 不合法的数组定义是 ( )。 ( A) int a43=1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3; ( B) int a3=0, 1, 1, 2, 3; (
10、 C) int a3=1, 2, 3, 4; ( D) int a4=1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3; 20 设 int x23;则以下关于二维数组 x的叙述错误的是 ( )。 ( A)数组 x可以看作是由 x0和 x1两个元素组成的一维数组 ( B)可以用 x0=0;的形式为数组所有元素赋初值 0 ( C)元素 x0可看作是由 3个整型元素组成的一维数组 ( D) x0和 x1是数组名,分别代表一个地址常量 21 关于字符数组定义中存在语法错误的是 ( )。 ( A) char ss20=right; ( B) char*ss6; ss1=right?
11、; ( C) char*ss=right? ; ( D) char ss620; ss1=right? ; 22 关于字符数组的定义中有语法错误的是 ( )。 ( A) char str310; str1=guest; ( B) char str10=guest; ( C) char*str3; str1=guest; ( D) char*str=guest; 23 下列能正确进行字符串赋值的是 ( )。 ( A) char s5=ABCDE); ( B) char s5=A, B, C, D, E; ( C) char*s; s=ABCDE; ( D) char*s; printf( s,
12、s); 24 若有以下程序段 char str412=an, bbb, ccccc, d), *strp4; int i; for(i=0; i 4; i+)strpi=stri; 不能正确引用字符串的选项是 ( )。 ( A) strp ( B) str0 ( C) strp3 ( D) *strp 25 关于字符串的叙述中正确的是 ( )。 ( A) char ca35=Aa, BBb, CCc);是不合语法的 ( B)字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组 ( C) char ca5=A, BB, CCC);是不合语法的 ( D) char*ca3=A, BB, C
13、CC;是不合语法的 国家二级 C语言机试(函数和数组)模拟试卷 17答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 程序执行 C语言库函数 “strcpy(a+1, b+2)”后,字符数组 a的值为“a2”,再进行字符串的连接 “strcat(a, c+1)”,此时字符数组 a的值为 “a2yz”。 【知识模块】 函数和数组 2 【正确答案】 D 【试题解析】 C语言源程序可以由一个或多个源文件组成,每个源文件包含一个或多个函数,这些函数可以是自定义函数,也可以是库函数,各个函数之间没有主从关系。 【知识模块】 函数和数组 3 【正确答案】 B 【试题解析】 由题目中的定义可知,返
14、回值为 整型指针变量 p所指向的数据。 【知识模块】 函数和数组 4 【正确答案】 B 【试题解析】 一个 C程序中可以包含任意多个不同名的函数,但只有一个主函数,即 main()函数。一个 C程序总是从主函数开始执行。函数的值通过 return语句返回, return语句中的表达式的值就是所求的函数值。在 C语言中。数据只能从实参单向传递给形参,称为 “按值 ”传递。也就是说,用户不可能在函数中改变对应实参的值 (指针作为实参的除外 )。 【知识模块】 函数和数组 5 【正确答案】 A 【试题解析】 本 题主要考查函数的声明, void fun()即表示 fun函数没有输入参数,函数返回 v
15、oid表示函数无返回值。 【知识模块】 函数和数组 6 【正确答案】 B 【试题解析】 在函数定义的静态变量,只需要赋值一次,即可保存初始值,不需要每次调用时都赋初始值。 【知识模块】 函数和数组 7 【正确答案】 B 【试题解析】 首先看里面的 fun(b, c),传参 5, 6,得到返回值为 5(11 2=5类型相同相除得同类型的 ),再计算外面的 fun(8, 5)输出就是 6;故答案为 B项。 【知识 模块】 函数和数组 8 【正确答案】 C 【试题解析】 题目中函数 f的作用是对形参 x求平方再加 1,所以在主函数中,循环第一次执行后变量 a的值等于 1,第二次执行后,变量 a的值等
16、于 102,第三次执行后,变量 a的值等于 503。 【知识模块】 函数和数组 9 【正确答案】 C 【试题解析】 考查了函数的递归调用,当执行调用语句 n=fun(3)时,返回n=fun(2)+1,再执行 fun(2),返回 n=fun(1)+1+1,而 fun(1)等于 1,所以最后 n的值等于 3。 【知识模块】 函数 和数组 10 【正确答案】 B 【试题解析】 在字符串中字符 0表示字符串的结束标志是系统自动加上的,所以字符串 a和 b相连接的结果为 ABCDIJK。 【知识模块】 函数和数组 11 【正确答案】 D 【试题解析】 本题考查递归调用。因为在函数 fun(x)中,如果参
17、数 x等于 0或等于 1时,返回值为 “3”。否则 p=xfun(x一 2)这是一个递归函数,所以在主函数调用 fun(7)的时候,其过程为: fun(7)=7一 fun(5)=7一 (5一 fun(3)=7一 (5一 (3一fun(1)=7一 (5一 (33)=75=2,所以最后的输出结果为 2。 【知识模块】 函数和数组 12 【正确答案】 D 【试题解析】 在 C语言中,全局变量的作用范围最大,其有效范围从定义变量的位置开始到本源文件结束。如果需要在其他源文件中使用该全局变量,则可以在其他源文件中使用 extern关键字来声明该全局变量,这样该全局变量的作用域就被扩展到以 extern声
18、明了该全局变量的位置开始到此源文件结束。 【知识模块】 函数和数组 13 【正确答案】 C 【试题解析】 C语 言的关键字 static说明符说明全局变量时,此变量可称作静态全局变量。静态全局变量只限于本编译单位使用,不能被其他编译单位所引用。在一个函数内部定义的变量 (包括形参 )是局部变量,它只在本函数范围内有效。不同函数中可以使用相同名字的局部变量,它们代表不同的对象,互不影响。在函数内部复合语句中也可以定义变量,这些变量都是局部变量,只在本复合语句中有效。 【知识模块】 函数和数组 14 【正确答案】 B 【试题解析】 由于变量 n为静态局部变量,所以在主函数中第一次调用函数 f后,变
19、量 n的值等于 1。当 第二次调用函数 f时,在函数 f的内部静态局部变量 n的值仍然保留等于 1,所以返回函数值等于 2。 【知识模块】 函数和数组 15 【正确答案】 A 【试题解析】 本题考查变量作用域。程序中首先定义了全局整型变量 a=4。在int f(int n)函数中定义了局部静态整型变量并进行了初始化即 static int a=5,在 int f(int n)函数中对 n是否是偶数进行判断,如果 n是奇数,则函数的返回值为 11,局部静态整型变量 a=6;如果 n是偶数,则函数的返回值为 12,局部静态整型变量 a=6。所以在 main()函数中循环首先执行 s+=f(0)语句
20、,而 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)的返回值等于 12。再在主函数中执行 s+=f(1)语句,即 16+12=28。 【知识模块】 函数和数组 16 【正确答案】 A 【试题解析】 本 题考查指针数组的定义。本题中 line是一个指针数组用来存放指针变量,有 5个元素。每个元素都是一个指针变量。 【知识模块
21、】 函数和数组 17 【正确答案】 B 【试题解析】 x是一个一维 float类型的数组,长度为 5,下标范围是 0 4,指针p指向数组 x。选项 A中 *p是取数组首元素 x0的值;选项 B下标超出范围;选项 C中 *(p+1)表示 x1的地址,因此 *(p+1)是取 x1元素值;选项 D中,数组名 x本身代表数组的首地址,因此 *x表示取元素 x0的值。 【知识模块】 函数和数组 18 【正确答案】 B 【试题解析】 本题考查一维数组的定义, C语言中一维数组的定义必须使用 说明长度,长度可以省略。选项 A定义的数组长度为 5,元素个数为 6,超过数组长度,错误;选项 B正确,编译器会根据
22、初始化元素的个数自动计算数组的长度。选项 C中没有使用 “”,不能定义一维数组;选项 D中数组元素的初始化必须使用大括号。 【知识模块】 函数和数组 19 【正确答案】 D 【试题解析】 二维数组定义和初始化是允许省略行下标,不允许省略列下标,因此 int a4的定义有误。 【知识模块】 函数和数组 20 【正确答案】 B 【试题解析】 C语言中二维数组的元素在内存中占一系列连续的存储单元。数组元素在内存中的排列顺序是先存放第 0行的元素,再存放第 1行的元素 称这种存放顺序为按行存放。可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组。另外在给二维数组赋初值时可
23、以不用含花括号对。例如, int a43=1, 2, 4, 5;在编译时,系统将按 a数组元素在内存中排列的顺序,将花括号内的数据一一对应地赋给各个元素,若数据不足,系统将给后 面的元素自动补初值 0。以上将给 a数组第一行的元素和第二行的第一个元素依次赋予 1、 2、 4、 5,其他元素的初值都为 0。 【知识模块】 函数和数组 21 【正确答案】 D 【试题解析】 本题考查字符数组,选项 D中定义了二维数组 ss,可以用于存储字符串,但是字符串的存储不能通过赋值,仅可以初始化或者输入得到,而选项C和 A不同,选项 B为指针数组,对于指针变量可以保存常量字符串的地址。 【知识模块】 函数和数
24、组 22 【正确答案】 A 【试题解析】 本题考查字符数组的定义和使用。选项 A定 义了一个二维字符数组,第二句是直接给字符数组赋值,错误。 C语言中不能直接给字符数组赋值;选项, B、 C和 D都是正确的。 【知识模块】 函数和数组 23 【正确答案】 C 【试题解析】 字符串存储要有结束符 “ 0”且要占用一个空间其大小是一个字符,选项 A、 B的空间不够: printf用来输出字符,不能输入字符串。 【知识模块】 函数和数组 24 【正确答案】 A 【试题解析】 *strp是含有 4个元素的指针数组,分别保存了二维数组 str中的 4个字符串的首地址,因此 strp为二级地址 ,不能保存字符串的首地址, *strp或者strp0中存放了字符串 “aa”的首地址。所以不能正确引用字符串的为选项 A。 【知识模块】 函数和数组 25 【正确答案】 B 【试题解析】 字符串数组每个元素为一个字符串,选项 B的说法正确。选项 A和 C对于 ca的定义是正确的。选项 D定义一个指针数组,可以保存多个字符串的首地址。 【知识模块】 函数和数组