1、国家二级( C语言)机试模拟试卷 45及答案与解析 一、选择题 1 下列叙述中正确的是 ( A)一个算法的空间复杂度大,则其时间复杂度也必定大 ( B)一个算法的空间复杂度大,则其时间复杂度必定小 ( C)一个算法的时间复杂度大,则其空间复杂度必定小 ( D)算法的时间复杂度与空间复杂度没有直接关系 2 下列叙述中正确的是 ( A)循环队列中的元素个数随队头指针与队尾指针的变化而动态变化 ( B)循环队列中的元素个数随队头指针的变化而动态变化 ( C)循环队列中的元素个数随队尾指针的变化而动态变化 ( D)以上说法都不对 3 一棵二叉树中共有 80个叶子结点与 70个度为 1的结点,则该二叉树
2、中的总结点数为 ( A) 219 ( B) 229 ( C) 230 ( D) 231 4 对长度为 10的线性表进行冒泡排序,最坏情况下需要比较的次数为 ( A) 9 ( B) 10 ( C) 45 ( D) 90 5 构成计算机软件的是 ( A)源代码 ( B)程序和数据 ( C)程序和文档 ( D)程序、数据及相关文档 6 软件生命周期可分为定义阶段、开发阶段和维护阶段,下面不属于开发阶段任务的是 ( A)测试 ( B)设计 ( C)可行性研究 ( D)实现 7 下面不能作为结构化方法软件需求分析工具的是 ( A)系统结构图 ( B)数据字典 (DD) ( C)数据流程图 (DFD图 )
3、 ( D)判定表 8 在关系模型中,每一个二维表称为一个 ( A)关系 ( B)属性 ( C)元组 ( D)主码(键) 9 若实体 A和 B是一对多的联系,实体 B和 C是一对一的联系,则实体 A和 C的联系是 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 10 有三个关系 R、 S和 T如下:则由关系 R和 S得到关系 T的操作是 ( A)选择 ( B)投影 ( C)交 ( D)并 11 以下叙述中正确的是 ( A) C语言程序所调用的函数必须放在 main函数的前面 ( B) C语言程序总是从最前面的函数开始执行 ( C) C语言程序中 main函数必须放在程序的开始位置
4、 ( D) C语言程序总是从 main函数开始执行 12 C语言程序中,运算对象必须是整型数的运算符是 ( A) sum = pad = 5; pAd = +sum, pAd+, +pad; printf(“%dn“, pad ); 程序的输出结果是 ( A) 5 ( B) 6 ( C) 7 ( D) 8 14 有以下程序 #include stdio.h main() int a=3; a+=a-=a*a; printf( “%dn“, a ); 程序的输出结果是 ( A) 0 ( B) 9 ( C) 3 ( D) -12 15 sizeof( double )是 ( A)一个整型表达式 (
5、 B)一个双精度型表达式 ( C)一个不合法的表达式 ( D)一种函数调用 16 有以下程序 #include stdio.h main() int a=2, c=5; printf( “a=%d,b=%dn“, a,c ); 程序的输出结果是 ( A) a=2,b=5 ( B) a=%2,b=%5 ( C) a=%d,b=%d ( D) a=%d,b=%d 17 若有定义语句: char a=82; 则变量 a ( A)说明不合法 ( B)包含 1个字符 ( C)包含 2个字符 ( D)包含 3个字符 18 有以下程序 #include stdio.h main() char c1=A, c
6、2=Y; printf( “%d, %dn“, c1,c2 ); 程序的输出结果是 ( A)输出格式不合法,输出出错信息 ( B) 65,89 ( C) 65,90 ( D) A,Y 19 若变量已正确定义 for( x=0,y=0; ( y!=99 x+ ) 则以上 for循环 ( A)执行 3次 ( B)执行 4次 ( C)执行无限次 ( D)执行次数不定 20 对于 while(!E) s; ,若要执行循环体 s,则 E的取值应为: ( A) E等于 1 ( B) E不等于 0 ( C) E不等于 1 ( D) E等于 0 21 有以下程序 #include stdio.h main()
7、 int x; for( x=3; x 6; x+ ) printf( (x%2 ) : (“*%d“) :(“#%d“),x); printf(“n“); 程序的输出结果是 ( A) *3#4*5 ( B) #3*4#5 ( C) *3*4#5 ( D) *3#4#5 22 有以下程序 #include stdio.h main() int a, b; for( a=1,b=1; a =100; a+ ) if(b =20) break; if(b % 3=1) b=b+3; continue; b=b-5; printf(“%dn“,a); 程序的输出结果是 ( A) 10 ( B) 9
8、( C) 8 ( D) 7 23 有以下程序 #include stdio.h void fun( int x, int y, int *c, int *d ) *c = x+y; *d = x-y; main() int a=4, b=3, c=0, d=0; fun ( a, b, printf( “%d %dn“ , c, d ); 程序的输出结果是 ( A) 0 0 ( B) 4 3 ( C) 3 4 ( D) 7 1 24 有以下程序 #include stdio.h void fun( int *p, int *q ) int t; t = *p; *p = *q; *q=t; *
9、q = *p; main() int a=0, b=9; fun ( printf( “%d %dn“ , a,b ); 程序的输出结果是 ( A) 9 0 ( B) 0 0 ( C) 9 9 ( D) 0 9 25 有以下程序 #include stdio.h main() int a = 2,4,6,8,10 , x, *p, y=1; p = for( x=0; x 3; x+ ) y += *(p+x); printf( “%dn“,y ); 程序的输出结果是 ( A) 13 ( B) 19 ( C) 11 ( D) 15 26 有以下程序 #include stdio.h main(
10、) int i, x33 = 1,2,3,4,5,6,7,8,9 ; for( i=0; i 3; i+ ) printf( “%d “, xi2-i ); printf( “n“ ); 程序的输出结果是 ( A) 1 5 0 ( B) 3 5 7 ( C) 1 4 7 ( D) 3 6 9 27 设有某函数的说明为 int* func(int a10, int n); 则下列叙述中,正确的是 ( A)形参 a对应的实参只能是数组名 ( B)说明中的 a10写成 a或 *a效果完全一样 ( C) func的函数体中不能对 a进行移动指针(如 a+)的操作 ( D)只有指向 10个整数内存单元的
11、指针,才能作为实参传给 a 28 有以下程序 #include stdio.h char fun( char *c ) if ( *c =Z return *c; main() char s81, *p=s; gets( s ); while( *p ) *p =fun( p ); putchar( *p ); p+; printf( “n“); 若运行时从键盘上输入 OPEN THE DOOR回车,程序的输出结果是 ( A) OPEN THE DOOR ( B) oPEN tHE dOOR ( C) open the door ( D) Open The Door 29 设有定义语句: ch
12、ar *aa2= “abcd“,“ABCD“; 则以下叙述正确的是 ( A) aa0存放了字符串 “abcd“的首地址 ( B) aa数组的两个元素只能存放 含有 4个字符的一维数组的首地址 ( C) aa数组的值分别是字符串 “abcd“和 “ABCD“ ( D) aa是指针变量,它指向含有两个元素的字符型数组 30 有以下程序 #include stdio.h int fun( char *s ) char *p=s; while (*p !=0 ) p+; return ( p-s ); main() printf( “%dn“, fun( “goodbey!“ ) ); 程序的输出结果
13、是 ( A) 0 ( B) 6 ( C) 7 ( D) 8 31 有以下程序 #include stdio.h int fun( int n ) int a; if( n=1 ) return 1; a = n + fun( n-1 ); return ( a ); main() printf( “%dn“, fun( 5 ) ); 程序的输出结果是 ( A) 9 ( B) 14 ( C) 10 ( D) 15 32 有以下程序 #include stdio.h int d=1; void fun( int p ) int d=5; d += p+; printf(“%d “, d ); ma
14、in() int a=3; fun( a ); d += a+; printf(“%dn“,d); 程序的输出结果是 ( A) 8 4 ( B) 9 6 ( C) 9 4 ( D) 8 5 33 有以下程序 #include stdio.h int fun(intA) int b=0; static int c=3; a =( c+,b+); return ( a ); main() int a = 2, i, k; for( i=0; i 2; i+ ) k = fun(a+); printf( “%dn“,k ); 程序的输出结果是 ( A) 4 ( B) 0 ( C) 1 ( D) 2
15、34 有以下程序 #include stdio.h main() char c25= “6934“, “8254“ ,*p2 ; int i, j, s=0; for( i=0; i 2; i+ ) pi=ci; for( i=0; i 2; i+ ) for( j=0; pij 0 j+=2 ) s = 10*s + pij - 0; printf( “%dn“ ,s ); 程序的输出结果是 ( A) 693825 ( B) 69825 ( C) 63825 ( D) 6385 35 有以下程序 #include stdio.h #define SQR(X) X*X main() int a
16、=10, k=2, m=1; a /= SQR(k+m)/SQR(k+m); printf(“%dn“,a); 程序的输出结果是 ( A) 0 ( B) 1 ( C) 9 ( D) 10 36 有以下程序 #include stdio.h main() char x=2, y=2, z; z=( y 1 ) printf( “%dn“,z ); 程序的输出结果是 ( A) 1 ( B) 0 ( C) 4 ( D) 8 37 有以下程序 #include stdio.h struct S int a;int b; ; main() struct S a, *p= a.a=99; printf(
17、“%dn“ , _ ); 程序要求输出结构体中成员 a的数据,以下不能填入横线处的内容是 ( A) a.a ( B) *p.a ( C) p- a ( D) (*p).a 38 有以下程序 #include stdio.h #include stdlib.h void fun( double *p1,double *p2,double *s) s = (double *)calloc( 1,sizeof(double) ); *s = *p1 + *( p2+1 ); main() double a2 = 1.1, 2.2 , b2 = 10.0, 20.0 , *s=a; fun( a, b
18、, s ); printf( “%5.2fn“, *s); 程序的输出结果是 ( A) 21.10 ( B) 11.1 ( C) 12.1 ( D) 1.1 39 若已建立以下链表结构,指针 p、 s分别指向如图所示结点则不能将 s所指结点插入到链表末尾的语句组是 ( A) p=p- next; s - next=p; p- next=s; ( B) s - next=0; p=p- next; p- next=s; ( C) p=p- next; s - next=p- next; p- next=s; ( D) p=(*p).next; (*s ).next=(*p).next; (*p)
19、.next=s; 40 若 fp已定义为指向某文件的指针,且没有读到该文件的末尾,则 C语言函数feof(fp)的函数返回值是 ( A) EOF ( B)非 0 ( C) -1 ( D) 0 二、程序填空题 41 给定程序中,函数 fun的功能是:将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数 atoi和 atof将字符申转换成相应的整数、浮点数,然后将其显示在屏幕上。 请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构 ! 试题程序: #inClucle
20、stdio h #include stdlib h void fun(char*s, int a, double f) /*found*/ 【 1】 fp; char str100, str1100, str2 100; int a1; double f1; fp=fopen(“filel txt”, “W”); fprintf(fp, “ S d f n”, S, a, f); /*found*/ 【 2】 ; fp=fopen(“filel txt”, “r”); /*found*/ fscanf(【 3】 , “ s s S”, str, str1, Str2), fclose(fp);
21、 a1=atoi(str1), f1=atof(str2), printf(“ nThe result: nn S d f n”, str, a1, f1); main() char a10=“Hello!”; int b=12345; clouble c=98 76; fun(a, b, c); 三、程序修改题 42 下列给定程序中函数 fun的功能是:删除 s所指字符中所有的小写字母 c。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构 ! 试题程序: #include stdio h void fun(char*s) int
22、 i, j, for(i=j=0; Si!= 0; i+) if(Si!=c) /*found*/ Sj=Si; /*found*/ si= 0; void main() char s80; printf(“ nEnter a string: ”); gets(s); printf(“The original string: ”), puts(s); fun(s); printf(“The string after deleted: ”); puts(S), printf(“ n n”), 四、程序设计题 43 编写函数 fun,其功能是:实现 B=A+A,即将矩阵 A加上 A的转置,存放在矩
23、阵 B中。计算结果在 mmn函数中输出。 例如,输入下面的矩阵: 1 2 3 4 5 6 7 8 9 其转置矩阵为: 1 4 7 2 5 8 3 6 9 程序输出: 2 6 10 6 10 14 10 14 18 注意:部分源程序给出如下。 请勿改动主函数 main和其他 函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 试题程序: #include stdio h #include COnio h #include stdlib h void fun(int a33, int b33) void main() int a33=f1, 2, 3, 4, 5, 6, 7, 8,
24、 9, t33; int i, j; system(“CLS”), fun(a, t); for(i=0; i 3; i+) for(j=0, j 3; j+) printf(“ 7d”, tij); printf(“n”), 国家二级( C语言)机试模拟试卷 45答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 算法的空间复杂度是指算法在执行过程中所需要的内存空间,算法的时间复杂度,是指执行算法所需要的计算工作量,两者之间并没有直接关系,答案为 D。 2 【正确答案】 A 【试题解析】 在循环队列中,用队尾指针 rear指向队列中 的队尾元素,用排头指针 front指向排头元素的前
25、一个位置。因此,从排头指针 front指向的后一个位置直到队尾指针 rear指向的位置之间所有的元素均为队列中的元素。所以循环队列中的元素个数与队头指针和队尾指针的变化而变化, A正确。 3 【正确答案】 B 【试题解析】 二叉树中,度为 0的节点数等于度为 2的节点数加 1,即 n2=n0-1,叶子节点即度为 0,则 n2=79,总结点数为 n0+n1+n2=80+70+79=229,答案为B。 4 【正确答案】 C 【试题解析】 冒泡法是在扫描过程中逐次比 较相邻两个元素的大小,最坏的情况是每次比较都要将相邻的两个元素互换,需要互换的次数为9+8+7+6+5+4+3+2+1=45,选 C。
26、 5 【正确答案】 D 【试题解析】 软件指的是计算机系统中与硬件相互依赖的另一部分,包括程序、数据和有关的文档,选 D。 6 【正确答案】 C 【试题解析】 开发阶段包括分析、设计和实施两类任务。其中分析、设计包括需求分析、总体设计和详细设计 3个阶段,实施则包括编码和测试两个阶段, C不属于开发阶段。 7 【正确答案】 A 【试题解析】 结构化方法软 件需求分析工具主要有数据流图、数据字典、判定树和判定表。 8 【正确答案】 A 【试题解析】 关系模型采用二维表来表示,即每个二维表称为一个关系。 9 【正确答案】 B 【试题解析】 A和 B为一对多的联系,则对于 A中的每一个实体, B中有
27、多个实体与之联系,而 B与 C为一对一联系,则对于 B中的每一个实体, C中之多有一个实体与之联系,则可推出对于 A中的每一个实体, C中有多个实体与联系,所以为一对多联系。 10 【正确答案】 D 【试题解析】 关系 T中的元素与关系 R和关系 S中不同元素的总 和,因此为并操作。 11 【正确答案】 D 【试题解析】 C语言所调用的函数可以放在调用它的函数前 ,也可以放在调用它的函数后 ,所以 A错误, C语言程序总是从 main函数开始执行 ,所以 B错误, main函数的位置可以放在开始 ,也可以放在中间 ,也可以放在最后 ,所以 C错误。 12 【正确答案】 C 【试题解析】 %取余
28、运算是二目运算符 ,且要求运算对象必须为整数 ,所以选 C。 13 【正确答案】 B 【试题解析】 C语言区分大小写 ,pad与 pAd是两个不同的变量,首先将 5赋值给两个变量 ,由于 赋值运算符的优先级高于逗号运算符 ,所以计算 pAd=+sum,此时pAd为 6,sum也为 6,然后计算 pAd+,pAd的值变为 7,+pad,pad的值变为 6,所以选择 B。 14 【正确答案】 D 【试题解析】 首先计算 a*a结果为 9,执行 a=a-9,a的值为 -6,然后执行 a+=a,即a=a+a=-6+(-6),所以值为 -12。 15 【正确答案】 A 【试题解析】 sizeof是 C语
29、言中的一个操作符 (operator),不是函数调用 ,简单的说其作用就是返回一个对象或者类型所占的内存字节 数,所以选择 A。 16 【正确答案】 C 【试题解析】 C语言中用 “%“打印输出字符 “%“,所以 %d,输出为 %d两个普通字符 ,而不是格式控制符 “%d“的含义 ,所以打印结果为 C。 17 【正确答案】 A 【试题解析】 定义语句: char a=82;反斜杠 后面跟三位八进制数据表示一个ASCII码,八进制没有数字 8,因此 A选项正确。 18 【正确答案】 B 【试题解析】 本题重点考察字符变量的相关知识。分别给字符型变量 a和 b分别赋值为 A和 Y,即 A和 Y的
30、ASSCII码,因此输出结果为 65,89,因此 B选项正确。 19 【正确答案】 B 【试题解析】 本题重点考察 for语句的循环次数, for(x=0,y=0;(y!=99x+), y!=99含义为变量 x对 2求余,如果结果为真,则按照 “*%d“格式输出,否则按照 #%d输出。因此 A选项正确。 22 【正确答案】 C 【试题解析】 首先注意 for循环的控制条件 当 b =20或者 a 100则跳出 for循环 也即 b 20且 a =100时执行 for循环;第一次进入循环 a=1,b=1均满足循环条件,但 b%3=1条件满足,故执行 b=b+3,得到 b=4,注意有 contin
31、ue,所以后面语句不执行,直接跳转到 a+这个语句,所以第一次循环完之后 a=2,b=4;进入第二轮循环, b%3=1也是满足的,故再次 b=b+3,此轮循环执行之后 a=3,b=7,进入下一轮。此后和前面循环同理,都是 b%3=1满足 ,因为每次都是加 3,而之后又去模 3,且都跳过 for后面语句直接执行 a+,所以,一直循环到 b=22跳出 for循环。此时 a为 8. 综合起来就是,每次循环 b增加 3, a增加 1,且当 b22时跳出循环,结束程序。所以 b从 1增加到 22,有( 22-1) /3=7,所以 a=1+7=8. 因此 C选项正确。 23 【正确答案】 D 【试题解析】
32、 主函数中首先初始化整型变量 a、 b、 c、 d分别为 4、 3、 0、 0。调用函数 fun,将实参传递给形参。在 fun函数内, *c=7、 *d=1。返回主函数,最后输出 7和 1。因此 D选项正确 。 24 【正确答案】 C 【试题解析】 主函数中定义整型变量 a、 b,分别赋值 0和 9。将 a和 b的地址传递给指针变量 p和 q,函数 fun中将 a和 b的值互换后,又将 a的值赋给 b。返回主函数,最后输出 9和 9。因此 C选项正确。 25 【正确答案】 B 【试题解析】 本题通过语句 “p=后 d变为 4,所以答案为 A。 33 【正确答案】 B 【试题解析】 题目中 fu
33、n函数被执行了两次,两次执行后,都是返回了函数内部的 b值,所以答案为 0,即 B选项正确。 34 【正确答案】 D 【试题解析】 本题的意图在于将 c中两个字符串的偶数位置的数字组成一个新数,找到的四个数字分别为 6、 3、 8、 5,组成的数为 6385,所以答案为 D选项。 35 【正确答案】 B 【试题解析】 本题考查宏定义,宏定义只是做个简单的替换,执行SQR(k+m)/SQR(k+m)=k+m*k+m/ k+m*k+m=15/2, a/= SQR(k+m)/SQR(k+m)的结果为 1,选项 B正确。 36 【正确答案】 B 【试题解析】 本题考查位运算、 &。 y 1为 4, x
34、 1为 1,二者与一下为 0,所以 B选项正确。 37 【正确答案】 B 【试题解析】 本题考 查结构体变量的引用,题目中要求输出结构体中成员 a的数据, p为指针, *p为结构体变量,那么 *p.a可以表示为结构体中成员 a的数据。 38 【正确答案】 D 【试题解析】 本题考查把数组名作为函数参数,执行 fun函数后, s的值并没有发生变化,仍然是指向 a,所以输出结果为 1.10,选项 D正确。 39 【正确答案】 A 【试题解析】 本题考查向链表中插入节点, A选项语句错误,不能够实现在链表末尾插入。 40 【正确答案】 D 【试题解析】 本题考查文件的定位, feof函数的用法是从输
35、入 流读取数据,如果到达文件末尾(遇文件结束符), eof函数值为非零值,否则为 0,所以选项 D正确。 二、程序填空题 41 【正确答案】 (1)FILE * (2)fclose(fp) (3)fp 【试题解析】 填空 1:从使用 fp=fopen(“filel txt”, “w”)可知 fp应该是文件类型指针,因此本空应该填写 FILE*。 填空 2:当对 fp作打开操作的时候,并进行不同的操作前,应该对其关闭,因为在第一次打开时是对 fp进行写操作,而在第二次打开后进行的是读操作,因此应该先对 fp进行关闭,本空填 fclose(fp)。 填空 3: fscanf()是把文本文件输出,因
36、此本空只能填写 fp。 三、程序修改题 42 【正确答案】 (1)sj+=si;或 sj=si; j+; (2)sj= 0; 【试题解析】 由循环条件 if(si!=c)可知,如果字符串中的字符不是 c,则将保留该宁符到 sj位置,然后下标 j进行加 1操作。循环结束后要在新串的结尾加上 0。 四、程序设计题 43 【正确答案】 void fun(int a33, int b33) int i, j; for(i=0, i 3; i+) for(j=0, j 3; j+) bij=aij+aji; *把矩阵 a加上 a的持置,存放在矩阵 b中 * 【试题解析】 行列数相等的二维数组的转置就是行列互换,即转置后的第 i行第j列正好对应原矩阵的第 j行第 i列。本题使用双层循环实现矩阵的转置,并将计算结果存入矩阵 b中,外层循环控制矩阵的行下标,内层循环控制矩阵的列下标。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1