1、2014年 3月国家二级( C语言)机试真题试卷及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)每一个结点有两个指针域的链表一定是非线性结构 ( B)所有结点的指针域都为非空的链表一定是非线性结构 ( C)循环链表是循环队列的链式存储结构 ( D)线性结构的存储结点也可以有多个指针 2 使用白盒测试方法时,设计测试用例应根据 ( )。 ( A)程序的内部逻辑 ( B)程序的复杂结构 ( C)程序的功能 ( D)使用说明书 3 在医院,每个医生只属于某一个诊疗科,医生同一 天可为多位患者看病,而一名患者可在多个科室治疗。则实体医生和患者之间的联系是 ( )。 ( A)多对多
2、( B)多对一 ( C)一对多 ( D)一对一 4 设序列长度为 n,在最坏情况下,时间复杂度为 O(log2n)的算法是 ( )。 ( A)二分法查找 ( B)顺序查找 ( C)分块查找 ( D)哈希查找 5 设数据集合为 D=1, 3, 5, 7, 9, D上的关系为 R,下列数据结构 B=(D, R)中为非线性结构的是 ( )。 ( A) R=(5, 1), (7, 9), (1, 7), (9, 3) ( B) R=(9, 7), (1, 3), (7, 1), (3, 5) ( C) R=(1, 9), (9, 7), (7, 5), (5, 3) ( D) R=(1, 3), (3
3、, 5), (5, 9) 6 深度为 7的二叉树共有 127个结点,则下列说法中错误的是 ( )。 ( A)该二叉树有一个度为 1的结点 ( B)该二叉树是满二叉树 ( C)该二叉树是完全二叉树 ( D)该二叉树有 64个叶子结点 7 二叉树的中序序列为 BDCA,后序序列为 DCBA,则前序序列为 ( )。 ( A) DCBA ( B) BDCA ( C) ABCD ( D) BADC 8 下面能作为软件需求分析工具的是 ( )。 ( A) PAD图 ( B)程序流程图 ( C)甘特图 ( D)数据流程图 (DFD图 ) 9 下面不属于对象主要特征的是 ( )。 ( A)唯一性 ( B)多态
4、性 ( C)可复用性 ( D)封装性 10 关系 R经过运算 A=B C 4 D 3(R)的结果为 ( )。 ( A) (c, c, 11, 4) ( B) (c, c, 11, 4) ( C) (a, a, 2, 4) ( D) (a, a, 2, 4)和 (e, e, 6, 1) 11 C语言整数不包括 ( )。 ( A)带小数点的整数 ( B)正整数 ( C)负整数 ( D)无符号整数 12 设 a, b, c是整型变量,且已正确赋初值,以下选项中错误的赋值语句是( )。 ( A) a=1 (b=c=2); ( B) a=(b=3)*c; ( C) a=b=c 10; ( D) a=2=
5、(b=9)=1; 13 以下选项中,合法的实数是 ( )。 ( A) 1 5E2 ( B) E1 1 ( C) 2 IOE ( D) 1 9E1 4 14 关于程序设计基本概念,以下叙述错误的是 ( )。 ( A)计算机 可以直接执行由任意高级语言编写的程序 ( B)高级语言都有与之对应的编译程序或解释程序 ( C)用任何一种计算机高级语言都可以把算法转换为程序 ( D)结构化算法可以解决任何复杂的问题 15 以下不能用于实型数据的运算符是 ( )。 ( A) ( B) ( C) * ( D) + 16 C语言中,最基本的数据类型包括 ( )。 ( A)整型、实型、逻辑型 ( B)整型、字符型
6、、数组 ( C)整型、实型、字符型 ( D)整型、实型、结构体 17 若有定义: int a=0, b=0, c=0, d=0;,有 C语言表达式 (a+&b+)?c+:d+,以下关于其执行顺序的叙述正确是 ( )。 ( A)先执行 a+,表达式 a+的值为 0,短路,得 a+,执行它 ( B)先执行 a+,表达式 a+的值为 0;再执行 b+,表达式 b+的值为 0,由此可确定 (a+&b+)值为 0,因此执行 d+ ( C)先执行 a+,表达式 a+的值为 1;再执行 b+,表达式 b+的值为 1,由此可确定 (a+&b+)值为 1,因此执行 c+ ( D)先执行 b+,表达式 b+的值为
7、 1;再执行 a+,表达式 a+的值 为 1,由此可确定 (a+&b+)值为 1,因此执行 c+ 18 有以下程序 #include main() char ch=B: while(ch E) printf(“ dt“, ch-A); ch+: printf(“ n“); 程序运行后的输出结果是 ( )。 ( A) 123 ( B) ABC ( C) abc ( D) 012 19 以下关于指针的叙述,错误的是 ( )。 ( A)两个基类型相同的指针变量不能指向同一个对象 ( B)可以通过对 指针变量自增、自减来移动指针 ( C)只有两个类型相同指针才能进行减运算 ( D)一个指针变量可以通过
8、不同的方式获得一个确定的地址值 20 对于函数声明 void fun(float array, int*ptr); 以下叙述正确的是 ( )。 ( A)调用函数时, array数组的元素和 ptr都是按值传送 ( B)函数声明有语法错误,参数 army缺少数组大小定义 ( C)函数声明有语法错误,参数 army缺少数组大小定义 ( D)函数参数 array, ptr都是指针变量 21 有以下程序 #include main() int i, k; int array42=1, 0, 0, 2, 9, 3; for(i=0; i 2; i+) for(k=0; k 3; k+) pfinff(“
9、 d, “, arrayki); pfinff(“ n“); 程序运行后的输出结果是 ( )。 ( A) 1, 0, 2, 0, 0, 9, ( B) 1, 2, 4, 9, 6, 0, ( C) 2, 9,0, 0, 1, 4, ( D) 1, 2, 0, 1, 4, 1, 22 要求定义一个具有 6个元素 的 int型一维数组,以下选项中错误的是 ( )。 ( A) int N=6, aN; ( B) int a2* 3=0; ( C) #define N 3 int aN+N; ( D) int a=1, 2, 3, 4, 5, 6; 23 有以下程序 #include t main()
10、 char b310, c; int i; for(i=0; i 2; i+)scanf(“ s“, bi); i=0; while(c=getehar()!= n)b2i+=c; b2i= 0;。 printf(“ s s s n“, b0, b1, b2); 执行时若输入以下字符串: Peach flower is pink 则输出结果是 ( )。 ( A) Peachflower is pink ( B) Peachflower is pink ( C) Peachtlowerispink ( D) Peach flower is pink 24 有以下程序 #include main(
11、) char w20, a510=“abcder“, “ghijkl“, “mnopq“, “rstuv“, “wxyz“; int i, j; for(i=0; i 5; i+) j=0; while(aij! 0)j+; Wi=aij-2; w5= 0; puts(w); 程序运行后的输出结果是 ( )。 ( A) agmrw ( B) ekpuy ( C) djotx ( D) flqvz 25 有以下程序 #include #include main() char name9=“c#line“; char*str=-name; printf(“ d, d, d, d n“, sizeo
12、f(name), strlen(name), sizeof(str),strlen(str); 程序运行后的输出结果是 ( )。 ( A) 9, 7, 4, 7 ( B) 8, 6, 9, 6 ( C) 8, 6, 3, 6 ( D) 10, 8, 5, 8 26 有以下程序 #include main() int password; char*p, old_str10=“wind“; scanf(“ d“, &password); p=old_str; while(*p) pilnff(“ c“, *p+password); p+; printf(“ n“); 程序运行时,从键盘输入 2,输
13、出结果是 ( )。 ( A) #y#k#p#f ( B) #wi#nd# ( C) xj#oe ( D) #2222# 27 若有定义: char*ps =“aa“, “bb“, “cc“, “dd“;,则以下叙述正确的是 ( )。 ( A) ps0是字符串 “aa“ ( B) *ps0是字符串 “aa“的首地址 ( C) ps0是字符串 “aa“的首地址 ( D) *ps0是字符串 “aa“ 28 若有定义: char*ps=“aa“, “bb“, “cc“, “dd“;,则以下叙述正确的是 ( )。 ( A) *ps0是字符 a ( B) *ps0是字符串 “aa“ ( C) ps0是字符
14、 a ( D) ps是字符串 “aa“ 29 以下合法的转义字符是 ( )。 ( A) 0X41 ( B) 0x41 ( C) X41 ( D) x41 30 在源程序的开始处加上 “#include“进行文件引用的原因,以下叙述正确的是 ( )。 ( A) stdio h文件中包含标准输入输出函数的函数说明,通过引用此文件以便能正确使用 pfinff、 scanf等函数 ( B)将 stdio h中标准输入输出函数链接到编译生成的可执行文件中,以便能正确运行 ( C)将 stdio h中标准输入输出函数的源程序插入到引用处,以便进行编译链接 ( D)将 stdio h中标准输入输出函数的源程
15、序插入到引用处,以 便进行编译链接 31 设有定义: int a10=0, 1, 2, 3, 4, 5, 6,7, 8, 9, *p=a, i;,若 0i9,则对 a数组元素的引用错误的是 ( )。 ( A) a10 ( B) *( ai) ( C) pi ( D) ap-a 32 有以下程序 #include main() int c, d; c=(13 1) 1; d=(13 1)1; printf(“ d, d n“, c, d); 程序运行后的输出结果是 ( )。 ( A) 6, 1 ( B) 1, 1 ( C) 7, 1 ( D) 7, 2 33 有以下程序 #include #in
16、clude struct S char name10; ; main() struct S sl, s2; strepy(s1 name, “XXX“); strepy(s2 name, “=“); s1=s2; printf(“ s n“, s1 name); 程序运行后的输出结果是 ( )。 ( A) = ( B) XXX ( C) =XX ( D) X= 34 有以 下程序 #include main() int i, array6=1, 5, 0, 4; for(i=0; i 5; i+) printf(“ d, “, arrayi 4); printf(“ n“); 程序运行后的输出
17、结果是 ( )。 ( A) 1, 2, 1, 2, 0 ( B) 1, 5, 0, 4, 0, ( C) 1, 5, 5, 4,0, ( D) 0, 4, 0, 4, 0, 35 有以下程序 nclude nelude void fun(int*s, int x23) *s=*(x1+1); main() int a23=1, 2, 3, 4, 5, 6, *p; p=(int*)malloc(sizeof(int); fun(&p, a); printf(“ d n“, *P); 程序的运行结果是 ( )。 ( A) 5 ( B) 2 ( C) 6 ( D) 3 36 有如下定义: stru
18、ct int num; char name10; gtruct int y; int m; int d; birth; s, *ps= s; 以下对内嵌结构体成员的引用形式错误的是 ( )。 ( A) ps- birth y ( B) s birth y ( C) ps birth y ( D) (*ps) birth: y 37 有以下程序 #include main() FILE*fp; int i, a6=1, 2, 3, 4, 5, 6, k; fp=fopen(“dat (a)dat“, “W+“); fpantf(fp, “ d n“, a0); for(i=1; i 6; i+)
19、 rewind(fp); fprintf(fp, “ d n“, ai); rewind(fp); fscanf(fp, “ d“, &k); fclose(fp); printS(“ d n“, k); 程序运行后的输出结果是 ( )。 ( A) 6 ( B) 21 ( C) 123456 ( D) 654321 38 以下程序段中,与其他三个功能不同的程序段是 ( )。 ( A) s=0; i=1; for(; )s+=i; i+; if(i =10)break; ( B) s=0, i=1; for(; i =10; )s+=i, i+; ( C) s=0; for(i=1; i =10
20、; i+)s+=i; ( D) for(s=0, i: 1; i =10; s+=i, i+); 39 设有定义: int a=0, b=1;,以下表达式中,会产生 “短路 “现象,致使变量 b的值不变的是 ( )。 ( A) +a+b ( B) a+b ( C) +a&b+ ( D) a+&b+ 40 关于地址和指针,以下说法正确的是 ( )。 ( A)通过强制类型转换可以将一种类型的指针变量赋值给另一种类型的指针变量 ( B)可以取一个 常数的地址赋值给同类型的指针变量 ( C)可以取一个表达式的地址赋值给同类型的指针变量 ( D)可以取一个指针变量的地址赋值给基类型相同的指针变量 二、程
21、序填空题 41 给定程序中,函数 fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #include typedef struct int Rum; char name10; PERSON; *found* void fun(PERSON【 1】 *found* 【 2】 temp; if(std0 Rum std1 num) temp=std0; std0=std1; std1=temp; if(std0 nu
22、m std2 hum) temp=std0; std0=std2; std2=temp; if(std1 num std2 1lum) temp=std1; std1=std2; std2=temp; main() PERSON std=5, “Zhanghu”, 2, “WangLi”, 6, “LinMin”; int i; *found* fun【 3】; printtf(“The result is”: ); for(i=0; i 3; i+) pfinff(“ d, s”, stdi hum, stdi name); 三、程序修改题 42 下列给定程序中函数胁的功能是:将 m(1m1
23、0)个字符串连接起来,组成一个新串,放人 pt所指存储区中。例如:把三个串 “abc”、 “CD”、 “EF”连接起来,结果是 “abcCDEF”。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include #include void fun(char six10, int m, char*pt) *found* Int k, q, i; for(k=0; k m; k+) q=strlen(sixk); for(i=0; i q; i+) *found* pti=strk, i; pt+=q; pt0=0
24、; main() int m, h; char s1010, P120; printf(“Please enter m: ”); scanf(“ d”, &m); gets(s0); printf(“Please enter d string: ”, m); for(h=0; h m; h+)gets(sh); fun(s, m, P); printf(“The result is: s”, p); 四、程序设计题 43 下列程序定义了 NN的二维数组,并在主函数中自动赋值。请编写函数 fun(int aN),该函数的功能是:将数组左下半三角元素中的值全部置成 0。例如 a数组中的值为: 19
25、7 238 456 则返回主程序后 a数组中的值应为: 097 008 000 注意:部分源程序给出如下。 请勿改动 main函数和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include #include #nclude #define N 5 void fun(int aN) void main() int aNN, i, j; system(“CLS“); printf(“*The array* n“); for(i=0; i N; i+) *产生一个随机的 5*5矩阵 * for(j=0; j N; j+) aij=rand() 10; pr
26、intf(“ 4d“, aiJ); printf(“ n“); fun(A); printf(“THE RESULT n“); for(i=0; i N; i+) for(j=0; j是 指程序可以在该文件中找到 printf, scanf等函数,因此答案为 A选项。 31 【正确答案】 A 【试题解析】 长度为 n的数组其各个元素的下标应该是从 0到 n-1,因此,长度为 10的数组 a,第 10个元素为 a9,而不是 a10,答案为 A选项。 32 【正确答案】 C 【试题解析】 表达式 c=(131) 1中, 是右移符号,数字 13换算成二进制后右移 1位,再和 1进行按位或运算,结果为
27、 7;表达式 d=(13 1)中,首先判断 13是否大于 1,此时条件成立返回 1后,再和 1进行或运算,结 果为 1,因此答案为C选项。 33 【正确答案】 A 【试题解析】 主函数首先为结构体定义两个变量 s1, s2,分别使用字符串拷贝函数 strcpy()为 s1和 s2的成员 name赋值,再将 s2中的成员信息赋值给 s1,因此输出为 “=”,答案为 A选项。 34 【正确答案】 D 【试题解析】 &表示与运算,主函数首先定义一个数组 array6,初始化前 4个元素的值,其余默认值为 0。在 for循环中,为数组 array中每一个元素换算成二进制数后和二进制整数 “100”进行
28、按位与运算,再将结果进行输出 ,因此答案为D选项。 35 【正确答案】 A 【试题解析】 manoc(size)函数作用是在内存的动态存储区分配一个长度为 size的连续空间,函数的返回值是新分配的存储区的首地址,将该地址赋值给 p指针,然后取 p指针的地址,调用 fun函数。 fun函数中对指向指针的指针 s指向的内存单元赋值,其中 x1表示二维数组 x的第二行的行地址, x1+1表示二维数组 x的第二行第二列的地址,所以 fun函数的功能是将二维数组 x的第二行第二列的值,即 x11赋值给 *s, * s, *s为 p,所以 *s代表 *p, x11与 a11等价,因此答案为 A选项。 3
29、6 【正确答案】 C 【试题解析】 使用结构体指针对结构体成员进行访问时,形式为结构指针名 -结构成员名,或者 (*结构指针名 )结构成员名,题目中 ps为结构体指针,因此判断 A选项引用形式错误,答案为 C选项。 37 【正确答案】 A 【试题解析】 本题首先定义文件指针变量 fp和一个数组 a,再打开一个文件“dat(a)dat”,随后先给文件写入数据 a0,由于 rewind函数是将文件指针从当前位置重新指向文件开始位置,所以 for循环依次将数组 a中的数据写入文件开始位置,退出循环后,文件中的数据顺序为: 654321,重新使指针指向文件开始位置,将此时 fp指向的数据 (即文件中第
30、一个数据 6)写入变量 k中,关闭文件,输出k值,答案为 A选项。 38 【正确答案】 A 【试题解析】 B, C, D选项都表示对 1到 10进行累加后赋给 s,而 A中含break语句,循环体只执行一次,结束整个循环过程,因此答案为 A选项。 39 【正确答案】 D 【试题解析】 +放在变量前面时,表示将变量 +1,再参与其他操作,a+&b+时,由于 a值是 0直接判定与运算结果为 0,忽视 b+的值,因此 b值不发生改变,答案为 D选项。 40 【正确答案】 A 【试题解析】 常数的地址存储在内存的常量区,常量区存储的都是常量,值都是不可修改的,所以直接取常量的地址赋给指针变量没有任何意
31、义, C语言也不允许这样做,编译会出错, B选项错误;表达式的值存储在临时变量中,内存中存在专门用来存储临时变量的区域,对这块地址进行操作也是没有意义的, C语言不允许这样做,编译会出错, C选项错误;可以取一个指针变量的地址,但是指针变量的地址属于指针,只能赋值给指针类型的 指针变量, D选项错误。故答案为 A选项。 二、程序填空题 41 【正确答案】 【 1】 std 【 2】 PERSON 【 3】 std 【试题解析】 本题考查:数据类型的定义;数组元素的操作;函数参数的传递。 要使用函数对整个数组进行操作时,应使用数组名作为函数的实参。当使用数组名作实参时,函数传递的实际上是数组的首
32、地址,而并非数组本身,此时形参除了可以定义为指针变量外,还可以定义为数组,并且数组可以不指定大小,但无论用哪种形式,程序在编译时都将其作为一个指针变量处理。 填空 1:定义形参变量引用数组 std,此时形参可以定义为指针变量,也可以定义为数组。由下文可知,程序是通过数组下标对数组元素进行操作的,因此形参应使用数组形式,而非指针形式。 填空 2:程序使用变量 temp交换结构体数组元素的值,因而 temp应定义为PERSON型。 填空 3:程序通过函数 fun对数组 std进行操作,因此函数的实参应为 std。 三、程序修改题 42 【正确答案】 (1)int k, q, i; (2)pti =
33、strki; 【试题解析】 本题考查: C语言的书写和语法性错误,这类错误比较简单,只要编译程序,根据错误提示修改即可。 (1)关键字书写错误,定义整型变量的关键字应使用 int,而非 Int。 (2)数组元素表示错误,表示二维数组元素,应使用方括号将行坐标和列坐标分别括起来,即 strk, i应改为: strki。 四、程序设计题 43 【正确答案】 void fun(int aN) int i, j; if(a=NULL)return: for(i=0; i N; i+) for(j=0; j =i; j+) aij=0; *将数组左下半三角元素中的值全部王成 0* 【试题解析】 本题考查: for循环语句,使用嵌套循环语句遍历二维数组的各个元素;二维数组元素的引用。 对于 NN二维数组,如何表示其左下半三角元素,可以通过以下语句实现。 for(i=0; i n; i+) for(j=0; j =i; j+) 外层循环用来控制矩阵的行下标,内层循环控制矩阵的列下标。注意列下标的取值范围,因为要表示下三角元素,所以 j的 范围是 0 i。