1、国家二级( C语言)机试模拟试卷 94及答案与解析 一、选择题 1 一个栈的初始状态为空。现将元素 1、 2、 3、 4、 5、 A、 B、 C、 D、 E依次人栈,然后再依次出栈,则元素出栈的顺序是 ( )。 ( A) 12345ABCDE ( B) EDCBA54321 ( C) ABCDEl2345 ( D) 54321 EDCBA 2 下列叙述中正确的是 ( )。 ( A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 ( B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 ( C)在循环 队列中,只需要队尾指针就能反映队列中元素的动态变化情况 ( D)循环队列
2、中元素的个数是由队头指针和队尾指针共同决定的 3 在长度为 n的有序线性表中进行二分查找,最坏情况下需要比较的次数是 ( )。 ( A) D(n) ( B) D(n2) ( C) D(log2n) ( D) D(nlog2n) 4 下列叙述中正确的是 ( )。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有 序表,链式存储结构不能存储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)事件驱动
3、( C)模块调用 ( D)数据流 6 在软件开发中,需求分析阶段可以使用的工具是 ( )。 ( A) N-S图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 在面向对象方法中,不属于 “对象 ”基本特点的是 ( )。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 8 一间宿舍可住多个学生, 则实体宿舍和学生之间的联系是 ( )。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的是 ( )。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三
4、个关系 R、 S和 T如下:由关系 R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 下列叙述中错误的是 ( )。 ( A) C程序可以由多个程序文件组成 ( B)一个 C语言程序只能实现一种算法 ( C) C程序可以由一个或多个函数组成 ( D)一个 C函数可以单独作为一个 C程序文件存在 12 以下选项中,能用作数据常量的是 ( )。 ( A) 115L ( B) 0118 ( C) 1 5e1 5 ( D) 0115 13 按照 C语言规定的用户标识符命名规则,不能现在标识符中的是 ( )。 ( A)大写字母 (
5、B)下划线 ( C)数字字符 ( D)连接符 14 设变量已正确定义并赋值,以下正确的表达式是 ( )。 ( A) x=y+z+5, +y B)int(15 8 5) ( B) x=y*5=x+z ( C) x=25 5 0 15 设有定义: int x=2;,以下表达式中,值不为 6的是 ( )。 ( A) 2*x, x+=2 ( B) x+, 2*x ( C) x*c=(1+x) ( D) x*=x+1 16 有以下程序: #include main() int x, y, z; x=y=1; z=x+, y+, +y; printf(“ d, d, d n”, x, y, z); 程序运
6、行后的输出结果是 ( )。 ( A) 2, 3, 3 ( B) 2, 3, 2 ( C) 2, 3, 1 ( D) 2, 2, 1 17 有以下程序: #include main() char c1, c2; c1=A+8一 4: c2=A+8一 5: printf(“ c, d n”, c1, c2); 已知字母 A的 ASCII马为 65,程序运行后的输出结果是 ( )。 ( A) E, 68 ( B) D, 69 ( C) E, D ( D)输出无定值 18 若有定义 int x, y;并已正确给变量赋值,则以下选项中与表达式 (xy)?(x+): (y+)中的条件表达式 (xy)等价的
7、是 ( )。 ( A) (x-y0) ( B) (xy0) ( D) (xy=0) 19 有以下程序: #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) 3 ( B) 2 ( C) 1 ( D) 0 20 若有定义: float x=1 5; int a=1, b=3, c=2;则正确的 switch语句是 ( )。 ( A) switch(a+b) case 1: pr4nff(“* n”); case 2+1:
8、 printf(“* n”); ( B) switch(int)x); case 1: prinff(“* n”); case 2: printf(“* n”); ( C) switch(x) case 1 0: prinff(“* n”); case 2 0: prinff(“* n”); ( D) switch(a+b) ease 1: printf(“* n”); ease c: printf(“* n”); 21 有以下程序: #include main() int y=9; for(; y0; y一一 ) if(y 3=0)printf(“ d”,一一 y); 程序运行后的输出结果是
9、 ( )。 ( A) 852 ( B) 963 ( C) 741 ( D) 875421 22 有以下程序: #include main() int i, j, m=1; for(i=1; i0; j一一 ) if(i*j3)break; m*=i*j; prinff(“m= d n”, m); 程序运行后的输出结果是 ( )。 ( A) m=4 ( B) m=2 ( C) m=6 ( D) m=5 23 有以下程序: #include int fun(int x, int y) if(x!=Y)retum(x+y) 2); else return(x); main() int a=4, b=
10、5, e=6; printf(“ d n”, fun(2*a, fun(b, e); ) 程序运行后的输出结果是 ( )。 ( A) 6 ( B) 3 ( C) 8 ( D) 12 24 有以下程序: #include int add(int a, int b)return(a+b); main() int k, (*f)(), a=5, b=10; f=add: . 则以下函数调用语句错误的是 ( )。 ( A) k=f(a, b); ( B) k=add(a, b); ( C) k=(*f)(a, b); ( D) k=*f(a, b); 25 有以下程序: #include main()
11、 int n, *p=NULL: *p=&n: prinff(“Input n: ”); 8eanf(“ d”, &p); prinff(“output n: ”); prinff(“ d n”,P); 该程序试图通过指针 P为变量 n读人数据并输出,但程序有多处错误,以下语句正确的是 ( )。 ( A) int n, *p=NULL; ( B) *p=&n; ( C) seanf(“ d”, &p) ( D) printf(” d n”, P); 26 下列定义数组的语句中,正确的是 ( )。 ( A) #define N 10 ( B) int N=10; int xN; int xN;
12、( C) int x010 ; ( D) int x; 27 有以下程序: #include main() int a=2, 3, 5, 4, i; for(i=0; i main() int b33=0, 1, 2, 0, 1, 2, O, 1, 2, i, j, t=1; for(i=0; i void swap(char*x, ehar*y) char t; t=*x; *x=y; *y=t; main() char*s1: “abe”, * s2=“123”; swap(s1, s2); prinff(“ s, s n”, s1, s2); 程序执行后的输出结果是 ( )。 ( A)
13、321, cba ( B) abe, 123 ( C) 123, abe ( D) 1bc, a23 32 有以下函数: int fun(char*x, char*y) int n=0; while(*x=*y)&爿 c X!= 0)x+; y+; n+; return II; 函数的功能是 ( )。 ( A)将 y所指字符串赋给 x所指存储空间 ( B)查找 X和 y所指字符串中是否有 0 ( C)统计 X和 y所指字符串中最前面连续相同的字符个数 ( D)统计 x和 y所指字符串中相同的字符个数 33 有以下程序: #include int fun() static int x=1: x*
14、=2: return x; main() int i, s=1; for(i=1; i struct S int a, b; data2=10, 100, 20, 200; main() struct S P: data1; printf(“ d n”, +(P a); 程序运行后的输出结果是 ( )。 ( A) 10 ( B) 11 ( C) 20 ( D) 21 37 有以下程序: #include #define PT 3 5; #define S(x)PT*x*x; main() int a=1, b=2; printf(“ 4 1f n”, S(a+b); 程序运行后的输出结果是 (
15、 )。 ( A) 7 5 ( B) 31 5 ( C)程序有错无输出结果 ( D) 14 0 38 有以下程序: #include main() unsigned char a=2, b=4, c=5, d; d=ab; d&=c; printf(“ d n”, d; 程序运行后的输出结果是 ( )。 ( A) 3 ( B) 4 ( C) 5 ( D) 6 39 有以下程序: #include #include main() int*a, *b, *c; a=b=c=(int*)malloc(sizeof(int); *aa=1; *b=2, *c=3; a=b; prinff(“ d, d,
16、 d n”, *a, *b, *c); 程序运行后的输出结果是 ( )。 ( A) 1, 1, 3 ( B) 2, 2, 3 ( C) 1, 2, 3 ( D) 3, 3, 3 40 以下叙述中正确的是 ( )。 ( A)当对文件的读 (写 )操作完成之后,必须将它关闭,否则可能导致数据丢失 ( B)打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖 ( C)在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第 1个数据 ( D) C语言中的文件是流式文件,因此只能顺序存取数据 二、程序填空题 41 给定程序中,函数 fun的作用是:不断从终端读人整数,
17、由变量 a统计大于 0的个数,用变量 c来统计 小于 0的个数,当输入 0时结束输人,并通过形参 pa和pb把统计的数据传回主函数进行输出。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:源程序存放在 BLANKl C中。不得增行或删行,也不得更改程序的结构 ! 试题程序: #include void fun(int*px, int*Py) *found* int1; scanf(” d”, &k); *found* while 2 if(k0)a+; if(k void fun(long s, long*t) int d; long sl=1: *found*
18、 t: 0; while(S0) d=s 10; *found* if(d 2=0) *t=d*s1+*t; s1*=10: S =10: main() long s, t; prinff(“ nPlease enter S: ”); scanf(“ ld”, s); fun(S, &t); prinff(“The result is: ld n”, t); 四、程序设计题 43 编写函数 fun,其功能是:将所有大于 1小于整数 m的非素数存入 xx所指数组中,非素数的个数通过 k返回。 例如,若输入 17,则应输出: 4 6 8 9 10 12 14 15 16。 注意:部分源程序在文件
19、PROG1 C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun(int m, int*k, intxx) main() int m, n, zz100; void NONO(); prinff(“ nPlease enter an integer number between 10 and 100: ”); seanf(“ d”, &n); fun(n, &m, ZZ); printf(“ n nThere are d nonprime number8 less than d: ”, m, Ii); fo
20、r(n=0; n0)。 19 【正确答案】 D 【试题解析】 在 if else语句中 else总是与离它最近的 if配对。本题目中 x为 1所以 !x为 0,所以执行 else if语句中的内容,判断 (x=0)是否成立,因为 x为 1所以条件不成立,所以 else if内部的 ifelse 语句不再执行,所以 y的值还是初始值0。 20 【正确答案】 A 【试题解析】 B选项中 switch(int)x); 语句中不应该有最后的分号。switch(expr1),中的 expr1不能用浮点类型或 long类型,也不能为一个字符串,所以 C错误。 case后面常量表达式的类型必须与 switc
21、h后面表达式的类型一致,所以 D错误。 21 【正确答案】 A 【试题解析】 第一次 for循环, y的值为 9, y 3的值为 0,满足条件打印一一y,即先减一后打印,所以打印 8;第二次 for循环, y的值为 7, y 3的值为 1,不执行打印语句;第三次 for循环, y的值为 6, y 3的值为 0,满足条件打印一一 y,即先减一后打印,所以打印 5;第 四次 for循环, y的值为 4,不满足 if条件,不执行打印语句;第五次 for循环, y的值为 3,满足 if条件,打印输出 2;第六次 for循环, y的值为 1,不满足条件,不执行打印语句。 22 【正确答案】 C 【试题解
22、析】 第一次外循环 i的值为 1,第一次内循环 j的值为 3,不满足条件执行 m*=i*j即 m的值为 3;第二次 j的值为 2,不满足条件执行 m*=i*j,即 m的值为 6;第三次 j的值为 1,不满足条件执行 m*=i*j,即 m的值仍为 6。第二次外循环 i的值为 2, j的值为 3,满足条件,执行 break语句,跳出循环。 23 【正确答案】 A 【试题解析】 本题中第一次调用为。 fun(8, fun(5, 6),闪为 fun(5, 6)返回值为5,所以第二次调用为 fun(8, 5)=6。所以选择 A。 24 【正确答案】 D 【试题解析】 D选项中 *f(a, b)表示调用后
23、返回一个指向整型数据的地址指针,即该函数的返回值为指针类型,所以不能将其赋值给整形变量 k。 25 【正确答案】 A 【试题解析】 选项 B的正确写法应为 p=&n;选项 C的正确写法应为 scanf(“d”, p);选项 D的正确写法应为 printf(“ d n”, *p)。 26 【正确答案】 A 【试题解析】 数组说明的一般形式为:类型说明符数组名 常量表达式 。 B选项中 N是变量,不能用变量定义数组长度。 C选项中数组长度是非法的一串数字。定义数组时必须为其指明长度, D选项中数组长度为空,所以非法。 27 【正确答案】 D 【试题解析】 第一次循环 i为 0, i 2为 0,执行
24、 switch(a0 2)中的 case 0语句后内容即 a0+, a0的值变成 3;第二次循环 i的值为 1, i 2为 1,执行 ease 1: ai=0;所以 a1的值变成 0;第三次循环 i的值为 2, i 2为 0,执行switch(a2 2)中的 case 1语句后的内容 a2一一, a2的值变成 4;第四次循环 i的值为 3, i 2为 1,执行 case 1: ai=0;所以 a3的值变成 0。 28 【正确答案】 B 【试题解析】 每次内循环只循环一次就结束,第一次外循环时t=t+b0b00=1+b00=1+0=1;第二次外循环时t=t+b1b11=1+b11=1+1=2;第
25、三次外循环时t=t+b2b22=2+b22=2+2=4。 29 【正确答案】 A 【试题解析】 数组定义后,不可以对数组整体赋值, s是二维数组,因 ss1是一维字符数组,即字符串,字符串赋值可以使用 strcpy(ss1, “right”);这样的形式,而选项 A中对二维数组中的第 “1”维 (相当于一个一维数组 )赋值,是不可以的。选项 B和 D是定义时对数组初始化,这是可以的。选项 C中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。 30 【正确答案】 A 【试题解析】 do*t+=s+; while(*s);不能因为当 *s= 0时, while(。 s)跳出循环,这样
26、字符串结束标志 0没有复制给 *t,造成 t不完整。注意, *t+=*s+是先执行 t=*s,然后才进行 t=t+1, s=s+1。 B、 C、 D都能将 0复制过去。 31 【正确答案】 D 【试题解析】 字符串是一个特殊的数组,所以按照数组的规则, s1应该指向的是数组的首地址,即 “abc”的第一个字符的地址。 s2指向的是 “123”的第一个字符的地址。调用 swap函数之后交换的是两个字符串的第一个字符 a和 1的内容,所以打印输出为 D. 32 【正确答案】 C 【试题解析】 本题中由循环条件可知遇到 0或 x与 y所指的字符的值不等中的一个条件时就结束,所以功能是统计 x和 y所
27、指字符串中最前面连续相同的字符个数。 33 【正确答案】 D 【试题解析】 本题目中静态局部变量 x,在静态存储区内分配存储单元。在程序整个运行期间都不释放。所以第一次循环 s的值为 2,第二次循环中,返回的 x的值为 4,所以 s的值为 8,第三次循环,返心的 x的值为 8,所以 s的值为 64。 34 【正确答案】 A 【试 题解析】 全局变量的作用域是从声明处到文件的结束。所以选择 A)。 35 【正确答案】 A 【试题解析】 关键字 typedef的作用只是将 C语言中的已有的数据类型作了置换,并不是增加新的类型,所以 A错误。 36 【正确答案】 D 【试题解析】 声明 data是结
28、构 S数组。初始化 data0 a=10;data0 b=100; data1 a=20; data1 b=200。主函数中 p=data1;即 p p a=data1 a; p b=data1 b;执行语句 prin(“ d n”, +(p a);打印输出时 p a先增 1再打印。 p a=data1 a=20,先增 1等于 21。 37 【正确答案】 C 【试题解析】 宏定义不是 C语句,末尾不需要有分号。所以语句 printf(“4 1f、 n”, S(a十 b);展开后为 prinif(“ 4 1f n”, 3 5; *a+b*a+b; );所以程序会出现语法错误。 38 【正确答案】
29、 B 【试题解析】 &按位与,如果两个相应的二进制位都为 1,则该位的结果值为1,否则为 0。 1按位或,两个相应的二进制位中只要有一个 为 1,该位的结果值为1。 2的二进制为 00000010, 4的二进制为 00000loo,所以做或运算结果为00000110,该数与 5即 00000101做与操作结果为 00000100,即 4。 39 【正确答案】 D 【试题解析】 malloc函数动态分配一个整型的内存空间,然后把函数返回的地址用 (int: *c)强制类型转换为整型指针,再把它赋给 a, b, c,即让指针变量 a, b,c都指向刚申请的内存空间。所以只有最后一个赋值语句 *c=
30、3的值保留在了该空间内,因为 a、 b、 c三个指针变量均指向该空间,所以打印该 空间内的数值为 3。 40 【正确答案】 A 【试题解析】 B选项中打开一个已存在的文件并进行了写操作后,原有文件中的全部数据不一定被覆盖,也可以对源文件进行追加操作等。 C选项中在一个程序中当对文件进行了写操作后,不用先关闭该文件然后再打开,才能读到第 1个数据,可以用 fseek()函数进行重新定位即可。 D选项中, C语言中的文件可以进行随机读写。 二、程序填空题 41 【正确答案】 (1)a=0, b=0, k (2)(k!=0) (3)scanf(“ d”, &k) 三、程序修改题 42 【正 确答案】 (1)*t=0; (2)if(d 2!=0)或 if(d 2=1) 四、程序设计题 43 【正确答案】 void fun(int m, int, *k, int xx) int i, j, n=0; for(i-4; im; i+) *找出大于 1小于整数 m的 非素数 * for(j=2; ji; j+)if(i j=0)break; if(ji)xxn+=i; *k=n; *返回非素数的个数 *