1、国家二级( C语言)机试模拟试卷 93及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)算法的空间复杂度与算法所处理的数据存储空间有关 ( B)算法的空间复杂度是指算法程序控制结构的复杂程度 ( C)算法的空间复杂度是指算法程序中指令的条数 ( D)压缩数据存储空间不会降低算法的空间复杂度 2 下列各组排序法中,最坏情况下比较次数相同的是 ( )。 ( A)希尔排序与堆排序 ( B)简单插入排序与希尔排序 ( C)简单选择排序与堆排序 ( D)冒泡排序与快速排序 3 设栈 的存储空间为 S(1: 50),初始状态为 top=51。现经过一系列正常的入栈与退栈操作后, top=
2、20,则栈中的元素个数为 ( )。 ( A) 31 ( B) 30 ( C) 21 ( D) 20 4 某二叉树共有 400个结点,其中有 100个度为 1的结点,则该二叉树中的叶子结点数为 ( )。 ( A) 149 ( B) 150 ( C) 151 ( D)不存在这样的二叉树 5 下面属于 “类一对象 ”主要特征的是 ( )。 ( A)对象一致性 ( B)对象无关性 ( C)类的多态性 ( D)类的依赖性 6 下面不属于需求分析阶段工作的是 ( )。 ( A)需求获取 ( B)可行性研究 ( C)需求分析 ( D)撰写软件需求规格说明书 7 软件生命周期是指 ( )。 ( A)软件的需求
3、分析、设计与实现 ( B)软件的开发与管理 ( C)软件的实现和维护 ( D)软件产品从提出、实现、使用维护到停止使用退役的过程 8 在数据库的三级模式结构中,描述数据库中全体数据的全局逻辑结构和特征的是( )。 ( A)内模式 ( B)用户模式 ( C)外模式 ( D)概念模式 9 大学中每个年级有 多个班,每个班有多名学生,则实体班级和实体学生之间的联系是 ( )。 ( A)一对多 ( B)一对一 ( C)多对一 ( D)多对多 10 有 3个关系 R、 S和 T如下:则由关系 R、 S得到关系 T的操作是 ( )。 ( A)交 ( B)投影 ( C)自然连接 ( D)并 11 以下选项中
4、,合法的 C语言常量是 ( )。 ( A) 1 234 ( B) C+ ( C) “ 2 0 ( D) 2Kb 12 有以下程序: #include main() int s, t, A=10; double B: 6: s=sizeof(A) t=sizeof(B): printf(“ d, (1 n”, s, t); 在 VC6平台上编译运行,程序运行后的输出结果是 ( )。 ( A) 4, 8 ( B) 4, 4 ( C) 2, 4 ( D) 10, 6 13 关于程序模块化,以下叙述错误的是 ( )。 ( A)程序模块化可以提高程序运行的效率 ( B)程序模块化可以提高程序编制的效率
5、( C)程序模块化可以提高程序代码复用率 ( D)程序模块化可以提高 调试程序的效率 14 以下选项中不能在 C语言程序中用作用户标识符的是 ( )。 ( A) auto ( B) scanf ( C) Float ( D) _3_14 15 设有语句: printi(“ 2(1 n”, 2010);,则以下叙述正确的是 ( )。 ( A)程序运行时输出 2010 ( B)程序运行时输 20 ( C)程序运行时输出 10 ( D)指定的输出宽度不够,编译出错 16 以下不属于 C语言整型常量的是 ( )。 ( A) 0L ( B) -018 ( C) 0Xa ( D) 200U 17 有以下程
6、序: #include main() int x=1, y=0; if(!x)y+; else if(x=0) if(x)y+=2; else y+=3: printf(“ d n”, y); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 2 ( C) 0 ( D) 3 18 若变量已正确定义,在 if(w)printf(“ d n”, k);中,以下不可替代 w的是( )。 ( A) a0)a*=x; break; if(X,则输出结果是 ( )。 ( A) 1, 2 ( B) 2, 2 ( C)一 1, 1 ( D)一 2, 1 23 有以下程序: #include #defi
7、ne N 4 void fun(int aN, int b) int i; for(i=0; i main() int X32=0, i; for(i=0; i,则输出结果为 ( )。 ( A) 2 4 6 ( B) 2 0 0 ( C) 2 4 0 ( D) 2 0 4 25 有以下程序: #include int ml(int x, int y) if(x void f(int); main() void f(int); f(5); void f(int n) prinff(“ d n”, n); 以下叙述中错误的是 ( )。 ( A) f函数中不可以出现 return语句 ( B)在主函
8、数中, f(5);可以正确调用 f函数 ( C)在主函数后的其他函数可以正确调用 f函数 ( D) f函数无返回值,应当定义成 void类型 27 有以下程序: #inelude main() int i=3, j=5, *p=p=&i, *q=&j, *r; r=&q; prinff(“ d, d, d, d, d n”, i, j, *p, *q, *r); 执行后的输出结果是 ( )。 ( A) 3, 5, 3, 5, 5 ( B) 5, 3, 5, 3, 5 ( C) 3, 5, 3, 5, 3 ( D) 3, 5, 3, 3, 5 28 以下不能使指针 s所指存储单元的值增 1的选项
9、是 ( )。 ( A) (*s)+; ( B) *s=as+1; ( C) as+; ( D) +*s; 29 以下语句中存在语法错误的是 ( )。 ( A) char ss620; ss1=“right?”; ( B) char ss20=“right?”; ( C) char*ss6; ss1=“right?”; ( D) char*ss=“right?”; 30 有以下程序: #include int fun() static int x=1; x*=2: return x; main() int i, s=1; for(i=1; i main() char *s=“abe”; do p
10、rintf(“ d”, *s 10); +s; while(*s); 程序运行后的输出结果是 ( )。 ( A) abe ( B) 789 ( C) 7890 ( D) 979899 32 有以下程序: #include #include main() int i, len; char b=“Welcome you to Beijing!”; len: strlen(b); for(i=0; i double fun(int 13) static double f=1; f*=n: retum f; main() int i; double s=0; for(i=1; i main() FIL
11、E*fp; int a10=1, 2, 3, i, n; fp=fopen(“d1 dat”, “w”); for(i=0; i #define MULl(x, y)x*y #define MUL2(x, y)(x)*(y) #define MUL3(x, y)(x*y) main() int m=2, n=3; print(“ d, d, d n”, MULl(m, m+n)*2, MUL2(m, m+n)*2,MUL3(m, m+n)*2); 程序运行后的输出结果是 ( )。 ( A) 10, 20, 14 ( B) 20, 20, 20 ( C) 10, 10, 10 ( D) 14,
12、14, 14 38 有以下程序: #include void fun(int a) if(a1)fun(a一 1); printf(“ d”, a); main() int q=5; fun(q); prinff(“ n”); 执行后的输出结果是 ( )。 ( A) 1 2 3 4 5 ( B) 5 4 3 2 1 ( C) 0 1 2 3 4 5 ( D) 5 4 3 2 1 0 39 以下关于 C语言文件的叙述中正确的是 ( )。 ( A)文件由数据序列组成,其类型可以为二进制文件或文本文件 ( B)文件由记录序列组成,其类型可以为二进制文件或文本文件 ( C)文件由字符序列组成,其类型可
13、以为二进制文件或文本文件 ( D)文件由数据序列组成,其类型只能是二进制文件 40 设有定义和语句 (假设 short int型数据占 2字节 ) short int*pi, *pj; pi=pJ=(short*)malloe(2); 则以下叙述正确的是 ( )。 ( A) pi和 pj指向了同一个 short int型存储单元 ( B) pi和 pj指向了 2个连续的 short int型存储单元的首地址 ( C) pi和 pj分别指向了一个 short int型存储单元 ( D) pi和 pj分别指向了 2个 short int型存储单元 二、程序填空题 41 下列给定程序中,甬数 fun
14、的功能是:把形参 a所指数组中的最小值放在元素a0中,接着把 a所指数组中的最大值放在 a1元素中;再把 a所 指数组元素中的次小值放在 a2中,把 a所指数组元素中的次大值放在 a3,以此类推。例如,若a所指数组中的数据最初排列为: 9、 1、 4、 2、 3、 6、 5、 8、 7;则按规则移动后,数据排列为: 1、 9、 2、 8、 3、 7、 4、 6、 5。形参 n中存放 a所指数组中数据的个数。 规定 fun函数中的 max存放当前所找的最大值, px存放当前所找最大值的下标。 请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLAN
15、KLC中。 不得增行或删行,也不得更改程序的结构 ! #include #define N 9 void fun(int a, int n) int i, j, max, min, px, pn, t; for(i=0; i3) min=aj; pn=j; if(pn!=i) t=ai; ai=min; apn=t; if(px=i)px=pn; if(px!=i+1) t=ai+1; ai+1=max; apx=t; main() int bN=9, 1, 4, 2, 3, 6, 5, 8, 7, i; printf(“ nThe original data: n”); for(i=0; i
16、 typedef struet list int data; struct list*next: LIST; int fun(UST* h) LIST*P; *found* int t; P=h; *found* while(*P) *found* t=t+P data: P=(*P) next; return t; main() LIST a, b, c, *h; adata=34; b data: 51; c data=87; c next=, 0: h=&a; A)next=&b; b next=&c: printf(“总和 = d n”, fun(h); 四、程序设计题 43 编写函数
17、 fun,其功能是:实现两个字符串的连接 (不要使用库函数 strcat),即把 p2所指的字符串连接到 p1所指的字符串的后面。 例如,分别输入下面两个字符串: FirstString SecondString 程序运行后的输出结果是: FirstStringSecondString 注意:部分源程序在 文件 PROG1 C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun(char p1, char p2) main() char sl80, s240; void NONO(); prinff(“Ent
18、er s1 and s2: n”); scanf(“ 8 S”, s1, s2); prinff(“s1= s n”, s1); prinff(“s2= s n”, s2); prinff(“Invoke fun(s1, s2): n”); fun(s1, s2); prinff(“After invoking: n”); prinff(“ s n”, s1); NONO(); void NONO() *c本函数用于打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * int i; FILE*rf, *wf; char s180, s2140; rf=fopen(“in dat”
19、, “r”); wf=fopen(“out dat”, “W”); for(i=0; i0,所以返回值为 1;即第一轮循环后, tl=3, t2=1。当 i_2时,传入函数 m1的参数为 2、3,因为 21,所以函数返回值为 2;即第二轮循环后, t1=5, t2=2;当 i=3时,传入函数ml的参数为 3、 5,因为 32,所以返回值为 3;即第三轮循环后, tl=7, t2=3;当 i=4时,传入函数 m1的参数为 4、 7,因为 43,所以函数返回值为 4,即第四轮循环后, t1=9, t2=4。故答案选 A(仔细分析可以发现,对于 m1函数,由于第一次 10,导致后面每次参数 x都是
20、i,而 y都是 i一 1,返回值都是 i,所以最终结果为 t1=24+1, t 2=4)。 26 【正确答案】 A 【试题解析】 函数说明可以放在调用函数内,如在 main函数内部进行说明,则只能在 main函数内部才能识别此函数。所以在 main函数中, f(5)可以被正确调用,故选项 B正确;由于在 main()函数之前也说明了 f()函数,所以在 main函数后的其他函数也可以正确调用 f()函数,故选项 C正确; f()函数没有返回值,应该定义成 void类型,故选项 D正确;虽 然 f()函数没有返回值,为了在函数体的任意地方退出,可以使用 return语句,只是 return后不用
21、加返回值,故选项 A错误,因此答案为 A。 27 【正确答案】 A 【试题解析】 main()函数中初始化 i的值为 3, j的值为 5,并初始化指针 p指向i,指针 q指向 j。另外,还定义了一个二维指针 r,指向 q,所以 *p的值是 i的值3, *q的值是 j的值 5, *r等于 *q,是 j的值 5,所以输出的结果是: 3、 5、 3、5、 5,答案选 A。 28 【正确答案】 C 【试题解析】 选项 A首先获取 s指向的存储单元的 值,使用完该值后,将该值自增 1,正确;选项 B首先获取 s指向的存储单元的值,并将该值加 l后重新赋给该存储单元,正确;选项 D首先获取 s指向的存储单
22、元的值,然后将该值自增 1,再使用加 1后的新值,正确;选项 C中, *s+的含义是首先获取 s指向的存储单元的值,然后再将指针 s向后移动一位,所以答案为 C。 29 【正确答案】 A 30 【正确答案】 D 31 【正确答案】 B 32 【正确答案】 A 【试题解析】 strcpy(char*dest, char*source)函数是将 source指指向的 字符串复制到 dest指向的内存空间,所以 for循环在遍历字符数组 b的同时,查找 b中的空格字符,将空格字符后的剩余字符串重新复制到字符数组 b中,然后重新设置循环的索引下标为 0,继续寻找空格字符,直到到达字符串的结尾空字符 0
23、,由此可知整个程序是获取字符串 “Welcomeyou t0 Beijing!”的最后一个不包含空格字符的子串,程序输出: “Beijing!”,答案选 A。 33 【正确答案】 A 【试题解析】 两个字符串进行比较时,按照字符串中相同位置的字符 ASCII码顺序进行比较,故选项 B错 误;字符串需要包含串尾的结束标志,但是计算字符串长度时,不包含串尾的结束标志,故选项 C错误;要将字符串 s2连接到 s1后面,串 s1所在存储空间必须可以存储字符串 s1、字符串 s2连接后构成新串的字符,故选项 D错误。答案选 A。 34 【正确答案】 A 【试题解析】 函数 fun()中的变量 f是静态变
24、量,所以只初始化一次,之后每次调用 fun(), f的初值就是上一次 fun()结束时的值,对于 fun()函数,当传入 n=1时, f=1,返回值为 1;当传入 n=2时, f=12=2,返回值为 2;当传入 n=3时,f=23=6,返回值为 6;当传入 n=4时, f=64=24,返同值为 24,所以每次调用fun函数时, f变量在上一次 fun函数运行结束时保留值的基础上,再与 n乘积,并重新赋值给 f,所以可以将 f理解为记录当前的累乘值,即当 main函数中 i=1时, f=1!=1;当 main()函数 i=2时, f=2!=2,当 main函数中 i=3时, f=3!=6 另外
25、main函数中的 s记录调用 fun函数的返回值之和,所以 s=1 !+2 !+i! ,由于 i最大值为 5,所以 s=1!+2!+3!+4!+5 !,答案为 A。 35 【正确答案 】 A 36 【正确答案】 A 37 【正确答案】 A 【试题解析】 本题考查宏定义,宏定义在程序的预编译阶段直接进行文本替换,所以本题中宏定义展开如下: MULl(m, m+n)x2=mm+n2=22+32=10 MUL2(m, m+n)2=(m)(m+n)2=2(2+3)2=20 MUIL3(m, m+n)2=(mm+n)2=(22+3)2=14 程序输出结果为 10, 20, 14答案为 A。 (注:宏定义
26、中的形参一定要使用小括号括起来,以避免 出错 ) 38 【正确答案】 A 【试题解析】 本题考查递归函数。函数 fun(a)在 a1时,递归调用。 fun(a1),否则输出 a的值,由于 prinff()函数在递归调用之后,所以直到递归函数运行完后再执行 printf()函数,所以 fun(5)中首先递归调用 fun(4),再递归调用 fun(3)、fun(2), fun(1),最后当 a=1时,输出 1,接着输出 2、 3、 4、 5,所以输出结果为: 1 2 3 4 5,答案为 A。 39 【正确答案】 A 【试题解析】 C语言文件是指一组相关数据的有序集 合,从文件编码的方式看,文件可分
27、为 ASCII码文件和二进制文件两种,其中 ASCII文件也称为文本文件,所以文件由数据序列组成,类型可以为二进制文件或文本文件,故选项 A正确。 40 【正确答案】 A 【试题解析】 语句 pi=pj=(short*)malloc(2)首先使用动态分配函数 malloc分配 2个字节的内存空间,然后将内存首地址转换为 short*类型并返回,赋值给 pj,再将 pj的值赋给 pi,所以指针 pi和 pj的值是相同的,指向同一个 short int型的存储单元,故选项 A正确。 二、程序填空 题 41 【正确答案】 (1)ai(2)aj(3)aj 三、程序修改题 42 【正确答案】 (1)int t=0; (2)while(p)或 while(p!=NULL) (3)t=t+p-data。 四、程序设计题 43 【正确答案】 void fun(char pl, char p2) int i, j; for(i=0; pli!= 0; i+); for(j=0; p2j!= 0; j+)p1i+=p2j; pli= 0;