1、国家二级( C语言)机试历年真题试卷汇编 19及答案与解析 一、选择题 1 下列数据结构中,属于非线性结构的是 ( )。 ( A)循环队列 ( B)带链队列 ( C)二叉树 ( D)带链栈 2 算法的空间复杂度是指 ( )。 ( A)算法在执行过程中所需要的计算机存储空间 ( B)算法所处理的数据量 ( C)算法程序中的语句或指令条数 ( D)算法在执行过程中所需要的临时工作单元数 3 下列数据结构中,能够按照 “先进后出 “原则存取数据的是 ( )。 ( A)循环队列 ( B)栈 ( C)队列 ( D)二叉树 4 某二叉树共有 12个结点,其中叶子结点只有 1个。则该二叉树的深度为 (根结点
2、在第 1层 )( )。 ( A) 3 ( B) 6 ( C) 8 ( D) 12 5 下面不能作为结构化方法软件需求分析工具的是 ( )。 ( A)系统结构图 ( B)数据字典 (DD) ( C)数据流程图 (DFD图 ) ( D)判定表 6 下面不属于软件测试实施步骤的是 ( )。 ( A)集成测试 ( B)回归测试 ( C)确认测试 ( D)单元测试 7 下面描述中不属于数据库系统特点的是 ( )。 ( A)数据共享 ( B)数据完整性 ( C)数据冗余度高 ( D)数据独立性高 8 负责数据库中查询操作的数据库语言是 ( )。 ( A)数据定义语言 ( B)数据管理语言 ( C)数据操纵
3、语言 ( D)数据控制语言 9 设数据元素的集合 D=1, 2, 3, 4, 5,则满足下列关系 R的数据结构中为线性结构的是 ( )。 ( A) R=(1, 2), (3, 2), (5, 1), (4, 5) ( B) R=(1, 3), (4, 1), (3, 2), (5, 4) ( C) R=(1, 2), (2, 4), (4, 5), (2, 3) ( D) R=(1, 3), (2, 4), (3, 5), (1, 2) 10 一般情况下,当对关系 R和 S进行自然连接时,要求 R和 S含有一个或者多个共有的 ( )。 ( A)记录 ( B)行 ( C)属性 ( D)元组 11
4、 以下关于结构化程序设计的叙述中正确的是 ( )。 ( A)由三种基本结构构成的程序只能解决小规模的问题 ( B)结构化程序使用 goto语句会很便捷 ( C)一个结构化程序必须同时由顺序、分支、循环三种结构组成 ( D)在 C语言中,程序的模块化是利用函数实 现的 12 以下叙述中正确的是 ( )。 ( A)书写源程序时,必须注意缩进格式,否则程序会有编译错误 ( B)程序的主函数名除 main外,也可以使用 Main或 _main ( C)程序可以包含多个主函数,但总是从第一个主函数处开始执行 ( D)在 C程序中,模块化主要是通过函数来实现的 13 以下叙述中正确的是 ( )。 ( A)
5、只能在函数体内定义变量,其他地方不允许定义变量 ( B)常量的类型不能从字面形式上区分,需要根据类型名来决定 ( C)预定义的标识符是 C语言关键字的一种,不能另作它用 ( D)整型常量和实型常量都是数值型常量 14 若有以下程序段: double x=5 1 6894: printf(“ f n“, (int)(x*1000+0 5) (double)1000); 则程序段的输出结果是 ( )。 ( A) 5 170000 ( B) 5 175000 ( C) 5 169000 ( D) 5 168000 15 以下定义语句中正确的是 ( )。 ( A) int a=b=0; ( B) ch
6、ar A=65+1, b=b; ( C) float a=1, *b= printf(“x=一 12 6f y=一 12 6f n“,x, y); 三、程序修改题 42 下列给定程序中,函数 fun的功能是:将主函数中两个变量的值进行交换。例如,若变量 a中的值为 8, b中的值为 3,则程序运行后, a中的 值为 3, b中的值为 8。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h *found* void fun(int x, int y) int t; *found* t=
7、x; x=y; y=t; void main() int a, b; a=8: b=3; fun(&a, &b); printf(“ d d n“, a, b); 四、程序设计题 43 请编写函数 fun,其功能是:找出一维整型数组元素中最大的值及其所在的下标,并通过形参传回。数组元素中的值已在主函数中赋予。 主函数中 x是数组名, n是 x中的数据个数, max存放最大值, index存放最大值所在元素的下标。 注意:请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入编写的若干语句。 试题程序: #include stdlib h #include stdio h
8、 #included time h void fun(int a, int n, int*max, int*d) void main() FILE *wf; int i, x20, max, index, n=10; int y20=4, 2, 6, 8, 11, 5; srand(unsigned)time(NULL); for(i=0; i n; i+) xi=rand() 50; printf(“ 4d“, xi); *输出一个随机数组 * printf(“ n“); fun(x, n, &max, &index); printf(“Max= 5d, Index= 4d n“, max,
9、 index); * wf=fopen(“out dat“, “w“); fun(y, 6, &max, &index); fprintf(wf, “Max= 5d, Index= 4d“, max, index); fclose(wf); * 国家二级( C语言)机试历年真题试卷汇编 19答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 线性结构的特点: 有且只有一个根结点; 每一个结点最多有一个前驱,也最多有一个后继。不满足线性结构条件的称为非线性结构,二叉树的非叶子结点最多可以用两个后继,属于非线性结构。 2 【正确答案】 A 【试题解析】 算法的空间复杂度是指算法在执行过程中
10、所需要的内存空间,因此本题答案为 A。 3 【正确 答案】 B 【试题解析】 栈是按 “先进后出 “的原则组织数据的;队列是按 “先进先出 ”的原则组织数据的,因此本题答案为 B。 4 【正确答案】 D 【试题解析】 二叉树中,度为 0的结点数等于度为 2的结点数加 1,即 n2=n01,叶子结点即度为 0, n0=1,则 n2=0,总结点数为 12=n0+n1+n2=1+n1+0,则度为 1的结点数 n1=11,所以深度为 12。故 D选项正确。 5 【正确答案】 A 【试题解析】 结构化方法软件需求分析工具主要有数据流图、数据字典、判定树和判定表。 6 【 正确答案】 B 【试题解析】 软
11、件测试主要包括单元测试、集成测试、确认测试和系统测试。 7 【正确答案】 C 【试题解析】 数据库系统的特点为高共享、低冗余、独立性高、具有完整性等,故 C选项错误。 8 【正确答案】 C 【试题解析】 数据定义语言:负责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。 9 【正确答案】 B 【试题解析】 关系 R中的每个 结点由两个部分构成,分别是数据域和指针域。选项 B中可以看出,元素序列为 54132 ,符合线性结构的条件。 A选项 2的前面有 1和 3两个数值,带
12、有不确定性; C选项 2的后面有 4和 3两个数值; D选项 1的后面有 3和 2两个数值。所以 B选项正确。 10 【正确答案】 C 【试题解析】 自然连接是一种特殊的等值连接,它满足以下条件: 两关系间有公共域 (属性 ); 通过公共域的等值进行连接,故 C选项正确。 11 【正确答案】 D 【试题解析】 D项正确, C语言允许对函数单独进行编译,从而可以实现模块化。 A项错误,使用三种基本结构组成的程序可以解决复杂的问题; B项错误,使用 goto语句会使程序混乱,程序中应该尽量避免使用 goto语句; C项错误,一个结构化程序没有必要同时由顺序、分支、循环三种结构组成。 12 【正确答
13、案】 D 【试题解析】 C语言的源程序中对缩进没有要求,所以 A选项错误。 C语言中区分大小写, main函数不能写成 Main或 _main,所以 B选项错误。一个 C程序有且只有一个主函数,所以 C选项错误。 13 【正确答案】 D 【试题解析】 变量可以定义在函数体外,也可以定义在函数 体内,所以 A错误。常量的类型可以从字面形式上区分,比如 1为整型常量, 1 0为实型常量, a为字符型常量,所以 B错误。预定义的标识符不是 C语言的关键字,所以 C错误。故 D选项正确。 14 【正确答案】 C 【试题解析】 本题考查强制类型转换与输出格式。 f的输出格式是以带小数点的数学形式输出浮点
14、数。首先计算 x*1000,结果为 5168 94,加 0 5为5169 44,然后进行强制类型转换,转换成整型为 5169,然后除以双精度数据1000,结果为双精度数据 5 169,输出时按照 1的格式输出,所以输出结果 为5 169000。 15 【正确答案】 B 【试题解析】 定义变量时不能连等,所以 A错误; C选项中, b是指针, c定义为指向指针的指针才可以接受 b,所以 C错误; D选项, b=1 1前没有类型名,所以错误。 16 【正确答案】 B 【试题解析】 先计算 b =4,即 b=b 4,结果为 2,然后计算 a =2,结果为一1,最后输出 a的值为一 1, b的值为 2
15、,故 B选项正确。 17 【正确答案】 A 【试题解析】 本题考查位运算。按位取反只需要一个操作数,所以 B选项错误;左移一位是原操作数的 2倍,其他情况不是,比如左移两位就是原操作数的 4倍,所以 C选项错误;右移运算时,高位在某些情况下不是补 0,所以 D选项错误。故 A选项正确。 18 【正确答案】 C 【试题解析】 该题首先初始化变量 a和 b,通过 for循环语句使得 a取值为 0、1、 2、 3, fun函数的功能是将 a*a+a的值返回给 b,即 b为 a、 b、 e、 j。最后通过字符输出函数 putchar()将 b输出。故 C选项正确。 19 【正确答案】 B 【试题解析】
16、 考查 for循环及其嵌套。第一个 for循环用来控制输出行数,第二个 for循环 用来控制每行输出的表达式个数。 当 i=1, j=1时,第一行输出 3个表达式为: 1*1=1 1*2=2 1*3=3; 当 i=2, j=2时,第二行输出 2个表达式为: 2*2=4 2*3=6: 当 i=3, j=3时,第三行输出 1个表达式为: 3*3=9: 当 i=4时,第一个 for循环中判断条件不成立,循环结束,整个程序执行完毕。因此答案选 B。 20 【正确答案】 B 【试题解析】 本题考查 scanf函数的格式化输入。 scanf函数的一般形式为scanf(格式 控制,变量 1地址,变量 2地址
17、, ) 。其中,格式字符串要与数据类型保持一致,由于变量为 double型,所以格式字符串中应为 1f,后面应该为变量地址,所以需要加上符号 &,故 B选项正确。 21 【正确答案】 C 【试题解析】 第一个 if语句的判断条件是逻辑与表达式,只有运算对象均非零,结果才为真。执行第一个 if判断条件,均为赋值表达式,第一个运算对象 a=2非零,判断第二个表达式 b=1也非零,所以条件成立,执行 c=2的赋值操作。执行第二个 if判断条件的逻辑或表达式,只要有一个对象非零,结果就是真。本条件中 c=3运算对象为假,所以需要判断第二个运算对象 d=一 1,结果为一 1,非零,条件成立,执行 a=5
18、的操作,所以 a值为 5, b值为 1, c值为 2, d值为一1。 22 【正确答案】 C 【试题解析】 本题重点考查 if语句,变量 x和 y均为 double类型,由于变量 x赋值为 2 0,因此执行 if(x 5 0)&(!x),即条件为 0,继续执行 if(x10 0),条件为真,即执行 y=1 0 x;。依据 printf()函数输出类型, f是以小数形式输出单双精度实数。故 C选项正确。 23 【正确答案】 D 【试题解析】 本题考查 while语句。 while语句的语义是:计算表达式的值,当值为真 (非 0)时,执行循环体语句。 a+即 a先参与运算后, a的值再自增 1。
19、+b即 b先自增 1,然后再参与其他运算。当表达式的值为 0时,退出循环,最后输出a和 b的值为 1和 2。故 D选项正确。 24 【正确答案】 B 【试题解析】 for循环的判断条件是只要 a为 0就退出循环体。初始 a的值为6,满足条件,执行完循环体, b的值为 6, a一 =+c,即 a=a一 (+c),所以 a的值为 5, c的值为 1。第二次循环后 b的值为 11, a的值为 3, c的值为 2。第三次也是最后一次循环后, a的值为 0, b的值 14, c的值为 3。故 B选项正确。 25 【正确答案】 B 【试题解析】 A选项中,一条语句只能定义一个数组是不准确的,可以通过一条语
20、句定义多个数组; C选项中,数组说明符的一对方括号中可以是整型常量,也可以是整型常量表达式; D选项中,在引用数组元素时,下标表达式必须是整型的。故 B选项正确。 26 【正确答案】 A 【试题解析】 对于字符数组 a,含有 4个元素,所以 strlen为 4,而 sizeof包括最后隐藏的 0(结束符 ),故 sizeof有 5个。对于字符串 b, strlen为 3,关键是sizeof,这里的 sizeof不再是指数组的长度,因为 b是一个地址值,整型数据,所以占用了 4个字节。 27 【正确答案】 C 【试题解析】 本题考查字符的 ASCII码值。其中字符 0的 ASCII码值是 0,字
21、符 0的 ASCII码值是 48,字符 a和字符 b的 ASCII码值分别是 97、 98,所以程序当中的三个 if判断语句,只有第一个判断条件成立,然后执行 putchar函数,输出 X。故 C选项正确。 28 【正确答案】 D 【 试题解析】 二维数组在初始化时,可以省略第 1维,但是不可以省略第 2维,可以为部分数组元素初始化。 A选项、 B选项和 C选项内的初始化都没有错误。故 D选项正确。 29 【正确答案】 B 【试题解析】 考查数组名作为函数参数。数组名作为函数参数时,只传递数组的首地址而不检查形参数组的长度,所以形参表中可以不给出形参数组的长度,形参数组和实参数组长度也可以不同
22、,选项 D错; a10、 a、 *a做形参都是接受实参数组首地址,效果一样, B正确。传递给形参的实参可以是数组名,还可以是指向该数组的指针变量,选项 A错。数组名可以看做一个指针常量,对其进行自加自减运算相当于指针变量的自加自减,选项 C错。答案选 B。 30 【正确答案】 B 【试题解析】 考查函数的调用。输出结果为 fun(2*a, fun(b, c)=fun(8, 5)=6,答案选 B。 31 【正确答案】 A 【试题解析】 数组定义中长度不能为变量。 32 【正确答案】 C 【试题解析】 本题考查字符数组的相关操作。 A选项中 strl的类型不是字符串类型; B选项中数组 strl包
23、含了 5个元素,其中有结尾符; D选项中字符数组的最后一个元 素可以不是 0字符。故 C选项正确。 33 【正确答案】 D 【试题解析】 不可以把一个 int型数据直接赋值给一个指针变量,只能用取地址运算符 “&”把该整型变量的地址赋值给该指针变量,选项 D错误;函数类型若为指针类型则可以返回地址值,选项 B正确;函数传参过程中,是把实参的数据复制一份传给形参,所以改变形参的值不会对实参造成影响,选项 C正确; NULL的定义包含在头文件 stdio h中,所以选项 A正确;所以答案选 D。 34 【正确答案】 A 【试题解析】 数组名表示该数组的首地址,是一个地 址常量,不能对它重新赋值,
24、A正确。但是可以把数组名看做一个指针常量,则表达式 a+1表示的是数组中第二个元素的地址,选项 B错。表达式 a1、 *(a+1)、 *&a1都指的是数组 a中第二个元素的值,选项 C错。 运算符的优先级高于 *、 &,取值 *和取址 &运算符优先级相等,同一优先级的运算符,运算次序由结合方向所决定, *&a1在运算符优先级和结合性上没有问题,并且取值 *和取址 &运算符互逆, *&a1和 a1等价,相当于求得数组 a第二个元素的值,选项 D错。答案选 A。 35 【正确答案】 D 【试 题解析】 考查函数的递归调用。只需要一步一步递归调用函数即可,执行fun(5)=5+(4+(3+(2+fu
25、n(1)=15,故 D选项正确。 36 【正确答案】 C 【试题解析】 在不同编译单位内用 extern说明符来扩展全局变量的作用域,extern可以将全局变量作用域扩展到其他文件,而不是限制全局变量的作用域。 37 【正确答案】 C 【试题解析】 A选项中,如果 p是指针变量,则 p表示变量 p的地址; B选项中,如果 p是指针变量,则 *p表示变量 p所指向的地址的值; D选项中,如果 p是指 针变量, *p+1表示将 p所指的值加上 1,而 *(p+1)表示的是先将指针右移一位再取所指向变量的值。故 C选项正确。 38 【正确答案】 B 【试题解析】 本题考查宏定义。宏定义只是做个简单的
26、替换,执行NUM=(N+1+1)*N+1 2=8,敌 B选项正确。 39 【正确答案】 A 【试题解析】 在 C语言中有两个作用,一是用作取余数运算符,另一个用作转义符。 d相当于将第二个转义了,所以输出为 d。故总的输出为 A选项。 40 【正确答案】 C 【试题解析】 该定义语句把结构体 struct Date命名为一个新的类型名 “DATE”,DATE相当于 “struct Date”,是结构体类型名,选项 C描述错误,答案选 C。 二、程序填空题 41 【正确答案】 (1)x (2)n (3)t 【试题解析】 本题考查:累加、累乘;算术运算;复合赋值运算; dowhile 循环条件。
27、填空 1:通过下面的语句可以知道 n是从 2开始的,而根据题目的要求是从 1+x开始的,因而此空应填写 x。 填空 2:由于本题用的是 dowhile ,先循环后再判断,因此本空应该填写 n。 填空 3:根据题目要求和复合赋值运算可知此空应填 t。 三、程序修改题 42 【正确答案】 (1)void fun(int *x, int *y) (2)t=*x; *x=*y; *y=t; 【试题解析】 (1)本题考查指针变量作函数参数。一般变量作参数时,不能改变实参的值,采用指针变量作为参数则能够改变实参的值。主函数中 fun函数的调用方式表明 fun函数的参数应当为指针类型。 (2)此处是一个变量
28、交换操作错误,可知 x、 y是指针类型,变量类型不同,因而x、 y不能与 t进行值 的交换。 四、程序设计题 43 【正确答案】 void fun(int a, int n, int *max, int *d) int i; *max=a0; *d=0; for(i=0; i n; i+) *将最大的元素放入指针 max所指的单元,最大元素的下标放入指针 d所指的单元 * if(*max ai) *max=ai; *d=i; 【试题解析】 本题考查:查找一维数组中的最大值及其下标,使用循环判断结构实现;指针变量的应用 。 要查找最大值及其下标需要定义两个变量,该程序直接使用形参 max和 d,由于它们都是指针变量,所以在引用它们所指向的变量时要对其进行指针运算。循环语句用来遍历数组元素,条件语句用来判断该数组元素是否最大。 该程序考查求最大值,需要掌握以下语句: for(i=0; i n; i+) *将最大的元素放入指针 max所指的单元,最大元素的下标放入指针 d所指的单元 * if(*max ai) *max=ai; *d=i;