1、国家二级( C语言)机试模拟试卷 136及答案与解析 一、选择题 1 关于数据结构的存储原理,以下数据类型不能采用顺序存储结构的是 ( )。 ( A)栈 ( B)堆 ( C)循环队列 ( D)非完全二叉树 2 关于数据结构,下列叙述中错误的是 ( )。 ( A)二叉链表是二叉树的存储结构 ( B)循环链表是循环队列的存储结构 ( C)栈的存取原则是先进后出 ( D)循环队列是队列的存储结构 3 设一棵树的总节点为 24,其中度为 4, 3, 2, 1的节点个数分别为 2, 3, 3, 0。则该棵树中的叶子节点数为 ( )。 ( A) 16 ( B) 15 ( C) 17 ( D)不可能有这样的
2、树 4 计算机程序设计的三种基本结构是 ( )。 ( A)递归、迭代和回溯 ( B)过程、函数和子程序 ( C)顺序、选择和循环 ( D)调用、返回和选择 5 某系统结构图如下图所示:该系统结构图的宽度是( )。 ( A) 5 ( B) 4 ( C) 2 ( D) 1 6 用于软件测试的实例主要包括哪些内容 ?( ) ( A)输入数据和测试规程 ( B)测试程序和输出结果 ( C)输入数据和预期输出结果 ( D)输入数据、测试规程 和输出数据 7 软件设计和使用的过程中,解决软件 “怎么做 ”的阶段是 ( )。 ( A)需求分析 ( B)软件设计 ( C)软件测试 ( D)可行性研究 8 下列
3、模型中,用树形结构表示实体之间联系的模型是 ( )。 ( A)层次模型 ( B)关系模型 ( C)网状模型 ( D)运算模型 9 在数据库管理系统中,关系数据模型的三个组成部分中不包括 ( )。 ( A)关系的完整性约束 ( B)关系的数据操纵 ( C)关系的数据结构 ( D)关系的并发控制 10 一个宾馆房间可以住至少一个旅客,则房 间和旅客之间的对应关系是 ( )。 ( A)一对多 ( B)一对一 ( C)多对一 ( D)多对多 11 以下选项中, C语言常量合法的是 ( )。 ( A) 0 214 ( B) CD+ ( C) 123 ( D) 2Kb 12 有以下程序: #include
4、 main() int m, n, x=1; float y=6; m=sizeof(x); n=sizeof(y); pfintf( d, d n, m, n); 在 VC6平台上编译运行,程序运行后的输出结 果是 ( )。 ( A) 4, 8 ( B) 4, 4 ( C) 2, 4 ( D) 10, 6 13 关于程序模块化的叙述中错误的是 ( )。 ( A)程序模块化有利于提高程序运行的效率 ( B)程序模块化有利于提高程序编制的效率 ( C)程序模块化有利于提高程序代码复用率 ( D)程序模块化有利于提高调试程序的效率 14 以下选项中不能用作用户标识符的是 ( )。 ( A) _3_
5、14 ( B) printf ( C) Int ( D) auto 15 关于 C语言的输出语句: printf( 3d n, 1001)的叙述中正确的是 ( )。 ( A)程序运行时输出 1001 ( B)程序运行时输出 001 ( C)程序运行时输出 100 ( D)指定的输出宽度不够,编译出错 16 下列选项不能作为 C语言整型常量的是 ( )。 ( A) 12L ( B)一 02 ( C) 0Xf ( D) 100U 17 有以下程序: #include main() int x=1, y=0; if(! x)y+; else if(x=0) if(! x)x+; else y+; p
6、rintf( d n, y); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 2 ( C) 0 ( D) 3 18 在 C语言源程序的语句 if(W)printf( d n, k)中,以下不可以替代 W的是( )。 ( A) xy+1 ( B) T=getchar() ( C) a=1+1 ( D) x+=3 19 有以下程序: #include main() int a=0, b=0; for(; a 7; a+) if(a 2! =0)continue; b+=a; printf( d n, b); 程序运行后的输出结果是 ( )。 ( A) 12 ( B) 9 ( C) 8
7、( D) 4 20 若有以下程序: #include main() char x=5; x+; printf( d, d n, x一 5+20, x一 5); 执行后的输出结果是 ( )。 ( A) 21, 1 ( B) 1, 21 ( C) 20, 1 ( D) 21, 0 21 有以下程序: #include main() int a=3, b=0; dob+=a; while(a一一 ); printf( d, d n, b, a); 执行后的输出结果是 ( )。 ( A) 12, 0 ( B) 12,一 1 ( C) 6, 0 ( D) 6,一 1 22 有以下程序: #include
8、 main() int x, a=1, b=1; while(1) scanf( d, &x); if(x 0)a*=x; break; if(x 0)b*=x; continue; printf( d, d n, a, b); 程 序运行时输入:一 23 045,则输出结果是 ( )。 ( A) 1, 6 ( B) 1, 6 1, 6 ( C)一 1,一 6 ( D)一 2, 6 23 有以下程序: #include #define N 4 void fun(int aNint, b) int i; for(i=0; i N; i+)bi=aiN一 1一 i一 aii; main() int
9、 xNN=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,16, yN, i; fun(x, y); for(i=0; i N; i+)printf( d, , yi); printf( n); 程序运行后的输出结果是 ( )。 ( A)一 3,一 1, 1, 3 ( B)一 12,一 3, 0, 0 ( C) 3, 1,一 1,一 3 ( D)一 3,一 3,一 3,一 3 24 有以下程序: #inchlde main() int x32: 0, i; for(i=0; i 3; i+)scanf( d, x2一 i); printf(
10、d d d n, x00, xE01, x10); 若运行时输入: 246,则输出结果为 ( )。 ( A) 246 ( B) 604 ( C) 642 ( D) 406 25 有以下程序: #include int fa(int x, int y) if(x =y)return 2*x+3; else return y; int fb(int x, int y) if(x =y)return 2*y+3; else return x; main() int i, a=2, b=0; for(i=1; i =4; i+) a=fa(i, a); b=fb(i, b); printf( d, d
11、 n, a, b); 程序运行后的输出结果是 ( )。 ( A) 4, 11 ( B) 4, 4 ( C) 11, 11 ( D) 11, 4 26 有以下部分程序: #include void f(float); main() void f(float); f(0 1); void f(int x) printf( f n, x); 以下叙述中错误的是 ( )。 ( A) f函数中不可以出现 return语句 ( B)主函数中 f(0 1)可以正确调用 ( C)主函数后的其他函数可以正确调用 f函数 ( D) f函数无返回值,应当定义成 void类型 27 有以下程序: #include m
12、ain() int i=3, j=5, *p=&i, *q=&j, *r; r=&q; i+; (*q)+; printf( d, d, d, d, d n, i, j, *P, *q, *r); 执行后的输出结果是 ( )。 ( A) 4, 6, 4, 6, 6 ( B) 5, 3, 5, 3, 5 ( C) 4, 6, 4, 6, 4 ( D) 4, 6, 4, 4, 6 28 若希望 P指向的值加 1,则以下表达式不正确的是 ( )。 ( A) *p+; ( B) *p=*p+1; ( C) (*p)+; ( D) +*p; 29 下列 C语句表达式不合法的是 ( )。 ( A) cha
13、r*ss一 Computer? ; ( B) char ss20=Computer? ; ( C) char*ss10; ss i=Computer? : ( D) char ss1020; ss1=Computer? ; 30 有以下程序: #include int fun() static int x=1; return 2*x+1; main() int i, s=1; fun(); s=fun(); printf( d n, s); 程序运行后的输出结果是 ( )。 ( A) 7 ( B) 3 ( C) 0 ( D) 10 31 有以下程序 (注:字符 A的 ASC 码值为 65):
14、#include main() char*s=ABC; do printf( d, *s 5); s+; while(*s); 程序运行后的输出结果是 ( )。 ( A) 012 ( B) ABC ( C) 567 ( D) abc 32 有以下程序: #include #include main() int i, len; char b=Welcome to China! ; len=strlen(b); for(i=0; i len; i+) if(bi=) strcpy(b, b+i+1); i=0; pfintf( s n, b); 程序运行后的输出结果是 ( )。 ( A) to C
15、hina! ( B) Welcome ( C) Welcome to China! ( D) China 33 关于字符串处理的叙述中正确的是 ( )。 ( A)字符串复制时,目的串的存储空间必须足够大 ( B)两个字符串进行比较时,短的一个必定比长的一个小 ( C)字符串定义时必须指定最后的字符串结束标识符 ( D)两个字符串连接 时,对存储空间的大小没有要求 34 有以下程序: #include float sf(int n) static float f=1; f*=n; return f; main() int i; float s=0; for(i=l; i 6; i+) s+=sf
16、(i); printf f n, s); 程序计算的结果是 ( )。 ( A) 153 ( B) 15 ( C) 120 ( D) 105 35 下面结构体的定义语句中,错误的是 ( )。 ( A) struct STint x; int y; int z; ; struct ST a; ( B) struct STint x; int y; int z; stmct ST a; ( C) struct STint x; int y; int z; a; ( D) stmctint x; int y; int z; a; 36 有以下程序: #include main() FILE*fp; i
17、nt a10=2, 3, 4, i, n; fp=fopen(data dat, w); for(i=0; i 3; i+)fprintf(fp, d, ai); fprintf(fo, n); fclose(fp); fp=fopen(data dat, r); fscanf(fp, d, &n); fclose(fp); pfintf( d n, n); 程序的运行结果是 ( )。 ( A) 0234 ( B) 2340 ( C) 234 ( D) 432 37 有以下程序: #include #define FUN(x, y)(x*y) main() int m=2, n=3; prin
18、tf( d n, FUN(m, m+n)*2); 程序运行后的输出结果是 ( )。 ( A) 10 ( B) 20 ( C) 6 ( D) 14 38 有以下程序: #include void fun(int a) if(a 1)a*=fun(a一 1); pfintf( d, a); return a; main() fun(3); printf( n); 执行后的输出结果是 ( )。 ( A) 126 ( B) 621 ( C) 1 ( D) 6 39 关于文件的叙述中正确的是 ( )。 ( A)文件由数据序列组成,其类型只能是二进制文件 ( B)文件由记录序列组成,其类型可以为二进制文件
19、或文本文件 ( C)文件由字符序列组成,其类型可以为二进制文件或文本文件 ( D)文件由数据序列组成,其类型可以为二进制文件或文本文件 40 设有定义和语句, int*pi, *pj; pi=pj=(int*)malloc(4); 如果在 VC平台上编译,则以下叙述正确的是 ( )。 ( A) pi和 pj指向了同一个 int型存储单元 ( B) pi和 pj指向了 2个连续的 int型存储单元的首地址 ( C) pi和 pj分别指向了一个 int型存储单元 ( D) pi和 pj分别指向 2个 int型存储单元 二、程序填空题 41 下列给定程序中,函数 fun的功能是:将 s所指字符串中的
20、所有数字字符移到所有非数字字符之前,并保持数字字符串和非数字字符串原有的次序。 例如, s所指的字符串为 “def35adh3kjsdf7”,执行后结果为 “3537defadhkjsdf”。 请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序 在文件 BLANK1 C中。不得增行或删行,也不得更改程序的结构! #include void fun(char*s) int i, j=0, k=0; char t180, t280; for(i=0; si! = 0; i+) if(si =0&si =9) *found* t2j=si; 【 1】 ; els
21、e t1k+=si; t2j=0; t1k=0; *found* for(i=0; i k; i+)【 2】 ; *found* for(i=0; i 【 3】 ; i+)sk+i=t2i; void main() char s80=ba3a54j7sd567sdffs; printf( nThe original string is: s n, s); fun(s); printf( nThe result is: s n, s); 三、程序修改题 42 下列给定程序中,函数 fun的功能是:将 p所指字符串中的所有字符复制到 b中,要求每复制 4个字符之后插入一个空格。 例如,若给 a输入
22、字符串: ABCDEFGHIJK,调用函数后,字符数组 b中的内容为: ABCD EFGH IJK。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MOD11 C中,不得增行或删行,也不得更改程序的结构。 #include void fun(char*P, char*b) int i, k=0; while(*p) i=1; while(i =4&*P) *found* bk=p; k+; p+; i+; if(*P) *found* bk+=; bk= 0; main() char a80, b80; printf(Enter a string: ); gets(a);
23、 printf(The original string: ); puts(a); fun(a, b); printf( nThe string after insert space: ); puts(b); printf( n n); 四、程序设计题 43 编写 fun,其功能是:实现两个字符串的连接 (不要使用库函数 strcat)。 例如,分别输入下面两个字符串: welcome to beijing 程序运行后的输出结果是: welcome to beijing 注意:部分源程序文件 PROG1 C中。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的
24、 若干语句。 #include void fun(char pl, char p2) main() char s180, s240; void File Opr(); printf(Enter s1 and s2: n); scanf( s s, s1, s2); printf(s1= s n, s1): printf(s2= s n, s2); printf(Invoke fun(s1, s2): n); fun(s1, s2); printf(After invoking: n); printf( s n, s1); File Opr(); void File Opr(); +本函数用于打
25、开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。* int i; FILE*rf。 *wf; char s180, s240; rf=fopen(in dat, r); wf=fopen(out dat, w); for(i=0; i 10; i+) fscanf(rf, s, s1); fscanf(rf, s, s2); fun(s1, s2); fprinTf(wf, s n, s1); fclose(rf); fclose(wf); 国家二级( C语言)机试模拟试卷 136答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 栈、堆和队列都可以采用顺序存储结构存储,但
26、对于二叉树来说,只有完全二叉树和满二叉树可以进行顺序存储,一般二叉树不适用。 2 【正确答案】 B 【试题解析】 链表是链表的存储结构,是由不连续的存储单元通过指针组织起来的存储 结构;栈的存取原则是先进后出,循环队列是队列的一种,所以是队列的存储结构,二叉链表是二叉树的存储结构。 3 【正确答案】 A 【试题解析】 总节点数减去度不为 0的节点数便是叶子节点数,所以答案是 24一 (2+3+3)=16。 4 【正确答案】 C 【试题解析】 计算机程序设计的三种基本结构是顺序、选择和循环。 5 【正确答案】 A 【试题解析】 该图形为一个树状结构,是用层次图表示的一种软件结构。结构图中同一层次
27、模块的最大模块个数称为结构的宽度。从图中可以看到第 3层模块个数最多, 即为 5。因此这个系统结构图宽度就是 5。 6 【正确答案】 C 【试题解析】 用于软件测试的实例主要包括输入数据和预期输出结果。 7 【正确答案】 B 【试题解析】 需求分析是解决软件 “做什么 ”的阶段,软件设计是解决软件 “怎么做 ”的阶段,软件测试是解决软件是否达到设计目的的阶段,可行性研究是软件设计之前的工作。 8 【正确答案】 A 【试题解析】 树形结构表示实体之间联系的模型是层次模型。 9 【正确答案】 D 【试题解析】 在数据库管理系统中,关系数据模型的三个组成部 分是指关系的完整性约束、关系的数据操纵和关
28、系的数据结构,但不包括关系的并发控制。 10 【正确答案】 A 【试题解析】 一个宾馆房间可以住至少一个旅客,但一个旅客只能住一个房间,因此,房间和旅客之间的对应关系是一对多的关系。 11 【正确答案】 A 【试题解析】 A项是合法的小数, B项中如果用双引号表示字符串就正确了,如果用单引号只能包含一个字符, C项中如果没有小数点可以表示一个八进制数, D项写法完全不正确。 12 【正确答案】 B 【试题解析】 sizeof是取类型所占字节数 的函数,在 vc平台, int和 float类型都占 4个字节,所以答案是 B项。 13 【正确答案】 A 【试题解析】 模块化设计与程序的运行效率没有
29、关系,只能提高程序编制的效率、程序代码复用率和程序调试效率。 14 【正确答案】 D 【试题解析】 A是合法的用户标识符, printf是库函数名,包含在 stdio h文件中,但也可以定义 printf为用户标识符,只要不包含 stdio h文件便可, int是类型名,但 Int不是,只有 auto是 C语言的关键字,所以不能作为用户标识符。 15 【正确答 案】 A 【试题解析】 printf在输出时按照格式来输出, 3d表示输出 3位整数,这里的3是最小位数,即最少输出 3位,但如果多于 3位,则按照实际位数输出。 16 【正确答案】 B 【试题解析】 0xf是十六进制整数 f, 12L
30、是长整型 12, 100U是无符号正数100,所以只有 B项不正确,看似十进制数,但第一位 0,不是合法的十进制数。 17 【正确答案】 C 【试题解析】 else与最近的一个 if语句配套,所以最后的 if一 else是一组成套的条件分支语句,它们都包括在 else if(x=0)之下,由于 x=1,所以 (! x)为假, x=0为假,所以整段程序只执行最开始的初始化语句。 18 【正确答案】 A 【试题解析】 C语言中的不等于用 “!: ”表示,所以 A项的写法有误, B、 C和D项都是合法的表达式,所以能代替 W。 19 【正确答案】 A 【试题解析】 continue的意思是放弃执行循
31、环体内之后的内容,而进行下一次循环,因此,本题中当 a是偶数的时候才执行后面的 b+=a的语句,因此,结果是2+4+6=12。 20 【正确答案】 A 【试题解析】 C语言中字符是 特殊的一类整数, x+=6所以 x一 5=1。 21 【正确答案】 D 【试题解析】 dowhile循环是先执行循环体再做条件判断,当 while结束时,a=0,之后再执行 a操作,所以 a=一 1: b=3+2+1=6。 22 【正确答案】 B 【试题解析】 循环体中的 break语句将立即退出循环,而 continue将直接执行下一次循环。当输入一 2和一 3时,执行 b*=x语句,且不会打印,结果是 b=1*
32、一2* 3=6,当输入 0时,前两个 if语句并未执行,直接打印出 a, b的值,此时a=1, b=6,当输入 4时执行 break语句,直接退出循环。 23 【正确答案】 C 【试题解析】 仔细分析子函数的功能是以数组反对角线上的元素减去同行上对角线上的元素。 24 【正确答案】 B 【试题解析】 如果 xij是一个二维数组,则 xi将指向第 i1行的首地址,因此,输入数据时, x2, x1和 x0,将分别对应数组 x的 x20, x10和x00,其他值没有发生变化,所以结果是 604。 25 【正确答案】 D 【试题解析】 此题是考查函数 的循环调用,将 a, b的初值代入,最后的结果是1
33、1, 4。 26 【正确答案】 A 【试题解析】 注意到子函数在 main之前便进行了说明,在 main中也进行了说明,所以选项 B和 C正确。选项 D对于无返回值的函数均正确,如果函数为 void类型,则不能返回值,但可以有 return语句,只是不能跟具体值,所以选项 A不正确。 27 【正确答案】 A 【试题解析】 此题考查指针及指针的指针, (*q)是对其指向的地址空间的存储值的引用,所以 (*q)+等同于 j+;同时, r指向的具体数值也会发生变化。 28 【正确答案】 A 【试题解析】 若 p是指针,则 *p是取该地址存放的具体数值,但取值运算级别较低,所以先会执行 p+运算,再取
34、值,所以结果是取得 p指向的下一个存储单元的值,因此不正确。 29 【正确答案】 D 【试题解析】 字符数组在定义时可以同时用字符串赋初值,如果在定义以后再赋值,则需要逐个元素赋值,所以选项 B正确,选项 D不正确,选项 A和 C定义的是数组指针,所以用字符串给字符指针赋值是正确的。 30 【正确答案】 A 【试题解析】 静态变量只在初次定义时赋初值,且子函数的 静态变量一直在内存中,当下次调用该函数时,静态变量还具有上次调用结束时的值,且不会被再次赋值,所以本题第 1次调用结束时 x=3,当第 2次调用时, x=2*3+1=7,选项 A正确。 31 【正确答案】 A 【试题解析】 C语言中,
35、字符可以作为整数进行运算,其值是 ASC 码值,字符指针 s指向的是字符串的首地址, s+将指向下一个字符地址, do一 while循环执行 65 5, 66 5, 67 5,结果是 0, 1, 2。 32 【正确答案】 D 【试题解析】 for循环的功能是遍历字符串的每个字符,如果碰到 字符串中的空格,则用空格后面的字符串覆盖原有字符串,并重置循环变量。因此本题的答案是 China。 33 【正确答案】 A 【试题解析】 字符串复制时,目的串的存储空间必须足够大以包含两个字符串的存储内容,选项 A正确,选项 D不正确;字符串比较时,只比较第一个不同字符的 ASCII码大小,选项 B错;字符串
36、定义时,结束标识符是系统自动补充的。 34 【正确答案】 A 【试题解析】 静态变量只在初次定义时赋初值,且子函数的静态变量一直在内存中,当下次调用该函数时,静态变量还具有上次调用结束时的值, 且不会被再次赋值,所以本题多次调用函数时,计算的内容是 1! +2! +3! +4! +5!,结果是153。 35 【正确答案】 B 【试题解析】 结构体可以在定义的同时定义变量,如选项 C所示,也可以不用给新的结构体类型命名,如选项 D所示,也可以在定义之后,通过 struct结构体名变量名的形式定义变量,所以选项 ACD正确,但在定义结构体类型的同时定义变量时不必使用 struct关键字,所以选项
37、B错。 36 【正确答案】 C 【试题解析】 此题是基本的文件操作,写入的是数组的元素,所以是 234 n,读 文件时, n是回车符,所以 n的值是 234。 37 【正确答案】 D 【试题解析】 宏定义一定要先代入再计算, FUN(m,m+n)*2=(m*m+n)*2=(2*2+3)*2=14。 38 【正确答案】 A 【试题解析】 此题是迭代调用,结果是 a=3*(2*(1)=6,但 printf语句每次都要执行,而且是先从最后一层调用开始,即 a=1最先打印, a=2其次, a=6最后打印。 39 【正确答案】 D 【试题解析】 C语言文件由数据序列组成,其类型可以为二进制文件或文本文件
38、。 40 【正确答案】 A 【试题解析】 指针不会自动开辟内存空间,所以 malloc(4)开辟的 4个字节的内存空间只是一块连续的存储空间,用来存放一个整型数据, pi和 pj是两个整型指针,都指向了这一存储空间。 二、程序填空题 41 【正确答案】 1 j+或 j+=1或 +j或 j=j+1 2 si=tli 3 J 【试题解析】 填空 1:根据函数 fun中的内容可知。数组 tl存储了 s中的非数字字符,数组 t2存储了 s中的数字字符,为了存储下一个数字字符,下标 j要进行加 1操作。 填空 2:将 s串中的数字与非数字字符分开后,要先将非数字字符放入字符串 s中,因此填入 si=tl
39、i。 填空 3:最后将数字字符加到 s串之后,并且 i要小于数字的个数 j。 三、程序修改题 42 【正确答案】 1 bk=*p; 2 bk=; k+; 【试题解析】 1题目中 p是指针型变量作函数参数,因此给 bk赋值时出现错误。 2题目要求赋值 4个字符后加一个空格,所以应该是先给 bk赋值空格,然后变量 k再加 1。 C语言中为了表示指针变量和它所指向的变量之间的关系,在程序中用 “*”,表示“指向 ”,例如, pointer代表指针变量,而 *pointer是 pointer所指向的变量。 四、程序设计题 43 【正确答案】 void fun(char p1, char p2) int i, j; for(i=0; p1i! = 0; i+) for(j=0; p2j! = 0; j+) p1i+: p2j; p1i= 0; 【试题解析】 本题用两个循环完成操作,第 1个循环的作用是求出第 1个字符串的长度,即将 i指到第 1个字符串的末尾。第 2个循环的作用是将第 2个字符串的字符连到第 1个字符串的末尾。最后在第 1个字符串的结尾加上字符串结束标识 0。