1、国家二级( C语言)机试模拟试卷 140及答案与解析 一、选择题 1 关于栈的叙述中正确的是 ( )。 ( A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化 ( B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化 ( C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化 ( D)以上说法都不正确 2 关于栈的叙述中正确的是 ( )。 ( A)栈底元素最先能被删除 ( B)栈顶元素最后才能被删除 ( C)栈顶元素永远不能被删除 ( D)栈顶元素最先被删除 3 某二叉树共有 5个节点,其中叶子节点只有 1个,则该二叉树的深度为 (假设根节点在第 1层 )( )。 ( A)
2、 3 ( B) 4 ( C) 5 ( D) 7 4 计算机软件可分为应用软件、系统软件和支撑软件。下面属于应用软件的是 ( ) ( A) Office文字处理系统 ( B) C语言编译程序 ( C) UNIX操作系统 ( D)数据库管理系统 5 不属于结构化程序基本结构的是 ( )。 ( A)顺序结构 ( B)重复 (循环 )结构 ( C)选择 (分支 )结构 ( D) GOTO跳转 6 关于软件设计的叙述中不正确的是 ( )。 ( A)系统总体结构图支持软件系统的详细设计 ( B)软件设计是将软件需求转换为软件表示的过程 ( C)数据结构与数据库设计是软件设计的任务之一 ( D) PAD图是
3、软件详细设计的表示工具 7 数据库查询语言是 ( )。 ( A)数据定义语言 ( B)数据管理语言 ( C)数据控制语言 ( D)数据操纵语言 8 一个学生可选多门课程,一门课程也可由多个学生来选。则学生和课程间的联系是 ( )。 ( A) 1: 1联系 ( B) 1: m联系 ( C) m: 1联系 ( D) m: n联系 9 有三个关系 R、 S和 T如 下:则由关系 R和 S得到关系 T的操作是 ( )。 ( A)自然连接 ( B)并 ( C)除 ( D)差 10 在 C语言中可以作为无符号整数类实例化值的是 ( )。 ( A) 123 ( B) 123 ( C) 0 123 ( D)整
4、数集合 1, 2, 3 11 关于 C语言语句的叙述中正确的是 ( )。 ( A) C语言的数值常量中夹带空格不影响常量值的正确表示 ( B) C语言中的变量可以在使用之前的任何位置进行定义 ( C)在 C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 ( D) C语言中的注释不可 以夹在变量名或关键字的中间 12 关于 C程序运行的叙述中错误的是 ( )。 ( A) C程序在运行过程中所有计算都以十六进制方式进行 ( B) C程序在运行过程中所有计算都以二进制方式进行 ( C)所有 C程序都需要编译链接无误后才能运行 ( D) C程序中字符变量存放的是字符的 ASC 码值 13 以下
5、不合法的字符常量是 ( )。 ( A) n ( B) ( C) 083 ( D) xcc 14 以下合法的定义语句是 ( )。 ( A) float, a, b; ( B) float a=b=7; ( C) floata: b; ( D) float a=7, b=7; 15 若 int a=3, b=2, c=1;则赋值表达式有误的是 ( )。 ( A) a=(b+4)=1; ( B) a=b=c+3; ( C) a=(b=2)+c ( D) a=2+(b=c=3); 16 与 while(E)中的 (E)不等价的表达式是 ( )。 ( A) (E 0E 0) ( B) (E=0) ( C
6、) (! E=0) ( D) (E! =0) 17 已知 A和 a的 ASC 码值分别是 65和 97,以下不能将变量 c中的大写字母转换 为对应小写字母的语句是 ( )。 ( A) c=(c一 A) 32+a ( B) c=c+32 ( C) c=c A+a ( D) c=(c一 A) 26+a 18 若对于 int x, y;能通过 scanf( d; d, &x, &y);将整数 1赋给变量 x, 2赋给变量 y的输入数据是 ( )。 ( A) 1 2 ( B) 1, 2 ( C) 1; 2 ( D) 12 19 k=a b? (b c? 1: 0): 0的功能是 ( )。 ( A) i
7、f(a b)(b c)k=1; else k=0; ( B) if(a b)&(b c)k=1; else k=0; ( C) if(a =b)k=0; else if(b =c)k=1; ( D) if(a b)k=1; else if(b c)k=1; else k=0; 20 有以下程序: #lnclude main() int x=1, y=3; for(; x 4; x+)y+=x; x+=1; printf( d, d n, x, y); 程序运行后的输出结果是 ( )。 ( A) 5, 7 ( B) 4, 9 ( C) 5, 9 ( D) 4 7 21 有以下程序: #lnclu
8、de main() int i, j, x=14; for(i=1; i =3; i+) for(j=3; j: i; j+)x=x j; printf( d n, x); 程序运行后的输出结果是 ( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 22 有以下程序: #include main() int x=1; for(; x 8; x+) if(x 3) printf( d, , x+); continue; printf( d, , +x); 程序运行后的输出结果是 ( )。 ( A) 1, 4, 5, 7 ( B) 1, 3, 5, 7 ( C) 2, 4, 5, 8
9、 ( D) 8, 5, 4, 2 23 关于 C语言函数的叙述中错误的是 ( )。 ( A) C程序必须由一个或一个以上的函数组成 ( B)函数调用可以作为一个独立的语句存在 ( C)若函数有返回值,必须通过 return语句返回 ( D)函数形参的值也可以传回给对应的实参 24 有以下程序: #include main() int a=2, b=3, c=4; int*p1=&a, *p2=&b, *p=&c; *p=2+*p1*(*p2); printf( d n, c); 程序执行后的输出结果是 ( )。 ( A) 4 ( B) 2 ( C) 3 ( D) 8 25 有以下程序: #in
10、clude void fun(int*p, int*q); main() int m=1, n=2, *r=&m; fun(r, &n); printf( d, d, m, n); void fun(int*P, int*q) P=p+1; *q=*q*5; 程序运行后的输出结果是 ( )。 ( A) 1, 5 ( B) 1, 10 ( C) 2, 5 ( D) 2, 10 26 若有定义语句: int a23, *P; 则以下语句中正确的是 ( )。 ( A) p=a; ( B) p=a12; ( C) p=&a12; ( D) p=&a; 27 以下程序中函数 fun的功能是:当 flag
11、为 1时,进行由小到大排序;当 flag为 0时,进 行由大到小排序。 #include void fun(int b, int n, int flag) int i, j, t; for(i=0; i n一 1; i+) for(j=i+1; j n; j+) if(flag? bi bj: bi bj) t=bi; bi=bj; bj=t main() int a10=7, 3, 5, 1, 8, 6, 4, i, *p; p=a; fun(p+1, 5, 0); fun(a, 5, 1); for(i=0; i 10; i+) printf( d, , ai); 程序运行后的输出结果是
12、( )。 ( A) 3, 5, 6, 7, 8, 1, 4, ( B) 8, 7, 6, 5, 3, 1, 4, ( C) 8, 7, 6, 5, 4, 3, 1, ( D) 1, 3, 4, 5, 6, 7, 8, 28 有以下程序: #include main() int 812=1, 2, 3, 4, 4, 3, 2, 1, 0, 1, 2, 3, c5=0, i; for(i=0; i 12; i+) csi+; for(i=0; i 5; i+) printf( d, , ci); printf( n); 程序运行后的输出结果是 ( )。 ( A) 1, 3, 3, 3, 2 ( B
13、) 4, 3, 3, 3, 2 ( C) 1, 2, 3, 4, 5 ( D) 5, 4, 3, 2, 1 29 关于字符串的定义语句,以下选项正确的是 ( )。 ( A) char str= x34; ( B) char str= 0; ( C) char str=; ( D) char str= 28; 30 关于字符串的叙述中正确的是 ( )。 ( A) C语言中有字符串类型的常量和变量 ( B)两个字符串中的字符个数相同时才能进行字符串大小的比较 ( C)可以用关系运算符对字符串的大小进行比较 ( D)空串比空格打头的字符串小 31 有以下程序: #include void fun(c
14、har*x, char*y) while(*x=*)x+; while(*y=*x)y+; x+; main() char*s=*x*y, t80; fun(s, t); puts(t); 程序运行后的输出结果是 ( )。 ( A) xy ( B) x ( C) x*y ( D) y 32 下列函数的功能是 ( )。 void fun(char*x, char*y) while(*y=*x)! = 0) x+; y+; ( A)使指针 y指向 x所指字符串 ( B)求 x和 y中长度较长的那个字符串的长度 ( C)比较字符串 x和 y ( D)将 x所指字符串赋给 y所指字符串空间 33 有以
15、下程序: #include int f(int a) int b; if(a=1) return(3); b=a f(a一 2); return b; main() printf( d n, f(7); 程序执行后的输出结果是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 7 34 有以下程序: #include int fun() static int m=l; retum m*=3; main() int i=2, s=1; while(i一一 )s=fun(); printf( d n, s); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 3 ( C) 9
16、( D) 2 35 关于结构体类型的说明和变量定义,以下选项正确的是 ( )。 ( A) stmct REC; char c; int m; float s; ; REC t1, t2; ( B) typedef struct char c; int m; float s; REC; REC t1, c2; ( C) typedef struct REC; char c; int m; float s; t1, t2; ( D) struct char c; int m; float s; REC; REC t1, t2; 36 在如图所示的链表中,可将 q所指节点从链表中删除并释放该节点的是
17、 ( )。( A) (*p) next=(*q) next; free(p); ( B) p=q一 next; free(q); ( C) p=q; free(q); ( D) p一 next=q一 next; free(q); 37 有以下程序: #include #include stmct STU int a; char b10; float c; ; void fun(struct STU t); main() struct STU a=1001, Tim, 635 0; fun(a); printf( d, s, 5 1f n, a a, a b, a c); void fun(st
18、ruct STU t) t a=1002: strcpy(t b, Dom); t c=701 0; 程序运行后的输出结果是 ( )。 ( A) 1001, Tim, 635 0 ( B) 1002, Dom, 701 0 ( C) 1002, Dom, 701 0 ( D) 1001, Tim, 701 0 38 有以下程序: #include #define M 6 #define g(x)(x*M) main() int m, n, k=1; m=g(k+1); n=g(2); printf( d, d n, m, n); 程序运行后的输出结果是 ( )。 ( A) 7, 12 ( B)
19、 12, 12 ( C) 7, 11 ( D) 7, 7 39 设 fp为指向某二进制文件末尾的指针,则函数 feof(fp)的返回值为 ( )。 ( A) 0 ( B) 0 ( C) 1 ( D)非 0值 40 有以下程序: #include main() intx=5, y=1, t; t=(x 1)ly; printf( d n, t); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 11 ( C) 6 ( D) 21 二、程序填空题 41 下列给定程序中,函数 fun的功能是:从形参 ss所指字符串数组中,删除所有串长超过 k的字符串,函数返回剩余字符串的个数。 SS所指字
20、符串数组中共有 N个字符串,且串长小于 M。 请在程序的下划线处填入正确的内容并将 下划线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANK1 C中。不得增行或删行,也不得更改程序的结构! #include #include #define N 5 #define M 10 int fun(char(*ss)M, int k) int i, j=0, len; *found* for(i=0; i 【 1】 ; i+) len=strlen(ssi); *found* if(1en =【 2】 ) *found* strcpy(ssj+, 【 3】 ); return j; ma
21、in() char xNM=Beijing, Chongqing, Tianjin, Nanjing, Guangzhou; int j, f; printf( nThe original string n n); for(i=0; i N; i+) puts(xi); printf( n); f=fun(x, 7); printf(The string witch length is less than or equal to 7: n); for(i=0; i f; i+)puts(xi); printf( n); 三、程序修改题 42 下列给定程序中函数 fun的功能是:将长整型数中各位
22、上为偶数的数依次取出,构成一个新数放在 t中。高位仍在高位,低位仍在低位。 例如,当 s中的数为 87653142时, t中的数为 8642。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件 MOD11 c中,不得增行或删行,也不得更改程序的结构! #include void fun(10ng s, long*t) int d: long sl=1; *found* t=0; while(s 0) d=s 10; *found* if(d 2=1) *t=d*sl+*t: sl*=10: s =10; main() long s, t; printf( nPlease en
23、ter s: ); scanf( ld, &s); fun(s, &t): printf(The result is; ld n, t); 四、程序设计题 43 编写函数 fun,其功能是:将所有大于 1小于整数 m的非素数存入 xx所指数组中,非素数的个数通过 k返回。 例如,若输入 17,则应输出: 4 6 8 9 10 12 14 15 16。 注意:部分源程序在文件 PROG1 C中。请勿改动主函数 main和其他 函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun(int m, int*k, int xx) main() int m
24、, n, zz100; void NONO(); printf( nPlease enter an integer number between 10 and 100: ); scanf( d, &n) fun(n, &m, zz); prinff( n nThere are d non prime numbers less than d: , m, n); for(n=0; n m; n+) printf( n 4d, zzn); NONO(); void NONO() *请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * int m, n, zz100; FIL
25、E*rf, *wf; rf=fopen(in dat, r); Wf=fopen(out dat, w); fscanf(rf, dt, &n); fun(n, &m, zz); fprintf(wf, d n d n, m, n); for(n=0; n m; n+) fprintf(wf, dkn, zzn); fclose(rf); fclose(wf); 国家二级( C语言)机试模拟试卷 140答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 栈的存取原则是先进后出,所以,栈底指针不变,栈中元素随栈顶指针的变化而动态变化。 2 【正确答案】 D 【试题解析】 栈的存取原则是先
26、进后出,所以最后进入的栈顶元素将最先被删除。 3 【正确答案】 C 【试题解析】 二叉树中度为 0的节点 (叶子节点 ),总是比度为 2节点多 1个,所以此题中,度为 2的节点是 1一 1=0个,因此,本题中的其他节点均为度为 1的节点,该二叉树只有一个分支,且深度为 5。 4 【正确答案】 A 【试题解析】 操作系统、编译程序和数据库管理系统都属于系统软件。 5 【正确答案】 D 【试题解析】 结构化程序基本结构包括顺序结构、重复 (循环 )结构和选择 (分支 )结构。 6 【正确答案】 A 【试题解析】 软件设计是将软件需求转换为 软件表示的过程,设计过程中 PAD图是软件详细设计的表示工
27、具。但系统总体结构图主要是确定算法和数据结构,而非详细设计。 7 【正确答案】 D 【试题解析】 数据操纵语言是指对数据的增、删、改、查;数据控制语言负责数据的完整性、安全性的定义与检查等,数据定义与数据管理语言也不涉及查询。 8 【正确答案】 D 【试题解析】 一个学生可选多门课程,一门课程也可由多个学生来选,所以他们之间是多对多的关系。 9 【正确答案】 D 【试题解析】 S+T=R,所以 T=S R。 10 【正确 答案】 B 【试题解析】 选项 A是负数,选项 C是小数,选项 D是数组,所以只有选项 B正确。 11 【正确答案】 D 【试题解析】 C语言的常量中不能夹带空格, C语言的
28、变量必须是先定义才能使用, C语言的表达式两边可以是不同的类型,在运算时会进行强制转换成数度较高的类型。 12 【正确答案】 A 【试题解析】 C程序在运行过程中所有计算都以二进制方式进行,所以 A项错误,其他选项均正确。 13 【正确答案】 C 【试题解析】 AB两项是转义字符,选项 D是十六进制,选项 C是八进制, 但其中不能包含 8, C项错误。 14 【正确答案】 D 【试题解析】 选项 A的关键字与变量名之间应该用空格而不是逗号,选项 B不能对没有定义的变量 (a)赋值,选项 C中间的冒号使用错误。 15 【正确答案】 A 【试题解析】 不能给表达式赋值。 16 【正确答案】 B 【
29、试题解析】 while(E)中的 E是指不为 0的值, A项与 D项正确,选项 C与选项D等价,选项 B不等价。 17 【正确答案】 A 【试题解析】 选项 B和 C是最常用的方法,因为 C与 A之间的差值是小于 26的,所 以 D选项与 C选项等值,唯有选项 A有误。 18 【正确答案】 C 【试题解析】 scanf是严格按照格式获取数据的,因此在输入时需要以分号进行分隔。 19 【正确答案】 B 【试题解析】 这是问号表达式的嵌套,问号前的表达式为真时 k取冒号前的值,否则 k取冒号后面的值。 20 【正确答案】 A 【试题解析】 注意到 for循环中的循环变量 x除了在循环表达式中加 1
30、外,在循环体中也有个加 1的运算,所以循环变量 x的值每次会加 2,循环体将循环 2次,x=1, x=3,所以 y=3+1+3=7,循环 后 x的变量是 5。 21 【正确答案】 C 【试题解析】 外部 for循环变量 i=1, 2, 3,内部 for循环的判断条件是 j =i,且 j的初值是 3,所以只有外部循环 i=3时,才能执行内部循环,且只循环一次,此时 i=3,所以 x=14 3=2。 22 【正确答案】 A 【试题解析】 注意循环变量在循环体中有个加 1的运算,所以循环变量 x=1,3, 5, 7;当 x是 3的整数倍时,输出 +x,当 x不是 3的整数倍时输出 x+,所以结果是
31、1, 4, 5, 7。 23 【正确答案】 D 【试题解析】 函数形参 是形式上的变量,主调用函数中的实参向函数的形参传递数据是值传递,所以形参的值不会回传给对应的实参。因此 D选项说法不正确。 24 【正确答案】 D 【试题解析】 指针指向的是变量的地址,所以指针变量所指向的空间的值发生变化,其指向的变量的值会同时发生变化,因此, c=2+a*b=2+2*3=8。 25 【正确答案】 B 【试题解析】 函数是地址传递,所以子函数中的变化会反映到主函数中的变量上,但要注意的是,在指针引用时必须在前面加上 *,否则操作的是地址本身,而不是其指向的变量的值,因此 p=p+1会将 p指向下一个整型地
32、址, *q=*q*5会操作 n的值, m的值没有变化,所以结果是 1, 10。 26 【正确答案】 C 【试题解析】 a是一个二维数组,类型是 int*, a12是一个 int型, &a12是一个 int*,所以 C项正确, a是数组名不能取地址,所以 D项不正确。 27 【正确答案】 A 【试题解析】 子函数的功能题目已经明确,所以不用去关注;注意第 1次调用并排序的是从数组的第 2个元素开始的 5个元素,所以排序后的结果是: 7, 8, 6,5, 3, 1, 4,第 2次调用的是整个数 组,并对前 5个元素进行排序,最终结果是3, 5, 6, 7, 8, 1, 4。 28 【正确答案】 A
33、 【试题解析】 for循环中是对 c赋值,但 c的下标由 si确定,所以通过数 s中的下标个数便可知对应的 c的值,其中 s的值中, 0, 1, 2, 3, 4分别出现了1, 3, 3, 3, 2次,所以 c0=1, c1=c2: c3=3, c4=2。 29 【正确答案】 B 【试题解析】 字符串是用数组存放的一串字符,要用双引号括起来,所以 C项和 D项不正确,它们是没有用双引号, A)项不正确 ,因为定义的是字符而不是字符串。 30 【正确答案】 D 【试题解析】 C语言中没有字符串类型的数据,只有字符型数据,字符串是用数组存放的一组字符,字符串比较是只比较第一个不相同的字符的大小 (A
34、SC 代码 ),字符串的比较可以使用库函数 atrcnp(),另外也可以缩写程序来比较,但不能使用关系运算符进行比较。 31 【正确答案】 C 【试题解析】 子函数的功能是将字符串 x拷贝到宇符串 y中,如果 x前面是 *,则从不是 *的字符开始拷贝,但如果有非 *得字符出现,则后面即使出现 *也会被拷贝。 32 【正确答案】 D 【试题解析】 子函数中, while循环的差别式中先将 x指向的字符内容赋值给 y所指的字符空间,再判断其是否是字符串结束符,如果不是结束符, x和 y指针分别指向各自空间的下一个字符,直到碰到字符串结束符为止。所以选项 D正确。 33 【正确答案】 B 【试题解析
35、】 本题考查的是函数的迭代调用,使用代入法,当传入 7时, b=7一(5一 (3一 fun(1), fun(1)=3,所以 b=7一 (5一 (3 3)=7一 5=2。 34 【正确答案】 C 【试题解析】 此题考查静态变 量,静态变量只在初次定义时赋初值,且在内存中有固定的存储空间,所以第 1次运行 fun()函数时, m的初值是 1,返回 3;当第 2次调用时, m的值依然还是 3,所以返回的值是 9。 35 【正确答案】 B 【试题解析】 选项 A和 C在 REC后面不能有分号, D项中的 REC已经是定义好的机构体变量,故不能用其定义变量; B项中使用了 typedef,所以 REC是
36、前面定义的结构体类型的别名,所以可以用来定义变量。 36 【正确答案】 D 【试题解析】 要将结点 b从链表中删除,应先将 a的指针域指向 b结点的下一个结 点,即 p一 next=q一 next,然后释放指针 q的空间。 37 【正确答案】 A 【试题解析】 此题主要是考查结构体作为子函数参数的值传递还是地址传递的问题,子函数的功能是将形参的值用一个固定的值覆盖,但因为是值传递,所以实参的值不会变化,所以在主函数中的结构体 a的值没有发生变化。 38 【正确答案】 A 【试题解析】 宏定义一定要先代入再计算表达式的值, m=(k+1*6)=(1+6)=7;n=(2*6)=12。 39 【正确
37、答案】 D 【试题解析】 feof()碰到文件结 束符会返回非 0值,否则返回 0值,所以选项 D正确。 40 【正确答案】 B 【试题解析】 此题考查按位操作,首先是 x进行按位左移 1位,相当于乘以 2,5*2=10,写成二进制是 00001010, y=1=00000001,它们按位操作的结果是00001011,是 11。 二、程序填空题 41 【正确答案】 1 N 2 k 3 ssi 【试题解析】 填空 1: for循环语句作用是遍历字符串数组中的每一个字符串,所以循环变量 i的循环条件是 i N。 填空 2:题目要求删除串长度小于 k的 字符串,所以 if条件语句的条件表达式是len
38、 =k。 填空 3:通过字符串拷贝函数将串长不大于 k的字符串另存,并记录个数。 字符串拷贝函数 strcpy,其格式为: strcpy(字符数组名 1,字符数组名 2)功能:把字符数组 2中的字符串拷贝到字符数组 1中。字符串结束标识 0也一同拷贝。字符数组名 2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 三、程序修改题 42 【正确答案】 1 *t=0; 2 if(d 2=0) 【试题解析】 1由函数定义可知,变量 t是指针变量,所以对 t进行赋初值 0是不对的。因为 t指向的是存放新数的变量,所以此处应给新数赋初值 0,即 *t=0。 2变量 d表示数 s各个位上
39、的数,此处的 if条件应为判断 d是否为奇数。 四、程序设计题 43 【正确答案】 void fun(int m, int*k, int xx) int i, j, n=0; for(i=4; i m; i+) *找出大于 1小于整数 m的非素数 * for(j=2; j i; j+)if(i j=0)break; if(j i)xxn+=i; *k=n; *返回非 素数的个数 * 【试题解析】 题目要求将 1 m的非素数存入数组中,应使用循环判断结构。循环语句用来遍历 1 m的每个数,判断语句用来判断该数是否为素数,若不是素数,则将其存入数组中。这道题目是考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。判定一个数是否为素数,即该数除了能被 1和它本身整除外,不能被任何数整除。代码实现为: for(j=2; j i;j+)if(i j=0) *如余数为 0,证明 i不是素数 *此语句需要熟记,很多判断素数的题目也可通过此法解决。