1、国家二级 C语言(函数和数组)机试模拟试卷 7及答案与解析 一、选择题 1 以下叙述中正确的是 ( A)用户自己定义的函数只能调用库函数 ( B)不同函数的形式参数不能使用相同名称的标识符 ( C)在 C语言的函数内部,可以定义局部嵌套函数 ( D)实用的 C语言源程序总是由一个或多个函数组成 2 若有以下定义和语句 char s110=“abcd!“, *s2=“ n123 “; printf(“ d d n“, strlen(s1), strlen(s2); 则输出结果是 ( A) 10 5 ( B) 10 7 ( C) 5 5 ( D) 5 8 3 在 C语言中,函数返回值的类型最终取决
2、于 ( A)函数定义时在函数首部所说明的函数类型 ( B) retum语句中表达式值的类型 ( C)调用函数时主调函数所传递的实参类型 ( D)函数定义时形参的类型 4 以下关于 return语句的叙述中正确的是 ( A)一个自定义函数中必须有一条 return语句 ( B)一个自定义函数中可以根据不同情况设置多条 return语句 ( C)定义成 void类型的函数中可以有带返回值的 retum语句 ( D)没有 return语句 的自定义函数在执行结束时不能返回到调用处 5 程序中对 fun函数有如下说明 void fun(); 此说明的含义是 ( A) fun函数无返回值 ( B) fu
3、n函数的返同值可以是任意的数据类型 ( C) fun函数的返回值是无值型的指针类型 ( D)指针 fun指向一个函数,该函数无返回值 6 若有以下函数首部 int fun(double x10, int*n)则下面针对此函数的函数声明语句中正确的是 ( A) int fun(double, int); ( B) int fun(double*x, int n): ( C) int fun(double*, int*); ( D) int fun(double x, int*n); 7 有以下程序 #include stdio h double f(double x); main() doubl
4、e f(double 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 8 以下与函数 fseek(fp, OL, SEEK_SET)有相同作用的是 ( A) feof(fp) ( B) ftell(fp) ( C) fgetc(fp) ( D) rewind(fp) 9 有以下程序 #include stdio h int fun(int n)int a;
5、main() if(n=1)return1; a=n+fun(n-1); printf(“ d n“, fun(5); return(a); 程序的输出结果是 ( A) 14 ( B) 10 ( C) 15 ( D) 9 10 有以下程序 (strcat函数用以连接两个字符串 ) #include stdio h #include string h main() char a20=“ABCD OEFG 0“, b=“IJK“; strcat(a, b); printf(“ s n“, a); 程序运行后的输出结果是 ( A) ABCDE 0FG 0IJK ( B) ABCDIJK ( C) I
6、JK ( D) EFGIJK 11 以下叙述中正确的是 ( A)只有全局变量才有自己的 作用域,函数中的局部变量没有作用域 ( B)只要是用户定义的标识符,都有一个有效的作用域 ( C)只有在函数内部定义的变量才是局部变量 ( D)局部变量不能被说明为 static 12 有以下程序 void fun2(char a, char b) main() printf(“ c c“, a, b); fun1(); char a=A, b=B; printf(“ c c“, a, b); void fun1() fun2(E, F); a=C; b=D; 程序的运行结果 是 ( A) A B E F
7、( B) C D E F ( C) A B C D ( D) C D A B 13 有以下程序 #include stdio h main()int i, s=1; int fun()static int x=1; for(i=1; i =3; i+) x*=2; s*=fun(); return x; printf(“ d n“, s); 程序运行后的输出结果是 ( A) 0 ( B) 10 ( C) 30 ( D) 64 14 有以下程序 #include stdio h main() int fun() int i, s=1; static int x=1; for(i=1; i =2;
8、 i+)s=fun(); x*=2; return x; printf(“ d n“, s); 程序运行后的输出结果是 ( A) 4 ( B) 1 ( C) 0 ( D) 8 15 若有定义语句: double x5=1 0, 2 0, 3 0, 4 0, 5 0, *p=x;则错误引用 x数组元素的是 ( A) *p ( B) x5 ( C) *(p+1) ( D) *x 16 有以下 程序 #include stdioh void main() Int a=2, 3, 5, 4), i; for(i=0; i 4; i+) switch(i 2) case0: switch(ai 2) c
9、ase0: ai+; break; case1: ai-; break; case1: ai=0; for(i=0; i 4; i+) printf(“ d“, ai); printf(“ n“); 程序运行后的输出结果是 ( A) 2 0 5 0 ( B) 3 3 4 4 ( C) 3 0 4 0 ( D) 0 3 0 4 17 下列程序中函数 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,
10、 8, 9, 10, i; for(i=0; i n-1; i+) f(&a2, 5, 0); for(j=i+1; j n; j+) f(a, 5, 1); if(flag?bi bj; bi bj) for(i=0; i 10; i+) t=bi; bi; bj; bj=t; printf(“ d, “, ai); 程序运行后的输出结果是 ( A) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ( B) 3, 4, 5, 6, 7, 2, 1, 8, 9, 10, ( C) 5, 4, 3, 2, 1, 6, 7, 8, 9, 10, ( D) 10, 9, 8, 7, 6
11、, 5, 4, 3, 2, 1, 18 以下叙述中正确的是 ( A)语句 int a=0;是不合法的,遗漏了数组的大小 ( B)语句 char a2t=“A“, “B“;是合法的,定义了一个包含两个字符的数组 ( C)语句 int a8=0;是合法的 ( D)语句 char a3; a=“AB“;是合法的,因为数组有三个字符空间的容量,可以保存两个字符 19 若有以下程序 #include char*a=“you“, b=“welcome#you#to#China!“; main()int i, j=0; char*p; for(i=0; bi!= 0; i+) if(*a=bi) p=&bi
12、; for(j=0; aj!= 0; j+) if(aj!=*p)break; p+; if(aj= 0)break; printf(“ s n“, p); 则程序的输出结果是 ( A) #you#to#China! ( B) me#you#to#China! ( C) #China! ( D) #to#China! 20 若有定义语句: int a23, *p3;,则以下语句中正确的是 ( A) p=a; ( B) p0=a; ( C) p0=a12; ( D) p1=a; 21 以下定义数组的语 句中错误的是 ( A) int=num3=1, 2, 3, 4, 5, 6; ( B) int
13、 num=1, 2, 3, 4, 5, 6; ( C) int num4=1, 2, 3, 4, 5, 6; ( D) int num24=1, 2, 3, 4, 5, 6; 22 有下列程序: main() int a44=1, 4, 3, 2), 8, 6, 5, 7), 3, 7, 2, 5), 4, 8, 6, 1), i,k, t; for(i=0; i 3; i+) for(k=i+1; k 4; k+)if(aii akk)t=aii; aii=akk; akk=t; for(i=0; i 4; i+)printf(“ d, “, a0i); 程序运行后的输出结果是 ( A) 6
14、, 2, 1, 1, ( B) 1, 1, 2, 6, ( C) 2, 3, 4, 6, ( D) 6, 4, 3, 2, 23 有以下程序 #include stdio h #define N 3 void fun(int aN, int b) main() int i, j; int xNN=1, 2, 3, 4, 5, 6, 7, 8, 9, yN, i; for(i=0; i N; i+) fun(x, y); bi=ai0; for(i=0; i N; i+)printf(“ d, “, yi); for(j=1; j N; j+) printf(“ n“); if(bi aij)
15、bi=aij; ( A) 1, 3, 5, ( B) 2, 4, 8, ( C) 3, 5, 7 ( D) 3, 6, 9, 24 以下选项中,能正确进行字符串赋值的是 ( A) char s5=A, B, C, D, E; ( B) char*s=“ABCDE“; ( C) char s45=“ABCDE“; ( D) char*s; gets(s); 25 以下叙述中正确的是 ( A)函数调用 “strlen(s); ”会返回字符串 s实际占用内存的大小 (以字节为单位 ) ( B)两个字符串可以用关系运算符进行大小比较 ( C)当拼接两个字符串时,结果字符串占用的内存空间是两个原串占用空
16、间的和 ( D) C语言本身没有提供对字符串进行整体操作的运算符 26 以下选项中,没有编译错误的是 ( A) char str3=d, e, b, u, g, 0); ( B) char str15=“pass“, str26; str2=str1; ( C) char name10; name=“china“; ( D) char str4; str4=“hello world“; 27 有以下程序 #include stdio h void main() char s=“012xy 08s34f4w2“; int i, n=0; for(i=0; si!=0; i+) if(si =0&
17、si =9)n+; printf(“ d n“, n); 程序运行后的输出结果是 ( A) 0 ( B) 7 ( C) 3 ( D) 8 28 以下能正确定义字符串的语句是 ( A) char str=“kx43“; ( B) char str: “ 0“; ( C) char str=“; ( D) char str= 064; 国家二级 C语言(函数和数组)机试模拟试卷 7答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 一个 C语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,这些函数可以是自定义函数,也可以是库函数,各个函数之间没有主从关系,不能嵌套定义
18、函数。 【知识模块】 函数和数组 2 【正确答案】 C 【试题解析】 本题要注意的是转义字符的问题,在字符串 s2中,有两个转义字符,分别是回车换行符和反斜线。所以其字符串长度等于 5。 【知识模块】 函数和数组 3 【正确答案】 A 【试题解析】 C语言中函数的返回值类型是由定义函数时在函数首部所声明的 类型确定的。 【知识模块】 函数和数组 4 【正确答案】 B 【试题解析】 return语句主要用于返回函数的值。在一个自定义函数中,可以根据不同的情况设置多条 return语句返回函数的值。 【知识模块】 函数和数组 5 【正确答案】 A 【试题解析】 本题主要考察函数的声明, voidf
19、un()表示 fun函数没有输入参数,函数返回 void表示函数无返回值。 【知识模块】 函数和数组 6 【正确答案】 C 【试题解析】 函数说明的一般形式为:类型名函数名 (参数类 型 1参数类型2, ) 。因为函数 int fun(doublex10, int*n)的第 1个形式参数是一个双精度型的一维数组,第 2个参数是一个整型指针。并返回一个整型值。一维数组的名宁表示的足维数组的地址。 【知识模块】 函数和数组 7 【正确答案】 C 【试题解析】 由于函数 f的作用是对形参 x求平方再加 1,所以在主函数中,循环第一次执行后变量 a的值等于 1,第二次执行后,变量 a的值等于 102,
20、第三次执行后,变量 a的值等于 503。 【知识模块】 函数和数组 8 【正确答案】 D 【试题解析】 本题主要考查文件系 IO函数的使用, fseek函数用于设置文件指针的位置, feof函数用于判断是否已经到了文件结束, ftell函数返回文件指针的当前位置, fgetc从文件读取一个字符, rewind函数将文件指针重新指向文件开始。题目当中 fseek(fp, OL, SEEK_SET)表示把文件指针移动到文件的开始位置 0,和rcwind函数功能一致。 【知识模块】 函数和数组 9 【正确答案】 C 【试题解析】 函数 fun为递归定义的函数,当调用fun(5)5+fun(4)5+4
21、 +fun(3)5+4+3+fIun(2)5+4+3+2+fun(1) 。因此最后的结果为 15。 【知识模块】 函数和数组 10 【正确答案】 B 【试题解析】 在字符串中字符 0表示字符串的结束标志,所以字符串 a和 b相连接的结果为 ABCDUK。 【知识模块】 函数和数组 11 【正确答案】 B 【试题解析】 在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也是全局变量。全局变量可以为源文件中其他函数所共用,其作用域为从定义变量的位置开始到源文件结束。因 此只要用户定义的标识符,全部都有作用域。局部变量可以说明为 auto、 register以及 static。 【知
22、识模块】 函数和数组 12 【正确答案】 B 【试题解析】 在 fun1()函数之前定义了全局字符变量 a和 b。这两个变量的作用域是从其定义处到整个程序结束。在 fun1()函数之内定义了两个变量 a和 b,并且分别初始化为字符 C和 D。在 C语言中,若全局变量和某个函数中的局部变量同名,则在该函数中此全局变量被屏蔽,在该函数内访问的是局部变量,与同名的全局变量不发生任何关系。所以在主函数中 ,执行 fun1()后,变量 a、 b的值分别等于 C、 D,打印输出 CD,接着执行 fun2(E, F)语句,变量 a、 b的值变为E、 F并输出。 【知识模块】 函数和数组 13 【正确答案】
23、D 【试题解析】 本题考查了静态局部变量,该局部变量的值在函数调用结束后如果不消失而保留原值。函数 fun的功能返回 2的乘方,主函数 fun函数调用 3次,因此第一次 s累乘 2,第二次累乘 4,第三次累乘 8,即为 2*4*8,值为 64。 【知识模块】 函数和数组 14 【正确答案】 A 【 试题解析】 在子函数 fun(中 )定义局部静态变量 x,其初值等于 1,然后再把其值扩大 1倍后返回。在主函数中执行 for循环语句 2次,调用函数 fun()两次,所以变量 s的值等于 4。这里要强调的一点是当函数。 fun()执行完毕后,局部静态变量 x的值不会丢失,仍然有效。 【知识模块】
24、函数和数组 15 【正确答案】 B 【试题解析】 本题考查数组和指向数组的指针。 x是一个二维 double类型的数组,长度为 5,下标范围是 0-4,指针 p指向数组 x。选项 A)中 *p是取数组首元素x0的值:选项 B)下标超出 范围:选项 C), p+1表示 x1的地址,因此 *(p+1)是取x1元素值;选项 D)中,数组名 x本身代表数组的首地址,因此 *x表示取元素 x0的值。 【知识模块】 函数和数组 16 【正确答案】 C 【试题解析】 在主函数的 for循环语句中,当循环变量 i的值等于 0, 2时,执行switch中的 case0语句,分别对数组元素 a0和 a2加 1和减
25、 1,所以 a0的值等于 3, a2等于 4。当循环变量 i的值等于 1, 3时,执行 switch中的 case1语句,把数组元素 a1和 a3的值赋 为 0。所以输出数组 a的元素,其结果为 3040。 【知识模块】 函数和数组 17 【正确答案】 B 【试题解析】 主函数中进行了两次 f函数的调用。第一次传递给形参数组 b的地址为元素 a2的地址, n接收数据位 5,因此数组 b中元素为 3, 2, 1, 6 7此时 flag的值为 0,进行由大到小排序,而数组 b和实参数组 a共用一段存储空间,第一次调用结束以后,数组 a的值为 5, 4, 7, 6, 3, 2 1, 8, 9, 10
26、。第二次调用 f函数,形参数组接收实参数组 a的首地址,取 5个元素,由小到大排序,调用结束以后,数组 a的值为 3, 4, 5, 6, 7, 2, 1, 8, 9, 10。 【知识模块】 函数和数组 18 【正确答案】 C 【试题解析】 当系统为所定义的数组在内存中开辟一串连续的存储单元时,这些存储单元中并没有确定的值,可以在定义语句中为所定义数组的各个元素赋初值。 数组初始化赋值是指在数组定义时给数组元素赋予初值。初始化赋值的一般形式为:类型说明符 数组名 常量表达式 =值,值, ,值 , ;。 需要注意的是当所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息,在指定初值时,第一个
27、初值必定赋给下标为 0的元素,然后按这些数值的排列顺序赋初值,只能给元素逐个赋值,不能给数组整体赋值。如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 【知识模块】 函数和数组 19 【正确答案】 D 【试题解析】 程序中循环部分的主要功能是,在字符串 b中寻找是否含有子串a,如果含有则退出,字符指针 D指向该匹配子串后面的位置,利用 printf函数输出则从该位置开始一直输出到字符串 b的结尾。 【知识模块】 函数和数组 20 【正确答案】 C 【试题解析】 本题考查多维数组和数组指针。 a是一个二维数组, p是一个指针数组,该数组有 3个元素,每个元素都是一个指向整型对象的指
28、针。选项 A)错误,等号的左边是一个数组地址,不是变量;选项 B)数据类型不匹配, p0是指向一个整型对象,而 a是一个二维数组首地址;选项 C)正确,是把元素 a12赋值给 p0;选项 D)和选项 B)一样属于数据类型不匹配, p1是指向一个整型对象。而 a是一个二维数组首地址。 【知识模块】 函数和数组 21 【正确答案】 D 【试题解析】 在选项 D)的数组定义中,赋值号左边定义了一个 2行 4列的二维数组,而 在右边定义了一个 3行 2列的二维数组。 【知识模块】 函数和数组 22 【正确答案】 D 【试题解析】 利用二重 for循环对二维数组 af44的主对角线上的元素 1, 6,2
29、, 1实现按列从大到小排序,所以数组 a44的值变为 6, 4, 3, 2, , 8,2, 5, 7, 3, 7, 1, 5, 4, 8, 6, 1,最后输出数组 a44第一行上的元素,所以输出结果为 6, 4, 3, 2。 【知识模块】 函数和数组 23 【正确答案】 D 【试题解析】 函数 fun()的作用是求 出二维数组 aN中每一行中的最大元素,所以在 main()函数中执行完 fun(x, y)后,数组 y中的元素为二维数组 xNN每一行的最大元素。 【知识模块】 函数和数组 24 【正确答案】 B 【试题解析】 对于选项 A)字符串中无法存放字符串结束标志 0,选项 C)每行仅仅存
30、放 5个字符,同样的不能存放字符串结束标志,选项 D)中指针变量 s没有实际的内存空间,无法存放输入的字符串。因此正确的选项为 B),相当于char*s; s=“ABCDE“,把字符串常量的首地址存放到指针变量中存储。 【知识模块】 函数和数组 25 【正确答案】 D 【试题解析】 C语言中没有运算符可以处理字符串,要调用 “string”库中的函数来处理字符串,其中 strlen函数主要测试字符串中实际字符的个数,比实际占用的内存至少要少一个。 Strcat(s1, s2涵数用于连接两个字符串,是把字符串 s2连接到 s1的后面。 【知识模块】 函数和数组 26 【正确答案】 A 【试题解析】 选项 A)是定义了字符数组 str3;并对其赋初值。选项 B)中语句str2=str1非法,字符数组不能直接赋 值。选项 C), D)和选项 B)一致。 【知识模块】 函数和数组 27 【正确答案】 C 【试题解析】 在主函数中的 for循环语句中,当 si的值不等于 0 9之间的数字时,结束循环语句的执行。由字符数组 s的初值可以得到 for循环语句执行了三次,所以变量 n的值等于 3。 【知识模块】 函数和数组 28 【正确答案】 B 【试题解析】 字符串常量是用一对双括号括起来的一串字符。它用字符数组来存放,不用一对大括号对括起来。 【知识模块】 函数和数组