1、国家二级( C语言)机试历年真题试卷汇编 5及答案与解析 一、选择题 1 下列叙述中错误的是 ( )。 ( A)数据结构中的数据元素不能是另一数据结构 ( B)数据结构中的数据元素可以是另一数据结构 ( C)空数据结构可以是线性结构也可以是非线性结构 ( D)非空数据结构可以没有根节点 2 为了降低算法的空间复杂度,要求算法尽量采用原地工作 (in place)。所谓原地工作是指 ( )。 ( A)执行算法时所使用的额外空间固定 (即不随算法所处理的数据空间大小的变化而变化 ) ( B)执行算 法时所使用的额外空间随算法所处理的数据空间大小的变化而变化 ( C)执行算法时不使用额外空间 ( D
2、)执行算法时不使用任何存储空间 3 某循环队列的存储空间为 Q(1: m),初始状态为 front=rear=m。现经过一系列的入队操作和退队操作后, front=m, rear=m1,则该循环队列中的元素个数为( )。 ( A) m一 1 ( B) m ( C) 1 ( D) 0 4 某棵树只有度为 3的节点和叶子节点,其中度为 3的节点有 8个,则该树中的叶子节点数为 ( )。 ( A) 15 ( B) 16 ( C) 17 ( D)不存在这样的树 5 某二叉树共有 530个节点,其中度为 2的节点有 250个,则度为 1的节点数为( )。 ( A) 29 ( B) 30 ( C) 249
3、 ( D) 251 6 若某二叉树中的所有节点值均大于其左子树上的所有节点值,且小于右子树上的所有节点值,则该二叉树遍历序列中有序的是 ( )。 ( A)前序序列 ( B)中序序列 ( C)后序序列 ( D)以上说法均可以 7 将 C语言的整数设为整数类 I,则下面属于类 I实例的是 ( )。 ( A)一 103 ( B) 10E3 ( C) 10 3 ( D) “0103” 8 下列叙述中正确的是 ( )。 ( A)软件包括程序、数据和文档 ( B)软件包括程序和数据 ( C)软件包括算法和数据结构 ( D)软件包括算法和程序 9 软件生命周期是指 ( )。 ( A)软件的定义和开发阶段 (
4、 B)软件的需求分析、设计与实现阶段 ( C)软件的开发阶段 ( D)软件产品从提出、实现、使用维护到停止使用退役的过程 10 下列叙述中正确的是 ( )。 ( A)数据库系统可以解决数据冗余和数据独立性问题,而文件系统不能 ( B)数据库系统能够管理各种类型的文件,而文件系统只能管理程序文件 ( C)数据库系统可以管理庞大的数据量,而文件系统管理的数据量较少 ( D)数据库系统独立性较差,而文件系统独立性较好 11 关于程序模块化,以下叙述错误的是 ( )。 ( A)程序模块化可以提高程序运行的效率 ( B)程序模块化可以提高程序编制的效率 ( C)程序模块化可以提高程序代码复用率 ( D)
5、程序模块化可以提高调试程序的效率 12 以下正确使用 C语言标识符的是 ( )。 ( A) 3 ( B) #3 ( C) _3 ( D)一 3 13 若有定义: int a, b, c;以下程序段的输出结果是 ( )。 a=11; b=3; c=0; printf(“ d n“, c=(a b, a b); ( A) 2 ( B) 0 ( C) 3 ( D) 1 14 以下选项中合法的 C语言常量是 ( )。 ( A) CSTR ( B) 2014 1 ( C) 1 0 ( D) 2EK 15 设有定义: int x, y, z;,且各变量已赋正整数值,则以下能正确表示代数式“ ”的 C语言表
6、达式是 ( )。 ( A) 1 0 x y z ( B) 1 x*y*z ( C) 1 (x*y*z) ( D) 1 x y (double)z 16 有以下程序: #include main() char a, b, c, d; scarf(“ c c“, a, b); C=setchar(); d=getchar(); printf(“ c c c c n“, a, b, c, d); 当执行程序时,按下列方式输入数据 (从第 1列开始, 代表回车 ,注意:回车也是一个字符 ) 12 34 则输出结果是 ( )。 ( A) 12 ( B) 12 3 ( C) 1234 ( D) 12 34
7、 17 有以下程序: #include main() int a, b; for(a=0; a,则输出结果是 ( )。 ( A) 2, 2, 3, 4, 4, 4, ( B) 2, 3, 4, ( C) 2, 2, 3, 4, ( D) 2, 3, 3, 4,5, 6, 18 有以下程序: #include #include main() double x, y, z; scanf(“ If If“, x, y); z=x y; while(1) if(fabs(z)1 0) x=y; y=x; z=x y; else break; printf(“y= f n“, y); 执行时输入: 3
8、6 2 4,则输出结果是 ( )。 ( A) 2 400000 ( B) 1 500000 ( C) 1 600000 ( D) 2 000000 19 有以下程序: #include main() int i; char c; scanf(“ c“, c); for(i=0; ic)continue; printf(“ d, “, i); 执行时输入: 0后,则输出结果是 ( )。 ( A) 5, ( B) 0, 0, 0, 0, 0, ( C) 0, 1, 2, 3, 4, ( D) 0, 1, 20 以下程序拟实现计算 sum=1+1 2+1 3+1 50。 #include main(
9、) int i; double 8um; sum=1 0; i=1; do i+; sum+=1 i; while(i int fun(int*b, int n) int i, r=1; for(i=0; i void change(char*array, int len) for(len一一; len=0; len一一 ) arraylen+=1; main() int i; char array5=“ABCD“; change(array, 4); for(i=0; i main() int a4, p, x, i; , for(i=3; i0; i一一 )ai一 1=i*21; scan
10、f(“ d“, x); i=0; while(aip; i一一 )ai: ai一 1; ap=x; for(i=0; i,则输出结果是 ( )。 ( A) 1 2 3 4 ( B) 5 4 3 1 ( C) 1 2 3 5 ( D) 3 2 1 4 28 有以下程序: #include int fun(int a, int n, int x) int*p=a; while(p main() char w20, a510=“abcde“, “fghij“, “klmno“, “pqrst“, “uvwxy“; int i; for(i=0; i #include void fun(char *8
11、, int ml, int m2) char t, *p; p=s+ml; s=s+m2; while(8 int m=1, n=2; void subl(int m, int n) m+=2; n+; void sub2() m+; n+=2; main() printf(“ d, d, “, m, n); subl(4, 5); printf(“ d, d, “, m, n); sub2(); printf(“ d, d n“, m, n); 程序运行后的输出结果是 ( )。 ( A) 1, 2, 1, 2, 2, 4 ( B) 1, 2, 6, 6, 7, 8 ( C) 1, 2, 2,
12、 4, 2, 4 ( D) 1, 2, 6, 6, 2,4 33 有以下程序: #include #nclude long fun(char s) long n; int sign; for(; isspace(*s); s+); sign=(*s=一 )?一 1: 1; if(* s=+ *s=一 )s+; for(n=0; isdigit(木 s); s+) n=10*n+(*s一 0); return sign*n; main() char S=“一 26a3“; printf(“ d n“, fun(s); 程序运行后的输出结果是 ( )。 ( A)一 263 ( B) 2 ( C)
13、0 ( D)一 26 34 设有定义: struct complex int real, unreal; datal=1, 8, data2; 则以下赋值语句中错误的是 ( )。 ( A) data2=(2, 6); ( B) data2=datal; ( C) data2.real=datal real; ( D) data2 real=datal.unreal; 35 有以下程序: #include #define S(x)x * x x main() int k=6, j=3; printf(“ d, d n“, S(k+j+2), S(j+k+2); 程序运行后的输出结果是 ( )。
14、( A) 11, 11 ( B) 29, 29 ( C) 26, 29 ( D) 121, 121 36 若有定义: typedef int*T10; Ta; 则以下选项与上述定义中 a的类型完全相同的是 ( )。 ( A) int, * a10; ( B) int(*a)10; ( C) int a10; ( D) int(*a10)(); 37 有以下程序: #include main() FILE*fp; int i, a6=1, 2, 3, 4, 5, 6, k; fp=fopen(“data dat“, “w+“); for(i=0; i #include void fun(doub
15、le*p1, double*02, double * s) s=(double*)calloc(1, sizeof(double); *s=*p1+* 02; main() double aE 2=1 1, 2 2, b2=10 0, 20 0, *q=NULL; fun(a, b, q); printf(“ 5 2f n“, *q); 程序运行后的结果是 ( )。 ( A)有运行错误 ( B)输出 11 10 ( C)输出 12 10 ( D)输出 21 10 39 若文件指针 fp已正确指向文件, ch为字符型变量,以下不能把字符输出到文件中的语句是 ( )。 ( A) fget(fp,
16、ch); ( B) fputc(ch, fp); ( C) fprintf(fp, “ c“, ch); ( D) fwrite( ch, sizeof(ch), 1, fp); 40 有以下程序: #include struet ball char color10; int dim; ; main() struct ball list2=“white“, 2, “yellow“, 3; printf(“ s: d n“, (list+1)一 color, list一 dim); 程序运行后的输出结果是 ( )。 ( A) yellow: 3 ( B) yellow: 2 ( C) white
17、: 2 ( D) white: 3 二、程序填空题 41 函数 fun的功能是:根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回。其中函数 is leap用来判别某一年是否为闰年。 例如,若输入: 2008 5 1,则程序输出: 2008年 5月 1日是该年的第 122天。 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1 C中。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #include int isleap(int year) int leap; leap=(year 4=0 year 1
18、00 1=0 year 400=0); *found* return【 1】; int fun(int year, int month, int clay) int table13=0, 31, 28, 31, 30, 31, 30, 31, 3l, 30, 31, 30, 31; int days=0, i; for(i=1; i2) *found* days=days+【 3】; retum days; main() int year, month, day, days; printf(“请输入年、月、日: “); scanf(“ d d d“, year, month, day); da
19、ys=fun(year, month, day); printf(“ d年 d月 d日是该年的第 d天 n“, year, month, day, days); 三、程序修改题 42 给定程序 MODI1.C中,函数 fun的功能是:在有 n名学生, 2门课成绩的结构体数组 std中,计算出第 1门课程的平均 分,作为函数值返回。例如,主函数中给出了 4名学生的数据,则程序运行的结果为:第 1门课程的平均分是: 76 125000 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 mmn函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include typ
20、edef struct char num8; double score2; STU; double fun(STU std, int n) int i; *found* double sum; *found* for(i=0; i void NONO(); int fun(int n) main() int n, place; do printf(“请输入一个 4位以内的正整数: “); scanf(“ d“, n); while(n9999); place=fun(n); printf(“输入的数字是 d位 n“, place); NONO(); void NONO() i *本函数用于打开
21、文件,输入数据,调用函数,输出数据,关闭文件。 * FILE*fp, *wf; int i, n, place; fp=fopen(“c: test in dat“, “r“); wf=fopen(“c: test out dat“, “w“); for(i=0; i0,则队列中的元素个数为 rearfront个;如果 rearfront, d=3。故答案为 A选项。 17 【正确答案】 C 【试题解析】 continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。在 switchcase 语句中,如果没有 break会导致多个分支重叠。因此,输入 1, 2, 3,则 1执行 ca
22、se 1: printf(“ d, “, b+1); case 2: printf(“ d, “,b+1); continue;后结束。 2则执行 case 2: printf(“ d, “, b+1); continue; 3则执行 default: printf(“ d, “, b+1); continue;得到的结果是 2, 2, 3, 4。故答案为 C选项。 18 【正确答案】 A 【试题解析】 题目中程序执行过程中关键语句 z=x y的结果为: z=1 5, if条件成立,得 x=2 4, y=2 4, z=1 0,下一次循环 if条件不成立跳出循环,按照格式打印 y值为 2 400
23、000。故答案为 A选项。 19 【正确答案】 C 【试题解析】 scanf(“ c“, c),输入的字符,题目中输入了 0,字符 0对应于ASCII码为 48,因此 for循环中, i的范围从 0 5,均小于 48, if条件不成立,直接执行下一条语句 printf,因此得到的结果是 0, 1, 2, 3, 4。故答案为 C选项。 20 【正确答案】 A 【试题解析】 选项 A中, sum+=1 i; i为整型,因此 1 i是整型类型,当 1 i有小数时,小数部分会被截断。因此 1 i结果始终为 0,导致结果出错,应改为sum+=1 0 i。因此答案为 A选项。 21 【正确答案】 A 【试
24、题解析】 指针运算符 (通常称为间接引用运算符: indirection operator或复引用运算符: dereferencingoperator)返回其操作数 (即一个指针 )所指向的对象的值。定义语句中的 *号不是一个间址运算符,而是定义指针变量的说明符 ,因此,A项错误, B选项正确,原则上说变量 p可以放 double兼容性的变量地址, C选项正确,根据指针的赋值运算,可知 D选项正确。故答案为 A选项。 22 【正确答案】 A 【试题解析】 函数返回值可以为整型、实型、字符型、指针和结构类型,也可以没有返回值,因此 A选项正确,可以返回数组指针,因此可知 B、 C、 D选项错误。
25、故答案为 A选项。 23 【正确答案】 C 【试题解析】 函数 fun()求数组指定返回的元素的积。函数 fun(a, 3)求的是数组a0一 a3的积。因此结果为 2*3*4*5=120,故答案为 C选项。 24 【正确答案】 A 【试题解析】 (*p)4定义了一个数组指针。 p可以指向类似于 arty4的数组,题设中, p不是一个二维数组,只是可以指向这类二维数组,因此 A选项错误。p+1代表了第一行第一个元素的地址, p=a指向数组 a的首地址,则 B、 C选项正确,同理可知 D选项也正确。故答案为 A选项。 25 【正确答案】 A 【试题解析】 函数 change()的作用是从数组尾部将
26、数组内的元素值加 1。数组的初始值为 ABCD,因此经 change()后,得到的值为 BCDE。故答案为 A选项。 26 【正确答案】 D 【试题解析】 noat a8=1 0, 2 0;定义了一个包含 8个 float型元素的数组,并初始化了数组的前 2项,其他项是随机数。 int b1=0,定义了只有一个int型元素的数组,并初始化为 0。 char c=“A“, “B“;定义一个 char型数组,大小有初始化元素决定,但初始化值是字符串,类型不兼容,编译出错。 char d=“1“;定义一个 char型变量,但是初始化赋值字符串,类型不兼容,编译出错。因此只有数组 a, b的定义和初
27、始化正确。故答案为 D选项。 27 【正确答案】 C 【试题解析】 第一个 for循环初始化数组 a,分别为 1, 3, 5,随机数,形成了基本有序的序列,再将输入的数字插入到数组 a,使它们形成有序序列。因此可以分析出,打印的结果为 1, 2, 3, 5。故答案为 C选项。 28 【正确答案】 A 【试题解析】 while(pm2交换数组元素 ssm1,ssm2。因此, fun(ss, 0, 5)后 ss的 0, 1, 2, 3, 4, 5, 6, 7, 8, 0。 fun(ss,9, 6)后 ss的 0, 1, 2, 3, 4,, 5, 0, 8, 7, 6。 fun(s8, 0, 9)后
28、 ss的 0, 1,2, 3, 4, 5, 0, 8, 7, 6。因此打印结果 012345。故答案为 A选项。 32 【正确答案】 A 【试题解析】 全局变量与函数体内局部变量 同名时,局部变量会覆盖全局变量,因此在 subl()函数内,全局变量 m, n是不可见的,在函数 sub1()内对 m, n操作的是部变量,对全局变量不产生影响。但在 sub2()函数内,由于没有和全局变量重名,因此在此函数内, m, n是可见的。因此,第一个 printf()打印的是全局变量 m, n,故打印的是 1, 2;第二个 printf(),调用 subl(),没有修改全局变量m, n,故打印的是 1, 2
29、;第三个 printf(),之前调用了 sub2(),修改了全局变量m, n,因此,打印的是 2, 4。故答案为 A选项。 33 【正确答 案】 D 【试题解析】 isspace(c)检查参数 c是否为空格字符。若参数 c为空格字符,则返回 TRUE,否则返回 NULL(0)。 Isdigit(c)函数检查参数 c是否为阿拉伯数字 0到9。返回值若为阿拉伯数字,则返回 TRUE,否则返回 NULL(0)。 fun()函数的第一个 for循环判断字符串是否为负号。第二个 for循环获取符号后面的数字字符,并将它们转化为整数。若遇到了非数字的字符则跳出,最后返回数组的结果。因此,可知首先获取负号,
30、紧接着获取数值 26,遇到了字符 a,跳出返回一 26,因此打印的结果是一 26。故答案为 D选项。 34 【正确答案】 A 【试题解析】 结构体变量建议在定义的时候进行初始化。结构体常见的几种初始化方法如下: (1)struct a a1= (2)struct a lal= (3)struct a a1=1, 2; b=1, b=1, c=2 c=2 ; ; 计算机内核喜欢用第一种,使用第一种和第二种 时,成员初始化顺序可变。因此,可以判断 A选项错误。答案为 A选项。 35 【正确答案】 B 【试题解析】 #define命令是 C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识
31、符,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。宏定义不进行其他操作,仅仅只是替换标识符。 S(k+j+2)=k+j+2*k+j+2 k+j+2,经计算可得 29, S(j+k+2)=j+k+2 * k+j+2 j+k+2,经计算可得 29。因此输出为 29, 29。答案为 B选项 。 36 【正确答案】 A 【试题解析】 C语言允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取 ”别名 ”。类型定义符 typedef即可用来完成此功能,可以完全代替原来的类型说明符。因此,变量 a的类型为 int*a10。 typedef int*T10,由于
32、 运算符优先级高于 *,可以看成 typedef im10*T,替换 T可得 int10* a=int*810,因此,答案为 A选项。 37 【正确答案】 A 【试题解析】 fopen(“data dat“, “w+“); w+打开可读写文件。,若文件存在则文件长度清为零,即该文件内容会消失,若文件不存在则建立该文件。rewind(fp);使文件 fp的位置指针指向文件开始。 fprintf(fp, “ d n“, a5一i);将 ai输出到 fp指向的文件中。 fscanf(fp, “ d“, k);将 fp读入到变量 k中,第一个 for循环将数组中元素倒着输入刭 fp指向的文件中。 re
33、wind();则指向文件开始,因此打印的是数组 a的倒叙。故打印结果为 6, 5, 4, 3, 2, 1。答案为 A选项。 38 【正确答案】 A 【试题解析】 calloc(n, sizeof(type)在内存的动态存储区中分配 n个长度为 size的连续空间,函数返回一个指向分配起始地址的指针,如果分配不成功,返回NULL。 s在函数 fun()内申请了内存空间,但是在调用 fun()函数后会释放掉,最后 q指向 NULL,因此运行时打印出错。答案为 A选项。 39 【正确答案】 A 【试题解析】 函数 fgetc()从文件读入一个字符到指定变量。函数 fputc()将指定字符写入 fp文
34、件中,函数 fprintf(), fwrite()均是写入文件操作函数。因此 B, C, D选项错误。答案为 A选项。 40 【正确答案】 B 【试题解析】 结构体定义时初始化, list0=“white“, 2, list1=“yellow“,3, (1ist+1)一 color=list1 color=“yellow“, list一 dim=list0 dim=2,因此,打印的结果是 yellow: 2。故答案为 B选项。 二、程序填空题 41 【正确答案】 (1)leap (2)day (3)1 【试题解析】 填空 1: leap isleap()函数用来判断是否是闰年,由于初始化 2月为28天,但是闰年是 29,因此闰年要多加 1天。 isleap()应该返回 0或者 1, leap的表达式为逻辑运算,得到的结果刚好是 0或 1。 填空 2: days前面累加了平年整月份的天数,还需要加上最后一个月包含的日的天数。 填空 3: 1如果是闰年并且累加月份大于 2月,需要多加 1天。 三、程序修改题