1、国家二级( C语言)机试历年真题试卷汇编 6及答案与解析 一、选择题 1 下列叙述中正确的是 ( )。 ( A)程序可以作为算法的一种表达方式 ( B)算法的有穷性是指算法的规模不能太大 ( C)算法的复杂度用于衡量算法的控制结构 ( D)算法的效率与数据的存储结构无关 2 某循环队列的存储空间为 Q(1: m),初始状态为 front=rear=m。现经过一系列的入队操作和退队操作后, front=m一 1, real=m,则该循环队列中的元素个数为( )。 ( A) m一 1 ( B) 1 ( C) m ( D) 0 3 能从任意一个节点开始没有重复地扫描到所有节点的数据结构是 ( )。
2、( A)循环链表 ( B)双向链表 ( C)二叉链表 ( D)有序链表 4 某棵树中共有 25个节点,且只有度为 3的节点和叶子节点,其中叶子节点有 7个,则该树中度为 3的节点数为 ( )。 ( A)不存在这样的树 ( B) 7 ( C) 8 ( D) 6 5 在最坏情况下,二分查找法的时间复杂度为 ( )。 ( A) log2n ( B) ( C) log2n ( D) n 6 某二叉树共有 730个节点, 其中度为 1的节点有 30个,则叶子节点个数为( )。 ( A)不存在这样的二叉树 ( B) 351 ( C) 1 ( D) 350 7 软件开发中需求分析的主要任务是 ( )。 (
3、A)定义和描述目标系统 “做什么 ” ( B)获取需求 ( C)给出软件解决方案 ( D)需求评审 8 软件按功能可以分为应用软件、系统软件和支撑软件 (或工具软件 )。下面属于系统软件的是 ( )。 ( A)学生成绩管理系统 ( B) ERP系统 ( C)办公自动化系统 ( D) LINIX系统 9 医生可以为病人开不同 的药,而同一种药也可由不同医生开给病人,则实体医生和实体药之间的联系是 ( )。 ( A)多对多 ( B)一对一 ( C)多对一 ( D)一对多 10 学生选课成绩表的关系模式是 SC(S#, C#, G),其中 S#为学号, C#为课号, G为成绩,检索课号为 2且成绩及
4、格的学生学号的表达式为 ( )。 ( A) S#(C#=2 G60(SC) ( B) G60(SC) ( C) C#=2 G60(SC) ( D) S#(C#=2(SC) 11 若想定义 int型变量 a, b, c, d并都赋值 为 1,以下写法中错误的是 ( )。 ( A) int a=b=c=d=1; ( B) int a=1, b=1, c=1, d=1; ( C) int a, b, c, d; a=b=c=d=1; ( D) int a, b, c, d=1; a=b: c=d; 12 若有定义: char C; double d;程序运行时输入: 1 2,能把字符 1输入给变量
5、c、数值 2输入给变量 d的输入语句是 ( )。 ( A) scarff(“ d If“, c, d); ( B) scanf(“ c If“, c, d); ( C) scanf(“ c f“, c, d); ( D) seanf(“ d f“, c, d); 13 输出语句: printf(“ dn“, 11+011);的输出结果是 ( )。 ( A) 20 ( B) 22 ( C) 022 ( D) 021 14 以下叙述正确的是 ( )。 ( A)有些算法不能用 3种基本结构来表达 ( B) C语言程序不编译也能直接运行 ( C)结构化程序的 3种基本结构是循环结构、选择结构、顺序结构
6、 ( D)如果 C语言程序实现的算法很简单,则计算机不进行任何代码转换就能执行程序 15 若有定义: double x;,则表达式: x=0, x+10, x+的值是 ( )。 ( A) 11 0 ( B) 10 0 ( C) 0 0 ( D) 1 0 16 有以下程序: #include main() int x=1, y=0, a=0, b=0; switch(x) case 1: switch(y) Case 0: a+; break; Case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf(“a= d, b= d
7、 n“, a, b); 程序的运行结果是 ( )。 ( A) a=2, b=2 ( B) a=2, b=1 ( C) a=1, b=1 ( D) a=1, b=0 17 以下程序段中的变量已正确定义 for(i=0; i main() char c; for(; (c=getchar()!=#; ) if(c=a c,则输出结果是 ( )。 ( A) AbCdEFg ( B) ABCDEFG ( C) BCDEFGH ( D) bcdefgh 19 有以下程序: #include int f(int x); main() int n=1, m; m=f(f(f(n); printf(“ dkn
8、“, m); int f(int x) return x*2; 程序运行后的输出结果是 ( )。 ( A) 4 ( B) 2 ( C) 8 ( D) 1 20 关于地址和指针,以下叙述正确的是 ( )。 ( A)可以通过强制类型转换让 char型指针指向 double型变量 ( B)函数指针 p指向一个同类型的函数 f时,必须写成: p= f; ( C)指针 p指向一个数组 f时,必须写成: p= f; ( D)一个指针变量 p可以指向自身 21 有以下程序: #include #define N 4 int fun(int aN) int i, j, x=0; for(i=0; i #de6
9、ne N 3 void fun(int xN, int r1, int*r2) int i, j; *r1=*r2=0; for(i=0; i main() char S=“012xy 08s34f4w2“; int i, n=0; for(i=0; si!=0; i+) if(Si=0 0&si int mul(int val) static int init=1; return init *=val; main() int i; for(i=1; i void fun(int n) static int k=0; if(n struct Sint n; int a20; ; void f(
10、struct S*P) int i, j, t; for(i=0; in一 1; i+) for(j=i+1; jn; J+) if(paipaj)t=pai; pai=paj; paEj=t; main() int i; struct S s=10, 2, 3, 1, 6, 8, 7, 5, 4, 10, 9; f(&s); for(i=0; i typedef struet stu char name10; char gender; int scpre; STU; void f(STU a, STU*b, STU c) *b=c=a; printf(“ s, c, d, “, bName,
11、 bgender, bscore); printf(“ s, c, d, “, c name, c gender, c score); main() STU a=“Zhao“, m, 290, b=“Qian“, f, 350, c=“Sun“, m, 370; f(a, &b, c); printf(“ s, c, d, “, b name, b gender, b score); printf(“ s, c, d n“, c name, c gender, c score); 程序运行后的输出结果是 ( )。 ( A) Zhao, m, 290, Zhao, m, 290, Zhao, m
12、, 290, Sun, m, 370 ( B) Zhao, m, 290, Zhao, m, 290, Zhao, m, 290, Zhao, m, 290 ( C) Zhao, m, 290, Zhao, m, 290, Qian, f, 350, Sun, m, 370 ( D) Zhao, m, 290, Zhao, m, 290, Qian, f, 350, Zhao, m, 290 31 有以下程序: #include #define SUB(x, y)(x)*(y) main() int a=3, b=4; printf(“ d n“, SUB(a+, b+); 程序运行后的输出结
13、果是 ( )。 ( A) 15 ( B) 12 ( C) 16 ( D) 20 32 有以下程序: #include main() strut cmint x; int y; a2=4, 3, 2, 1; print(“ d n“, a0 y a0 x*a1 x); 程序运行后的输出结果是 ( )。 ( A) 1 ( B) 4 ( C) 0 ( D) 3 33 以下选项中的编译预处理命令行,正确的是 ( )。 ( A) #define E 2 38 ( B) #define PI_2 1 56 ( C) #define int INT ( D) #DEFINE TRUE 34 设有以下程序段:
14、 struct book float price; char language; char titleE20; rec, *ptr; ptr=&rec; 要求输入字符串给结构体变量 rec的 title成员,错误的输入语句是 ( )。 ( A) scanf(“ 8“, ptr title); ( B) scanf(“ 8“, rec title); ( C) scanf(“ 8“, (*ptr) title); ( D) scanf(“ 8“, ptrtitle); 35 有以下程序: #include #include struct computer char CPU10; ; main()
15、 struct computer pcl, pc2; strcpy(pc1 CPU, “3 2G“); strcpy(pc2 CPU, “?“); pc1=pc2; printf(“ s n“, pc1 CPU); 程序运行后的输出结果是 ( )。 ( A) ? ( B) 3 2G ( C) ? ( D) 7 2G 36 有以下程序: #include main() int a=2, b; b=(a=1)+4; printf(“ d, d“, a, b); 程 序运行后的输出结果是 ( )。 ( A) 1, 5 ( B) 2, 4 ( C) 2, 6 ( D) 2, 5 37 若要建立下图所示
16、的存储结构,以下正确的程序段是 ( )。( A) char*q, *p, c; p= c; q= p; ( B) char*q, *p, c; p= c; q=*p; ( C) char*q, *p, c; p= c; *q=p; ( D) char*q, *p, c; q=p; p=* c; 38 有以下程序: #include struct tt int x; struct tt*y; s3=1, 0, 2, 0, 3, 0; main() struet tt*P=s+1; py=s; printf(“ d, “, px); p=py; printf(“ d n“, px); 程序运行后的
17、输出结果是 ( )。 ( A) 2, 3 ( B) 2, 1 ( C) 1, 2 ( D) 3, 1 39 有以下程序: #include main() int x=3, y=5; x=xy; y=xy; x=xy; printf(“ d, d n“, x, y); 程序运行后的输出结果是 ( )。 ( A) 3, 5 ( B) 5, 3 ( C) 35, 35 ( D) 8, 8 40 有以下程序: #include struct tt int x; struct tt*y; s2=1, 0, 2, 0; main() struct tt*P=8; P一 y=s; printf(“ d“,
18、+pX); 程序运行后的输出结果是 ( )。 (A)2 (B)0 (C)1 (D)3 ( A) 2 ( B) 0 ( C) 1 ( D) 3 二、程序填空题 41 函数 fun的功能是:在有 n个元素的结构体数组 std中,查找有不及格科目的学生,找到后输出学生的学号;函数的返回值是有不及格科目的学生人数。例如,主函数中给出了 4名学生的数据,则程序运行的结果为: 学号: N1002学号: N1006 共有 2位学生有不及格科目 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构
19、 ! 试题程序: #include typedef struet char num8; double score2; *found * 【 1】; int fun(STU std, int n) int i, k=0; for(i=0; i int fun(int n, int a, int*k) int m=0, i, t; t=n; *found* for(i=0; i void NONO(); void fun(int*a, int*b, int*c, int*d) main() int a, b, C, d; printf(“请输入 4个整数: “); scanf(“ d d d d“
20、, a, &b, &c, &d); printf(“原始顺序: d, d, d, d n“, a, b, C, d); fun(&a, &b, &c, &d); printf(“处理后: d, d, d, d n“, a, b, C, d); NONO(); void NONO() *木本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*fp, *wf; int i, a, b, c, d; fp=fopen(“c: test in dat“, “r“); wf=fopen(“c: test out dat“, “w“); for(i=0; i”, );可知 scanf
21、()的第二个参数是地址,因此,从 4个答案中可以判断,只有选项 A是 pi的地址,其他的均是变量本身。故答案为 A选项。 25 【正确答案】 C 【试题解析】 题意统计字符 s中阿拉伯数字的个数。 char s=012xy08s34f4w2;元素是字符型。 0=48;而 0=0;因此可以计算出 G之前阿拉伯数字的个数,由字符串 s可知,有 3个阿拉伯数字。答案为 C选项。 26 【正确答案】 A 【试题解析】 *p3p30 是一个字符,不是字符串,选项 A错误。 p3和str2和 *p分别代表了 ddd, cee, aaa。答案为 A选项 o 27 【正确答案】 A 【试题解析】 static
22、静态变量只在声明时初始化一次。 mul()函数定义了累乘,第一次 init=1, init*=val,第二次 init=1, val=2,第三次 init=2, val=3,第四次init=6, val=4,第五层 init=24, val=5,因此结果为 1, 2, 6, 24, 120。故答案为A选项。 28 【正确答案】 A 【试题解析】 fun()函数使用了静态变量,静态变量只在声明时初始化一次。首先实参的数值是一 12, if判断后输出负号,并令 n=12,计算 k+=n 10k+=22 ,因此输出 2,然后将数值除以 10,结果为 1,递归调用 fun()函数。第二次调用fun()
23、,此时 n=1, k=2,计算 k+=n 10k+=13 ,因此打印 3。故最后打印结果为一 2, 3,。故答案为 A选项。 29 【正确答 案】 A 【试题解析】 结构体 s中 n代表数组的实际长度, a是个定长数组。函数 f()对结构体 s内的 a数组元素使用冒泡法进行递增排序。因此最终数组的元素是一个递增序列。故答案为 A选项。 30 【正确答案】 A 【试题解析】 C语言函数参数传递分为两种情况。 值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部
24、变量进行,不会影响主调函数的实参变量的值。 地址传递 过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 题设中,参数 b是地址传递,因此会直接影响实参变量。 a, c是值传递,传递的是 a, c的拷贝,不会对 a, c实参产生影响,因此,调用函数返回, c没有被修改, b被修改了。故答案为 A选项。 31 【正确答案】 B 【试题解析】 #define命令是 C语言的宏定
25、义命令,标识符一般使用大写,为了与其他标识符区分,将标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。宏定义不进行其他操作,仅仅只是替换标识符。后置自增运算: k+表示先运算,后自加,意思是遇到 k+了,先把当前 k的值拿来参加运算,后面再去管它的自加。 SUB(a+, b+)(a+)*(b+)3*4 。故答案为 B选项。 32 【正确答案】 C 【试题解析】 由结构体的定义初始化可知, a0 x=4, a0 y=3, a1 x=2,a1 y=1,因此计算 a0 y a0 x*a1 x=3 4*2=(3 4)*2=0*2=0,故答案为 C选项。 33 【正确答案】 A 【
26、试题解析】 无参宏定义格式: #deftne标识符字符串,标识符与 C语言规定相同,因此,可知选项 B多了一个 #,选项 C使用了 C语言的关键字,选项 D格式不对。因此答案为 A选项。 34 【正确答案】 A 【试题解析】 符号 “一 ”是指针特用的符号, “ ”用于指定元素的成员。 ptr是指针,只能用符号 “一 ”,因此选项 A错误。 *p是指定元素 (tee)可以 使用 “ ”运算,因此选项 D正确。选项 B, rec title代表数组 title,同理选项 C正确。答案为 A选项。 35 【正确答案】 C 【试题解析】 两个类型相同的结构体,可以使用一个给另一个初始化,使它们相等。
27、前提是结构体变量所有成员全部初始化了。 pc1=pc2, pc2的成员值和 pc1中对应的成员相等。因此 pc1 CPU输出 ?。答案为 C选项。 36 【正确答案】 A 【试题解析】 a=1等价于 a=a1,即 a除以 2,则 a=2, b=(a1)+4=1+4=5,因此,打印出来为 1, 5。答案为 lA选项。 37 【正确答案】 A 【试题解析】 由图示可知, c是个普通变量, p指向 c,因此 p是指针,且 p=c, q指向 p,但是 p也是指针,因此 q是指向指针的指针 q= p,因此定义是int*q, *p, c, q= p, P= c。答案为 A选项。 38 【正确答案】 B 【
28、试题解析】 结构体 tt是一个递归定义,类似于链表,通过成员变量 Y链接起来。 p=s+1指向 s1。 p一 y指向 s2,但现在 p一 y=s,因此 s2=s0,此时s=1 0, 2 0, 1 0,而 p在 s1位置,因此 p一 x为 2, p=p一 y, p指向s2,因此 p一 x=1,故打印结果为 2, 1。答案为 B选项。 39 【正确答案】 B 【试题解析】 运算符为按位异或运算符,即 01=1, 10=1, 11=0, 00=0;经计算可得 x=xy, y=xy, x=xy,作用是交换 x, y的值。因此答案为 B选项。 40 【正确答案】 A 【试题解析】 *p=s,可得 p指向
29、 s0, p一 y指向 s1,现 p一 y=s,因此 p一 y指向 s0。因此 p一 x=1, +p一 x等价于 +(p一 x),因此打印结果为 2。答案为 A选项。 二、程序填空题 41 【正确答案】 (1)STU (2) (3)k 【试题解析】 填空 1: STU结构体别名,通过 main()函数中的语句可知。 填空 2: 只要学生两门课成绩有不及格的,就算不及格,因此使用或运算。 填空 3: k返回的是不及格的学生个数,有题意可知 k是累计个数的。 三、程序修改题 42 【正确答案】 (1)for(i=0; in; i+)改为 for(i=1; in; i+) (2)k=In改为 *k=m (3)if(t=0)改为 if(t=0) 【试题解析】 (1)for(i=0; in; i+)改为 for(i=1; in; i+),一个数的因子从 1开始,不能从 0开始。 (2)k=m改为 *k=m, k为指针不能直接赋值整数, * k为指针指向的内容。