1、国家二级( C语言)笔试模拟试卷 267 及答案与解析 1 下列关于栈和队列的描述中,正确的是 ( )。 ( A)栈是先进先出 ( B)队列是先进后出 ( C)队列允许在队头删除元素 ( D)栈在栈顶删除元素 2 以下只有在使用时才为该类型变量分配内存的存储类型说明是 ( )。 ( A) auto和 static ( B) auto和 register ( C) register和 static ( D) extern和 register 3 设有下列二叉树: 对此二叉树后序遍历的结果为 ( A) ABCDEF ( B) BDAECF ( C) ABDCEF ( D) DBEFCA 4 在数据
2、库的两级映射中,从概念模式到内模式的映射一般由 _实现。 ( A)数据库系统 ( B)数据库管理系统 ( C)数据库管理员 ( D)数据库操作系统 5 下列选项中不属于算法的特性的是 ( A)确定性 ( B)可行性 ( C)有输出 ( D)无穷性 6 下列叙述中正确的是 _。 ( A)线性表是线性结构 ( B)栈与队列是非线性结构 ( C)线性链表是非线性结构 ( D)二叉树是线性结构 7 字长为 16位的计算机是指 _。 ( A)该计算机能够处理的最大数不超过 16 ( B)该计算机中的 CPU可以同时处理 16位的二进制信息 ( C)该计算机的内存量为 16MB ( D)该计算机每秒钟所能
3、执行的指令条数为 16MIPS 8 在面向对象的程序设计中,能表示类之间相似性质的机制是 ( )。 ( A)继承 ( B)封装 ( C)分类 ( D)动态连接 9 下列叙述中正确的是 ( )。 ( A)在模块化程序设计中,一个模块应尽量多的包括与其他模块联系的信息 ( B)在自顶向下、逐步细化的设计过程中,首 先应设计解决问题的每一个细节 ( C)在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则 ( D)在程序设计过程中,不能同时采用结构化程序设计方法与模块化程序设计方法 10 下列不属于软件工程的 3个要素的是 ( )。 ( A)工具 ( B)过程 ( C)方法 ( D)环境 1
4、1 为了避免在嵌套的条件语句 ifelse中产生二义性, C语言规定, else子句总是与( )配对。 ( A)缩排位置相同 if ( B)其前面最近的 if ( C)其后面最近的 if ( D)同一行上的 if 12 以下叙述中正确的是 ( A)用 C程序实现的算法必须要有输入和输出操作 ( B)用 C程序实现的算法可以没有输出但必须要有输入 ( C)用 C程序实现的算法可以没有输入但必须要有输出 ( D)用 C程序实现的算法可以既没有输入也没有输出 13 下列关于软件测试的目的和准则的叙述中,正确的是 ( )。 ( A)软件测试是证明软件没有错误 ( B)主要目的是发现程序中的错误 ( C
5、)主要目的是确定程序中错误的位置 ( D)测试最好由程序员自己来检查自己的程序 14 下列程序的运 行结果是 #include “stdio.h“ main() int x=-9,y=5,z=8; if(x main( ) int C=O, k; for (k=1; k ( B) x=12,y=34,z=45 ( C) x=12C,sumy=34,z=45 ( D) x=12 ,sum y=34,line z=45 31 有如下程序: #define N2 #define MN+1 #define NUM2*M+1 main() int i; for(i=1; i =NUM; i+)print
6、f(“%dn“, i); 该程序中的 for循环执行的次数是 ( A) 5 ( B) 6 ( C) 7 ( D) 8 32 若有如下程序: sub(int * t, int n) int *p1, *p2; for(p1=t, p2 t; p1-t n; p1+) if(*p1 *p2) p2 p1; return(*p2); main() int a9 9, 36,19, 39, 26, 5, 6, 33, 15; printf(“%dn“, sub(a, 9); 则程序运行后的输出结果是 ( ) ( A) 5 ( B) 9 ( C) 15 ( D) 39 33 下列描述说明正确的是 ( )
7、 ( A)定义结构体时,它的每个成员的数据类型可以不同 ( B)不同结构体的成员名不能相同 ( C)结构体定义时,其成员的数据类型不能是结构体本身 ( D)结构体定义时各成员项之间可用分号也可用逗号隔开 34 下面函数的功能是 ( ) sss(s, t) char *s, *t; while(*s) ( D) putchar(ch); 36 以下程序的输出结果是 _。 main() int i,a10; for(i=9;i =0;i-)ai=10-i; printf(“%d%d%d“,a2a5,a8); ( A) 258 ( B) 741 ( C) 852 ( D) 369 37 定义 int
8、*swap()的是 _。 ( A)一个返回整型值的函数 swap() ( B)一个返回指向整型值指针的函数 swap() ( C)一个指向函数 swap()的指针,函数返回一个整型值 ( D)以上说法均错 38 若有以下定义: int a 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, * p a; 则值为 3的表达式是 ( ) ( A) p+ 2, * (pd+ +) ( B) p+ 2, * + +p ( C) p+ 3, * p+ + ( D) p + 2, + + * p 39 下列字符数组初始化语句中,不正确的是 ( )。 ( A) char c=goodmoming;
9、 ( B) char c20=“goodmorning“; ( C) char c=a, b, c, d; ( D) char c=“goodmoming“; 40 有以下程序 #include stdio.h void WriteStr(char*fn,char*str) FILE*fp; fp=fopen(fn“w“);fputs(str, fp); fclose(fp); main() WriteStr(“t1.dat“start“); WriteStr(“t1, dat“,“end“); 程序运行后 ,文件 t1.dat中的内容是 _。 ( A) start ( B) end ( C)
10、 startend ( D) endrt 41 以下选项中,当 x为大于 1的奇数时,值为 0的表达式是 ( A) x%2=1 ( B) x/2 ( C) x%2!=0 ( D) x%2=0 42 测试的目的是暴露错误,评价程序的可靠性;而【 】的目的是发现错误的位置并改正错误。 43 在面向对象方法中 ,属性与操作相似的一组对象称为【 】。 44 软件生命周期分为软件定义期、软件开发期和软件维护期,详细设计属于_中的一个阶段。 45 Jackson结构化程序设计方法是英国的 M.Jackson提出的,它是一种面向【 】的设计方法。 46 在算法正确的前提下,评价一个算法的两个标准是空间复杂度
11、和 ( )。 47 函数 fun的功能是计算 xn。 double fun(double x,int n) int i; double y=1; for(i=1;i =n;i+) y=y*x; return y; 主函数中已经正确定义变量 m, a, b并赋值,要调用函数 fun计算: m=a4+b4-(a+b)3。实现这一计算的函数调用语句为【 】。 48 若有定义 int m=5,y=2,则执行表达式 y+=y-=m*=y后, y的值为【 】。 49 已有定义如下: struct node int data; struct node *next; *p; 以下语句调用 malloc函数,使
12、指针 p指向一个具有 struct node类型的动态存储空间。请填空。 p=(struct node *)malloc(【 】 ); 50 若有以下程序: main() int a=4, b=3, c=5, t=0; if(a b) t=a; a=b; b=t; if(a c) t=a; a=c; c=t; printf(“%d%d%dn“,a,b,C); 执行后输出结果是【 】。 51 设有如下变量说明,则 a+(int)(int)b+c) (int)(b-c)的值为【 】。 int a=5;float b=7.2,c=3.6; 52 已知字符 A的 ASCII代码值为 65,以下程序运行
13、时若从键盘输入: B33回车,则输出结果是 【 】。 #include stdio h main() char a, b; a=getchar(); scanf(“%d“,b=b*2; printf(“%c%cn“,a,b); 53 下列程序的功能是将字符串 s中所有的字符 c删除。请填空。 #include stdio.h main() char s80; int i,j; gets(s); for(i=j=0;si !=0;i+) if(si!=c)_; sj=O; puts(s); 54 下列程序的输出结果是 _。 main() int a= 31,27,20,12,6,1,*p=a;
14、p+; printf(“%dn“,*(p+2); 55 有以下定义和语句,则 sizeof(a)的值是 【 】 ,而 sizeof(a.share)的值是 【 】 。 struct date int day; int mouth; int year; union int share1; float share2; share; a; 56 下面函数要求计算两个整数 x, y之和,并通过形参返回该值,请填空。 add(int x, int y,【 】 z) 【 】 =x+y; 国家二级( C语言)笔试模拟试卷 267 答案与解析 1 【正确答案】 D 【试题解析】 栈实际也是线性表,只不过是一种
15、特殊的线性表。栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除的这端为栈顶,另一端为栈底。队列是只允许在一端删除, 在另一端插入的顺序表,允许删除的一端叫做队头,允许插入的一端叫做队尾。 2 【正确答案】 B 【试题解析】 在用静态 static与外部 extern 定义变量时,系统立刻给其分配内存,而定义自动类 auto与强制放入寄存器 register类型变量时,只有当使用时才分配内存。 3 【正确答案】 D 【试题解析】 二叉树的遍历分为先序、中序、后序三种不同方式本题要求后序遍历,其遍历顺序应该为:后序遍历左子树 -后序遍历右子树 -访问根结点。按照定义,后序遍历序列是
16、DBEPCA,故答案为 D。 4 【正确答案】 B 【试题解析】 从概念模式到内模式的映射一般数据库管理系统 (DBMS)实现。 5 【正确答案】 D 【试题解析】 一个算法必须具有五个特性,即有穷性、确定性、可行性,有输入、有输出其中有穷性是指算法必须总是在执行完有穷步之后结束,而且每步都在有穷时间内完成。 D选项不是算法的特性。 6 【正确答案】 A 【试题解析】 一般将数据结构分为两大类型:线性结构与非线形结构。线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。 7 【正确答案】 B 【试题解析】 字长是指 CPU可以同时处理二进制的位数,是由 CPU的型号和类型决定的。 8
17、 【正确答案】 A 【试题解析】 在面向对象的程序设计中,继承是表示类之间相似性的机制。 9 【正确答案】 C 【试题解析】 模块化设计要求分解大程序,使每个模块都能易于理解,各模块的功能尽量单一,各模块之间的联系尽量少,选项 A错误:在自顶向下、逐步细化的设计过程中,是按照先全局后局部、先整体后细节、先抽象后具体的方法设计程序,选项 B 错误;在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则, 所以,在程序设计过程中,结构化程序设计方法与模块化程序设计方法是要同时采用的,选项 D错误。 10 【正确答案】 D 【试题解析】 软件工程包括 3个要素,即方法、工具和过程。方法是完成软
18、件工程项目的技术手段:工具支持软件的开发、管理和文档生成;过程支持软件开发的各个环节的控制、管理。 11 【正确答案】 B 【试题解析】 本题考查 if else语句。 C语言规定, else总是与它前面的最近的 if配对。 12 【正确答案】 C 【试题解析】 算法具有的 5个特性是:有穷性;确定性; 可行性;有 0个或多个输入;有一个或多个输出。所以说,用 C程序实现的算法可以没有输入但必须要有输出。 13 【正确答案】 B 【试题解析】 软件侧试的目的: 软件测试是为了发现错误而执行程序的过程; 一个好的测试用例能够发现至今尚未发现的错误; 一个成功的测试是发现了至今尚未发现的错误。软件
19、侧试的准则: 所有测试都应追溯到需求; 严格执行测试计划,排除测试的随意性; 充分注意测试中的群集现象; 程序员应避免检查自己的程序; 穷举测试不可能; 妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护 提供方便。 14 【正确答案】 D 【试题解析】 if卐 lse语句的执行过程如下 ,首先计算 if 后面一对圆括号内表达式的值 ,若表达式的值为非 0,执行 if子句 ,然后跳过 else子句 ,去执行 if 语句后的下一条语句 ;若表达式的值为 0,跳过 if子句 ,去执行 else子句 ,接着去执行 if语句后的下一条语句。 C语言的语法规定 ,else子句总是与前面最近的不带
20、 else的 if匹配 ,与书写格式无关 ,本题目的后一个 if-else相当于嵌套在第一个 if子句里 ,相当于x=0时 ,z=z+1。 15 【正确答案】 C 【试题解析】 算法具有的 5个特性是 :有穷性 ;确定性 ;可行性 ;有 0个或多个输入 ;有一个或多个输出。所以说 ,用 C程序实现的算法可以没有输入但必须要有输出。 16 【正确答案】 C 【试题解析】 C程序总是从 main 函数开始执行,但 main 函数在程序中的位置可以是任意的。 17 【正确答案】 D 【试题解析】 f格式符,用来输出实数,以小数形式式输出。 “%-m.nf”的含义是:输出数据共占 m列,其中 n位小数
21、,如果输出位数小于 m,则右端补空恪。如果总长度 大于列数,则按实际情况四舍五入输出。 18 【正确答案】 B 【试题解析】 “%”是求余运算符,所以 if判断语句中实际是指出只有当 y可以被3整除时方可以继续; -y是先进行 y的自减运算,再使用 y值。所以,最后的打印结果应当为 “852”。 19 【正确答案】 B 【试题解析】 C语言规定,标识符是由字母、数字或下画线组成,并且它的第一个字符必须是字母或者下画线。 20 【正确答案】 A 【试题解析】 第一次循环时, k=1,在 switch 语句中,先执行 default后面的语句,即 c=c+k=1,因为没有 break 语句,所以不
22、会跳出 switch 结构,会接着执行case2后面的语句,即 c=c+1=2,然后跳出 switch;第二次循环时, k=2,直接执行 case2后面的语句,即 c=c+1=3,然后跳出 switch 语句,结束循环,执行输出语句。 21 【正确答案】 A 【试题解析】 当 A=1时,( A=1) |( A!=1)为真;当 A!=1时,( A=1) |( A!=1)也为真,故正确答案为 A。 22 【正确答案】 A 【试题解析】 循环开始前,指针 t和 s都指向字符串的 起始位置,然后通过while循环判断 t指向的位置是否为空,同时让 t向右移动一位。 while循环结束时, t自减 1,
23、此时 t指向的位置是字符串的结束标志, 0,处,故 t-s的值是字符串的长度,并不包括结束标志。 23 【正确答案】 C 【试题解析】 求余运算符 “%”两边的运算对象必须是整型;而选项 B)和 D)中“%”两边的运算对象有浮点整数据,所以选项 B)和 D)是错误的表达式。在选项 A)中赋值表达式的两边出现相同的变量 x,也是错误的;选项 C)是一个逗号表达式,所以正确答案为 C)。 24 【正确答案 】 B 25 【正确答案】 B 【试题解析】 指针中存放的是变量的地址,指针也可以进行增减运算,这时指针移动的最小单位是 个存储单元,而不是一个字节。 26 【正确答案】 B 【试题解析】 本题
24、对共用体的使用进行了考查。由于共用体所有成员共同占据一段存储空间 ,所以对成员变量的赋值 ,后面的赋值会覆盖掉前面的赋值 ,因为s.income=1000;是最后一次成员变量赋值 ,变量 age与变量 income 共同占据一段存储空间 ,所以 age的值也为 1000。 27 【正确答案】 C 【试题解析 】 本题考查函数的形参和实参的关系。函数 sub将实参 x的值传给形参 y, y值的改变不能使 x的值发生改变,所以输出的 x值始终为 0。 28 【正确答案】 C 【试题解析】 在本题运行时主要注意的是当 i=9时, ai=10-9=1: i=8时,ai=10-8=2; i=7 时, a
25、i=10-7=3; 依此类推,直到 i=0时, ai=10-0=10:此时, i的值已变为 -1,判断 for的循环条件,不成立,然后输出 a2, a5, a8分别为 8, 5, 2。 29 【正确答案】 D 【试题解析 】 执行第 1次循环体, y-使得 y=9,然后 y减 l后判断条件为真,此时 y=8。继续执行 4次循环,直到 y=0时条件为假退出循环,然后输出 y=0后再减1。因此输出的结果为 0。 30 【正确答案】 D 【试题解析】 若在 scarf 的格式化控制串中插入了其他字符,则在输入时要求按一一对应的位置原样输入这些字符。格式化输入函数必须严格按照双引号里面的格式进行输入。
26、在格式化输出函数中,格式控制串中除了合法的格式说明外,可以包含任意的合法字符。 31 【正确答案】 B 【试题解析】 该题目测试考生对宏 替换的理解。这是一种简单的情况:不带参数的宏。关键要注意在对 2*M+1进行宏替换时,要将宏名 M原封不动地代进去,得到 NUM的形式为 2*N+1+1(千万不要随意给 N+1加上小括号,使 NUM变为2。 (N+1)+ 1,这就是宏名和变量名之间的区别 ),在将 N代进去,得到 NUM的值为 6。 32 【正确答案】 A 33 【正确答案】 A 34 【正确答案】 B 35 【正确答案】 C 36 【正确答案】 C 【试题解析】 在本题运行时主要注意的是当
27、 i=9时, ai=10-9=1; i=8时,ai=10-8=2;i=7时, ai=10-7=3; 依此类推,直到 i=0时, ai=10-0=10;此时, i的值已变为 -1,判断 for的循环条件,不成立,然后输出 a2, a5,a8,分别为 8, 5, 2。 37 【正确答案】 B 【试题解析】 一个函数可以带回一个整型值、字符值、实型值等,但也可以带回指针型数据,即地址。本题的定义中,包括括号和 *号,由于 ()优先级高于 *。故它是一个返回整型指针的函数。 38 【正确答案】 A 39 【正确答案】 A 【试题解析】 本题 考查两个概念: 用单引号括起来的一个字符常量只能存放一个字符
28、; C语言中没有字符串变量,只能用字符数组来存储字符串。 选项 A) 中一个单引号内放了若干个字符是错误的:选项 B) 和选项 D) 选项中将一个字符串赋值给一个字符数组是允许的。 40 【正确答案】 B 【试题解析】 两次使用 “写入 ”的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的数据覆盖了文件原有的数据,故本题中 t1.dat的内容为 end。 41 【正确答案】 D 【试题解析】 因为 x的值为大于 1的奇 数,所以 x除以 2的余数等于 1,因此,选项 A)、 C)中表达式的结果为真,不为 0;对于选项 B)来说, x除以 2的商不会等于 0;选项 D)中表
29、达式的结果为假,即等于 0。 42 【正确答案】 调试 【试题解析】 软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定;调试也称排错,它是一个与测试既有联系又有区别的概念。具体来说,测试的目的是暴露错误,评价程序的可靠性,而调试的目的是发现错误的位置,并改正错误。 43 【正确答案】 类 【试题解析】 属性和操作相似的一组 对象在面向对象方法中称为类。 44 【正确答案】 软件开发 【试题解析】 软件生命周期分为 3个时期共 8个阶段:软件定义期 (问题定义、可行性研究和需求分析 )、软件开发期 (系统设计、详细设计、编码和测试 )、软件维护期 (即运行维护
30、阶段 )。 45 【正确答案】 数据结构 【试题解析】 结构化分析方法主要包括:面向数据流的结构化分析方法 (SA-Structured analysis),面向数据结构的 Jackson 方法 (JSD-Jackson system development method)和面 向数据结构的结构化数据系统开发方法 (DSSD -Data structured system development method)。 46 【正确答案】 时间复杂度 【试题解析】 在算法正确的前提下,评价一个算法的两个标准是空间复杂度和时间复杂度。算法的时间复杂度,是指执行算法所需要的计算工作量。算法的空间复杂度是
31、指执行这个算法所需要的内存空间。 47 【正确答案】 fun(a,4)+fun(b,4)-fun(a+b),3); 【试题解析】 函数 fun 的功能是计算 x的 n次方, a的 4次 方的调用函数为fun(a,4), b的 4次方的调用函数为 fun(b,4), (a+b)的 3次方的调用函数为fun(a+b),3),计算 m=a4+b4-(a+b)3的函数调用语句为: fun(a,4)+fun(b,4)-fun(a+b),3); 48 【正确答案】 -16 【试题解析】 将赋值运算符右侧的 “表达式 ”的值赋给左侧的变量,并且赋值运算符按照 “自右而左 ”的结合顺序,本题表达式应先算 m的
32、值为 10,再运算 y的值为8,最后计算 y=y+(-8)=-8+(-8)=-16。 49 【正确答案】 sizeof(struct node) 【试题解析】 库函数 malloc()只有一个参数,就是所需分配内存的字节数,然后返回一个 void*指针。本题要求分配一个 struct node类型大小的空间,所以可配合sizeof()运算符返回 struct node类型的大小作为参数调用 malloc()函数就可以了。故空白处应该填 sizeof(struct node)。 50 【正确答案】 503 【试题解析】 先判断表达式 a b为假,不执行 t=a,但执行 “a=b;b=t;”, a
33、的值为 3, b的值为 0。再 判断表达式 a C,值为真,所以执行后面的 3条语句 “t=a;a=c; c=t”,结果 a的值为 5, c的值为 3,所以最后输出的结果为 5、 0和 3。 51 【正确答案】 1 【试题解析】 在表达式 a+(int)(int)b+c) (int)(b-c)中圆括号最优先,其次为类型转换 (int)、加法 +、减法 -、右移运算。所以先看两个圆括号 (int)b+c)和 (b-c),前者 b先被转换为 int型 7,然后与 c相加 得 10.6,后者结果是 3.6,现在表达式为 a+ (iot)10.6 (int)3.6。 C语言 中, float型转换为
34、int型是截尾取整,所以表达式进一步简化为 5+10 3= 15 3。由于 15的二进制为 000011112(下标 ),所以 15 3的结栗是 000000012(下标 ),即 1。 52 【正确答案】 1 B 【试题解析】 从键盘输入后, a=B, b=33,之后进行运算, a=B-A+0=1;b= 33*2=66。 C语言规定,整型和字符型可以相互转换,已知字符 A的 ASCII码值为 65,所以字符 B的 ASCII码值为 66,所以 b=B,最后以字符形式输出 a和b,所以输 出为 1 B。 53 【正确答案】 sj+=si 【试题解析】 循环开始后如果数组 s中储存值与字符 c相同
35、,则 i+直接跳过当前值;如果不相同,则将当前值赋予数组指定位置,并通过 j+将下标加 1,指向下一元素要存储的位置。 54 【正确答案】 12 【试题解析】 本题签考查如何用指针引用数组元素。分析程序,首先定义了一个指向数组 a的指针 p, p 指向数组的首地址,通过 p+,将 p 指向 a1, p+2是将指针后移 2位指向 a3, *(p+2)即是取 a3)的值 12。 55 【正确 答案】 10 4 【试题解析】 结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。 int占 2个字节, float占 4个字节,共用体变量所占的内存长度等于最长的成员的长度。所以, sizeof(a.share)的值是 4, sizeof(a)的值是 2+2+2+4=10。 56 【正确答案】 int * * z 【试题解析】 函数希望通过形参 z带回结果,形参 z必须是指针类型的,由于返回整型结果,所以 z的说明是 int * z。函数返回前必须先把结果通过形参 z间接引用 (写 成 * z)传回。