1、国家二级( C语言)机试模拟试卷 47及答案与解析 一、选择题 1 下列叙述中正确的是 ( A)有且只有一个根结点的数据结构一定是线性结构 ( B)每一个结点最多有一个前件也最多有一个后件的数据结构一定是线性结构 ( C)有且只有一个根结点的数据结构一定是非线性结构 ( D)有且只有一个根结点的数据结构可能是线性结构,也可能是非线性结构 2 下列叙述中错误的是 ( A)在双向链表中,可以从任何一个结点开始直接遍历到所有结点 ( B)在循环链表中,可以从任何一个结点开始直接遍历到所有结点 ( C)在线性 单链表中,可以从任何一个结点开始直接遍历到所有结点 ( D)在二叉链表中,可以从根结点开始遍
2、历到所有结点 3 某二叉树共有 13个结点,其中有 4个度为 1的结点,则叶子结点数为 ( A) 5 ( B) 4 ( C) 3 ( D) 2 4 设栈的顺序存储空间为 S(1: 50),初始状态为 top=0。现经过一系列入栈与退栈运算后, top=20,则当前栈中的元素个数为 ( A) 30 ( B) 29 ( C) 20 ( D) 19 5 结构化程序包括的基本控制结构是 ( A)主程序与子程序 ( B)选择结构、循环结构与层 次结构 ( C)顺序结构、选择结构与循环结构 ( D)输入、处理、输出 6 程序测试的目的是 ( A)执行测试用例 ( B)发现并改正程序中的错误 ( C)发现程
3、序中的错误 ( D)诊断和改正程序中的错误 7 下面属于系统软件的是 ( A)财务管理系统 ( B)数据库管理系统 ( C)编辑软件 Word ( D)杀毒软件 8 在关系 A(S, SN, D)和 B(D, CN, NM)中, A的主关键字是 S, B的主关键字是 D,则 D是 A的 ( A)外键 (码 ) ( B)候选键 (码 ) ( C)主键 (码 ) ( D)元组 9 有两个关系 R, S如下,由关系 R和 S通过运算得到关系 T,则所使用的操作为( A)并 ( B)自然连接 ( C)笛卡尔积 ( D)差 10 在数据库管理系统提供的数据语言中,负责数据模式定义的是 ( A)数据定义语
4、言 ( B)数据管理语言 ( C)数据操纵语言 ( D)数据控制语言 11 流程图是描述算法的很好的工具,一般的流程图中由几种基本图形组成。其中输入输出框的图形是 ( A)平行四边形 ( B)长方形 ( C)椭圆型 ( D)菱形 12 设有以下代码 do while (条件表达式 1) 循环体 A; while (条件表达式 2); while (条件表达式 1) do 循环体 B; while (条件表达式 2); 其中,循环体 A与循环体 B相同,以下叙述正确的是 ( A)循环体 A与循环体 B的执行次数相同 ( B)循环体 A比循环体 B的执行次数多一次 ( C)循环体 A比循环体 B的
5、执行次数少一次 ( D)循环体 A与循环体 B的执行次数不确定 13 C语言的常量包括数值型常量和符号常量,以下叙述正确的是 ( A)数值型常量 1.0和 1所占内存的大小不同 ( B)不能用 sizeof求数值型常量所占内存的大小 ( C)不能用 sizeof求符号常量所占内存的大小 ( D)可以用 a = (int)(-1.53*3); printf(“%dn“, a); 程序的运行结果是 ( A) -4 ( B) -3 ( C) -5 ( D)结果不确定 15 有以下程序 #include stdio.h main() int k=33; printf(“%d,%o,%xn“, k, k
6、, k); 程序的运行结果是 ( A) 33,41,21 ( B) 33,33,33 ( C) 41,33,21 ( D) 33,21,41 16 若有定义: char c; int d; ,程序运行时输入: 1,2 回车,能把值 1输入给变量 c、值 2输入给变量 d的输入语句是 ( A) scanf(“%c,%d“, ( B) scanf(“%c%d“, ( C) scanf(“%d,%f“, ( D) scanf(“%d%d“, 17 有以下程序 #include stdio.h main() int a=0,b=0,c=0,d=0; (a+ printf(“%d,%d,%d,%dn“,
7、 a,b,c,d); 程序的运行结果是 ( A) 1,0,0,1 ( B) 1,1,0,1 ( C) 1,0,1,0 ( D) 1,1,1,0 18 有以下程序 #include stdio.h main() int a,b; for (a=0; a 3; a+) scanf(“%d“, switch(b) case 1: printf(“%d,“, +b); case 2: printf(“%d,“, +b); default: printf(“%d,“, +b); 执行时输入: 1 2 3回车 ,则输出结果是 ( A) 2,3,4,3,4,4, ( B) 2,3,4, ( C) 2,2,2
8、,3,3,4, ( D) 2,3,4,3,4,5,4,5,6 19 有以下程序 #include stdio.h main() int a=-1, b=-1; while(+a) +b; printf(“%d,%dn“, a,b); 程序的运行结果是 ( A) 0,-1 ( B) 0,0 ( C) -1,-1 ( D)结果不确定 20 有以下程序 #include stdio.h main() int a=0, b=0; for( ;a 5; a+ ) if (a%2=0) continue; b += a; printf(“%d n“, b); 程序的运行结果是 ( A) 4 ( B) 10
9、 ( C) 0 ( D) 15 21 以下选项中非法的 C语言字符常量是 ( A) 128 ( B) 127 ( C) x01 ( D) x08 22 有以下程序 #include stdio.h main() char c; while(c=getchar() != #) putchar(c); 执行时如输入 abcdefg#回车 , 则输出结果是 ( A) abcdefg ( B) abcdefg# ( C) abcdefg# ( D) # 23 若要使用 C数学库中的 sin函数,需要在源程序的头部加上 #include math.h 关于引用数学库,以下叙述正确的是 ( A)通过引用
10、math.h文件,说明 sin函数的参数个数和类型,以及函数返回值类型 ( B)将数学库 中 sin函数链接到编译生成的可执行文件中,以便能正确运行 ( C)将数学库中 sin函数的源程序插入到引用处,以便进行编译链接 ( D)实际上,不引用 math.h文件也能正确调用 sin函数 24 以下关于地址和指针的叙述中正确的是 ( A)可以取变量的地址赋值给同类型的指针变量 ( B)可以取常量的地址赋值给同类型的指针变量 ( C)可以取一个指针变量的地址赋给本指针变量,这样就使得指针变量指向自身 ( D)所有指针变量如果未赋初值,则自动赋空值 NULL 25 有以下程序 #include std
11、io.h int k=5; void f(int *s) *s=k; main() int m=3,*p= f(p); printf(“%d,%d“, m, *p); 程序的运行结果是 ( A) 5,5 ( B) 3,3 ( C) 3,5 ( D) 5,3 26 有以下程序 #include stdio.h int *f(int *s,int *t) if (*s *t) s=t; return s; main() int i=3, j=5, *p= r=f(p,q); printf(“%d,%d,%d,%d,%dn“, i, j, *p, *q, *r); 程序的运行结果是 ( A) 3,5
12、,3,5,5 ( B) 3,5,5,5,5 ( C) 5,3,3,3,5 ( D) 5,5,5,5,5 27 有以下程序 #include stdio.h #define N 4 void fun(int aN) int bNN,i,j; for(i=0; i N; i+) for(j=0; j N; j+) bij = aN-1-ji; for(i=0; i N; i+) for(j=0; j N; j+) aij = bij; main() int xNN= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12, 13,14,15,16, i; fun(x); for (i
13、=0;i N; i+) printf(“%d,“, xii); printf(“n“); 程序的运行结果是 ( A) 13,10,7,4, ( B) 1,6,11,16, ( C) 4,7,10,13, ( D) 1,5,9,13, 28 有以下程序 #include stdio.h void fun(int a , int n) int i,j=0,k=n-1, b10; for (i=0; i n/2; i+) bi =aj; bk=aj+1; j+=2; k-; for (i=0; i n; i+) ai = bi; main() int c10=10,9,8,7,6,5,4,3,2,1
14、,i; fun(c, 10); for (i=0;i 10; i+) printf(“%d,“, ci); printf(“n“); 程序的运行结果是 ( A) 10,8,6,4,2,1,3,5,7,9, ( B) 10,9,8,7,6,5,4,3,2,1, ( C) 1,2,3,4,5,6,7,8,9,10, ( D) 1,3,5,7,9,10,8,6,4,2, 29 有以下程序 #include stdio.h #include string.h main() int i; char a=“How are you!“; for (i=0; ai; i+) if (ai = ) strcpy
15、(a, printf(“%sn“,a); 程序的运行结果是 ( A) are you! ( B) Howareyou! ( C) areyou! ( D) areyou! 30 有以下程序(其中库函数 strstr()首部格式为: char *strstr(char *p1, char *p2) 其功能是确定 p2字符串是否在 p1中出现,并返回 p2第一次出现的字符串首地址) #include stdio.h #include string.h char *a=“you“; char *b=“Welcome you to Beijing!“; main() char *p; p = strs
16、tr(b, a); printf(“%sn“, p); 程序的运行结果是 ( A) you to Beijing! ( B) to Beijing! ( C) Welcome you to Beijing! ( D) Beijing! 31 有以下程序 #include stdio.h main() char b310; int i; for (i=0; i 2; i+) scanf(“%s“, bi); gets(b2); printf(“%s%s%sn“, b0,b1,b2); 执行时若从第一列输入 :Fig flower is red. 回车 则输出结果是 ( A) Figflower
17、is red. ( B) Figfloweris red. ( C) Figflowerisred. ( D) Fig flower is red. 32 有以下程序 #include stdio.h #include string.h main() char w20, a510=“abcdef“, “ghijkl“, “mnopq“, “rstuv“, “wxyz.“; int i; for (i=0; i 5; i+) wi=ai strlen(ai)/2; w5= 0; puts(w); 程序的运行结果是 ( A) djoty ( B) agmrw ( C) flqv ( D) cims
18、x 33 有以下程序 #include stdio.h void f(int x, int n) if ( n 1) printf(“%d,“, xn-1); f(x, n-1); else printf(“%d,“, x0); main() int z6 = 1,2,3,4,5,6; f(z,6); printf(“n“); 程序的运行结果是 ( A) 6,5,4,3,2,1, ( B) 6,1, ( C) 2,3,4,5,6,1, ( D) 1,2,3,4,5,6, 34 有以下程序 #include stdio.h int a=2; int f() static int n=0; int
19、 m=0; n+; a+; m+; return n+m+a; main() int k; for (k=0; k 3; k+) printf(“%d,“, f( ); printf(“n“); 程序的运行结果是 ( A) 5,7,9, ( B) 5,6,7, ( C) 5,8,11, ( D) 5,5,5, 35 有以下程序 #include stdio.h #define S(x) x/x main() int k=5, j=2; printf(“%d,%dn“, S(k+j), S(j+k); 程序的运行结果是 ( A) 7,9 ( B) 1,1 ( C) 7,7 ( D) 9,9 36
20、 有以下程序 #include stdio.h typedef struct stu char name10; char gender; int score; STU; void f(STU *a, STU *b) b = a; printf(“%s,%c,%d,“, b- name, b- gender, b- score); main() STU a=“Zhao“, m, 290, b=“Qian“, f, 350; f( printf(“%s,%c,%dn“, b.name, b.gender, b.score); 程序的运行结果是 ( A) Zhao,m,290,Qian,f,350
21、( B) Qian,f,350,Zhao,m,290 ( C) Qian,f,350,Qian,f,350 ( D) Zhao,m,290,Zhao,m,290 37 有以下程序 #include stdio.h #include string.h typedef struct stu char name10; char gender; int score; STU; void f(STU c) strcpy(c.name, “Qian“); c.gender = f; c.score = 350; main() STU a=“Zhao“, m, 290, b; b=a; f(b); prin
22、tf(“%s,%c,%d,“, a.name, a.gender, a.score); printf(“%s,%c,%dn“, b.name, b.gender, b.score); 程序的运行结果是 ( A) Zhao,m,290,Zhao,m,290 ( B) Zhao,m,290,Qian,m,290 ( C) Zhao,m,290,Qian,m,350 ( D) Zhao,m,290,Qian,f,350 38 若有定义 typedef int T10; T a20; 则与上述定义完全等价的说明语句是 ( A) int a2010; ( B) int a20; ( C) int a10
23、; ( D) int a1020; 39 有以下程序 #include stdio.h main() int c,d; c = 10 | 5; d = 10 + 5; printf(“%d,%dn“, c, d); 程序的运行结果是 ( A) 15,15 ( B) 10,15 ( C) 5,15 ( D) 105,15 40 有以下程序 #include stdio.h main() FILE *fp; int i, a6=1,2,3,4,5,6,k; fp = fopen(“data.dat“, “w+“); fprintf(fp, “%dn“, a0); for (i=1; i 6; i+
24、) fseek(fp, 0L, 0); fscanf(fp, “%d“, fseek(fp, 0L, 0); fprintf(fp, “%dn“, ai+k); rewind(fp); fscanf(fp, “%d“, fclose(fp); printf(“%dn“, k); 程序的运行结果是 ( A) 21 ( B) 6 ( C) 123456 ( D) 11 二、程序填空题 41 下列给定程序中,函数 fun的功能是:在形参 s所指字符串中的每个数字字符之后插入一个 *号。例如,形参 s所指的字符串为 “def35adh3kjsdf7”,执行后结果为“def3*5*adh3*kjsdf7
25、*”。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程 序: #include Stdio h void fun(char*S) int i,j,n; for(i=0, si!= 0; i+) /*found*/ if(si =0【 1】 si =9) n=0; /*found*/ while(si+1+n!=【 2】 ) n+: for(j=i+n+1; j i, j一 一 ) /*found*/ sj+1=【 3】 ; Sj+1=*; i=i+1; main() char s60=“def
26、35adh3kj sdf7”, printf(“ nThe original string is: Sn”, S); fun(S); printf(“ nThe result is: S n”, s); 三、程序修改题 42 下列给定程序中,函数 fun的功能是:用下面的公式求 的近似值,直到最后一项的绝对值小于指定的数 (参数 num)为止。 例如,程序运行后,输入 0 0001,则程序输出 3 1414。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdlib h #include ma
27、th h #include(stdio h float fun(float num) int s; float n, t, pi; t=1, pi=0; n=1 ;s=1;/*found*/ while(t =num) pi=pi+t, n=n+2; S=一S;/*found*/ t=s n; pi=pi*4; return pi; void main() float n1, n2; system(“CLS”); printf(“Enter a float number: ”); scanf(“ f”, ”m, n); for(n=0, n m; n+) printf(”n 4d”, zzn)
28、; 国家二级( C语言)机试模拟试卷 47答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 一个非空的数据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,称为线性结构,故 A、 B和C选项都错误;不 同时满足以上两个条件的数据结构就称为非线性结构,其中树形结构只有一个根结点, D选项正确。 2 【正确答案】 C 【试题解析】 线性单链表就是指线性表的链式存储结构,这种结构只能从一个节点遍历到其后的所有节点,故 C选项叙述错误;在单链表的第一个节点前增加一个表头节点,队头指针指向表头节点,所以可以从任何一个节点开始直接遍历到所有节点,最后一个节
29、点的指针域的值由 NULL改为指向表头节点,这样的链表称为循环链表;双向链表是指链表节点含有指向前一个节点的指针和指向后一个节点的指针,所以可以从任何一个节点开 始直接遍历到所有节点;二叉树链表中节点指针由父节点指向子节点,可以从根节点开始遍历到所有节点,所以选项A、 B、 D叙述均正确。 3 【正确答案】 A 【试题解析】 在树结构中,一个节点所拥有的后件个数称为该节点的度。对任何一棵二叉树,度为 0的节点(即叶子节点)总是比度为 2的节点多一个。二叉树中有 13个节点,设叶子节点个数为 n0,度为 1的节点个数为 4,设度为 2的节点个数为 n2。 13=n0+4+n2且 n0=n2+1,
30、则 n0=5, n2=4。 A选项正确。 4 【正确答案】 C 【试题解析】 栈是一 种特殊的线性表,它所有的插入与删除都限定在表的同一端进行。入栈运算即在栈顶位置插入一个新元素,退栈运算即是取出栈顶元素赋予指定变量。当栈为空时,栈顶指针 top=0,经过入栈和退栈运算,指针始终指向栈顶元素。 top=20,则当前栈中有 20个元素, C选项正确。 5 【正确答案】 C 【试题解析】 结构化程序包括的基本控制结构只有三种,即顺序结构、选择结构与循环结构, C选项正确。 6 【正确答案】 C 【试题解析】 测试的目的是发现软件中的错误,但是,暴露错误并不是软件测试的最终目的,测试的根 本目的是尽
31、可能多地发现并排除软件中隐藏的错误, C选项正确。 7 【正确答案】 B 【试题解析】 计算机软件按功能分为应用软件、系统软件、支撑软件(或工具软件)。系统软件是管理计算机的资源,提高计算机的使用效率,为用户提供各种服务的软件,如操作系统、数据库管理系统、编译程序、汇编程序和网络软件等, B选项正确。 A、 C、 D选项为应用软件。 8 【正确答案】 A 【试题解析】 二维表中的一行称为元组。候选键(码)是二维表中能唯一标识元组的最小属性集。若一个二维表有多个候选码,则选定其中一个作为主 键(码)供用户使用。表 M中的某属性集是表的候选键或者主键,则称该属性集为表的外键(码)。 A中属性集 D
32、是 B的主关键字,故 D是 A的外键(码), A选项正确。 9 【正确答案】 D 【试题解析】 常用的扩充运算有交、除、连接及自然连接等。并: RS是将 S中的记录追加到 R后面。差: R-S结果是属于 R但不属于 S的记录组成的集合。交: RS结果是既属于 R又属于 S的记录组成的集合。差运算 -S:关系 R中两条记录其中 (b 1 n1)不属于 S,所以 R-S=T。 D选项正确。 10 【正确答案】 A 【试题解 析】 数据库管理系统提供了相应的数据语言,它们是:数据定义语言,该语言负责数据的模式定义与数据的物理存取构建;数据操纵语言,该语言负责数据的操纵,包括查询与增、删、改等操作;数
33、据控制语言,该语言负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。 A选项正确。 11 【正确答案】 A 【试题解析】 算法可以用各种描述方法进行描述,目前最常用的有 3种:伪代码、流程图和 N-S结构图。传统的流程图由下图所示的几种基本图形组成。 A选项正确。 12 【正确答案】 A 【试题解析】 while循环语句一般形式为: while(表达式 )循环体 ,执行过程为:首先判断表达式,成立(非 0)则执行循环体,不成立( 0)则退出循环。dowhile 循环语句一般形式为: do循环体 while(表达式 ),执行过程为:首先执行循环体,之后判断表达式,成立(非 0)则再
34、一次执行循环体,不成立( 0)则退出循环。假设表达式 1与表达式 2成立次数为 n1与 n2。若 n1 n2,则循环体A执行次数为 n2+1, B执行次数 n2+1;若 n1 n2,则循环体 A执行次数为 n1,B执行次数 n1, A选项正确。 13 【正确答案】 A 【试题解析】 整型常量:用不带小数点的数字表示。实型常量:用带小数点的数字表示。字符型常量:用带有单引号的字符表示。 A选项中 1.0为实型常量,所占内存为 4个字节, 1为整型常量,所占内存为 2个字节, A选项正确。 sizeof用来获取类型或数据对象的长度,其操作数可以是系统提供的数据类型,可以是用户自定义,也可以是各种常
35、量和表达式, B、 C选项错误。 n=1,a=3,m=1,返回 5; k=1,a=3,n=1, m=0;n=2,a=4,m=1,返回 7;k=2,a=4,n=2,m=0;n=3,a=5,m=1,返回 9; k=3退出循环。 A选项正确。 35 【正确答案】 A 【试题解析】 带参数的宏的调用格式:宏名(实参表),替换过程是,用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。 S(k+j)被置换成 k+j/ k+j,计算时先计算 j/k,则 k+j/k+j=7; S(j+k)被置换成 j+k/j+k,计算时先计算 k/j,则 j+k/j+k=9。程序的运行结果是
36、 7,9, A选项正确。 36 【正确答案】 A 【试题解析】 程序执行过程为:调用 f函数,将结构体 a与 b的地址作为参数传入函数,函数中指针 a指向结构体 a,指针 b指向结构体 b,将指针 a赋给指针b,输出 b指向的结构体 a的元素 Zhao, m,290。调用函数结束。输出结构体 b的元素 Qian,f,350。 A选项正确。 37 【正确答案】 A 【试题解析】 程序执行过程为:将 a赋给 b,调用 f函数,将 b中成员值传递给c,执行函数体,改变 c中成员但并未改变 b中成员值。故调用函数结束后,输出结构体 a与 b中成员值均为 Zhao,m,290, A选项正确。 38 【正
37、确答案】 A 【试题解析】 新定义的类型 T为大小为 10的整型数组,定义的 T型变量a20,等价于定义了一个整型 20行 10列二维数组, A选项正确。 39 【正确答案】 A 【试题解析】 由于按位或 “|“优先级高于赋值 “=“, 10=1010B, 5=0101B,按位或结果为 1111B=15,故 c=15,d=15, A选项正确。 40 【正确答案】 A 【试题解析】 fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针 NULL。 fscanf函数从文本文件中按格式输入。 fprintf函数按照格式向文本文件中输出数据
38、。文件定位函数 fseek,将指针由文件开头 0、当前位置 1、末尾 2移动指定字节。 rewind函数功能使文件的位置指针返回到文件头。程序执行过程为:以读写方式建立一个新的文本文件 data.dat,将 1写入文件;执行 for循环,将文件指针移到文件开头,将文件第一个数值 1赋给 k,再将指针移动到开头,向文件内输入 ai+k=3。for循环实现将 a数组中元素累加,结果 21存放在文件中。调用 rewind将文件指针移动到开头,调用 fscanf函数从文件中读出数值赋予 k=21,调用 fclose函数关闭文件,打印 k值, A选项正确。 二、程序填空题 41 【正 确答案】 (1)& (2)0或 0 (3)sj或 *(s+j) 【试题解析】 填空 1: if语句中的条件是判断是否为数字字符,数字字符的条件是大于等于 “0”,同时小于等于 “9”,因此需要使用逻辑与 “&”来连接。 填空 2: while语句判断是否到达字符串的结尾,因此填入 0(字符串结束标识0)。 填空 3: for语句使数字后的字符全都向后移一个单位,因此要使sj+1=sj;。 三、程序修改题 42 【正确答案】 (1)while(fabs(t) =num) (2)t=s n: