1、国家二级 C语言机试(选择题)模拟试卷 50及答案与解析 一、选择题 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)数据流程图 (
3、DFD图 ) ( D)判定表 8 在关系模型中,每一个二维表称为一个 ( A)关系 ( B)属性 ( C)元组 ( D)主码(键) 9 若实体 A和 B是一对多的联系,实体 B和 C是一对一的联系,则实体 A和 C的联系是 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 10 下面关于 “EOF“的叙述,正确的是 ( A) EOF的值等于 0 ( B) EOF是在库函数文件中定义的符号常量 ( C)文本文件和二进制文件都可以用 EOF作为文件结束标志 ( D)对于文本文件, fgetc函数读入最后一个字符时,返回值是 EOF 11 以下叙述中正确的是 ( A) C语言程序所调用
4、的函数必须放在 main函数的前面 ( B) C语言程序总是从最前面的函数开始执行 ( C) C语言程序中 main函数必须放在程序的开始位置 ( 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 main() inta=3; a+=a-=a*a; printf(“%dn“,a); 程序的输出结果是 ( A) 0 ( B) 9 (
5、 C) 3 ( D) -12 15 sizeof(double)是 ( A)一个整型表达式 ( B)一个双精度型表达式 ( C)一个不合法的表达式 ( D)一种函数调用 16 有以下程序 #include main() inta=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 若有定义语句: chara=82; 则变量 a ( A)说明不合法 ( B)包含 1个字符 ( C)包含 2个字符 ( D)包含 3个字符 18 有以下程序 #in
6、clude main() charc1=A,c2=Y; printf(“%d,%dn“,c1,c2); 程序的输出结果是 ( A)输出格式不合法,输出出错信息 ( B) 65,89 ( C) 65,90 ( D) A,Y 19 若变量已正确定义 for(x=0,y=0;(y!=99 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 main() inta,b; for(a=1
7、,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 ( C) 8 ( D) 7 23 有以下程序 #include voidfun(intx,inty,int*c,int*d) *c=x+y;*d=x-y; main() inta=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 有以下程序 #includ
8、e voidfun(int*p,int*q) intt; t=*p;*p=*q;*q=t; *q=*p; main() inta=0,b=9; fun( printf(“%d%dn“,a,b); 程序 的输出结果是 ( A) 9 0 ( B) 0 0 ( C) 9 9 ( D) 0 9 25 有以下程序 #include main() inta=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
9、main() inti,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(inta10,intn); 则下列叙述中,正确的是 ( A)形参 a对应的实参只能是数组名 ( B)说明中的 a10写成 a或 *a效果完全一样 ( C) func的函数体中不能对 a进行移动指针(如 a+)的操作 ( D)只有指向 10个整数内存单元的指针,才能作
10、为实参传给 a 28 有以下程序 #include main() chara=H; a=(a =A printf(“%cn“,a); 程序运行后的输出结果是 ( A) H ( B) h ( C) A ( D) a 29 设有定义语句: char*aa2=“abcd“,“ABCD“; 则以下叙述正确的是 ( A) aa0存放了字符串 “abcd“的首地址 ( B) aa数组的两个元素只 能存放含有 4个字符的一维数组的首地址 ( C) aa数组的值分别是字符串 “abcd“和 “ABCD“ ( D) aa是指针变量,它指向含有两个元素的字符型数组 30 有以下程序 #include intfun
11、(char*s) char*p=s; while(*p!=0)p+; return(p-s); main() printf(“%dn“,fun(“goodbey!“); 程序的输出结果是 ( A) 0 ( B) 6 ( C) 7 ( D) 8 31 有以下程序 #include intfun(intn) inta; if(n=1)return1; a=n+fun(n-1); return(a); main() printf(“%dn“,fun(5); 程序的输出结果是 ( A) 9 ( B) 14 ( C) 10 ( D) 15 32 有以下程序 #include intd=1; voidfu
12、n(intp) intd=5; d+=p+; printf(“%d“,d); main() inta=3; fun(a); d+=a+; printf(“%dn“,d); 程序的输出结果是 ( A) 8 4 ( B) 9 6 ( C) 9 4 ( D) 8 5 33 有以下程序 #include intfun(intA) intb=0; staticintc=3; a=(c+,b+); return(a); main() inta=2,i,k; for(i=0;i 2;i+) k=fun(a+); printf(“%dn“,k); 程序的输出结果是 ( A) 4 ( B) 0 ( C) 1 (
13、 D) 2 34 有以下程序 #include main() charc25=“6934“,“8254“,*p2; inti,j,s=0; for(i=0;i 2;i+)pi=ci; for(i=0;i 2;i+) for(j=0;pij 0j+=2) s=10*s+pij-0; printf(“%dn“,s); 程序的输出结果是 ( A) 693825 ( B) 69825 ( C) 63825 ( D) 6385 35 有以下程序 #include #defineSQR(X)X*X main() inta=10,k=2,m=1; a/=SQR(k+m)/SQR(k+m); printf(“
14、%dn“,a); 程序的输出结果是 ( A) 0 ( B) 1 ( C) 9 ( D) 10 36 有以下程序 #include main() charx=2,y=2,z; z=(y 1) printf(“%dn“,z); 程序的输出结果是 ( A) 1 ( B) 0 ( C) 4 ( D) 8 37 有以下程序 #include structSinta;intb; main() structSa,*p= a.a=99; printf(“%dn“,_); 程序要求输出结构体中成员 a的数据,以下不能填入横线处的内容是 ( A) a.a ( B) *p.a ( C) p- a ( D) (*p)
15、.a 38 有以下程序 #include #include voidfun(double*p1,double*p2,double*s) s=(double*)calloc(1,sizeof(double); *s=*p1+*(p2+1); main() doublea2=1.1,2.2,b2=10.0,20.0,*s=a; fun(a,b,s); printf(“%5.2fn“,*s); 程序的输出结果是 ( A) 21.10 ( B) 11.10 ( C) 12.10 ( D) 1.10 39 有以下程序 #include main() inta34=1,3,5,7,9,11,13,15,1
16、7,19,21,23,(*p)4=a,i,j,k=0; for(i=0;i 3;i+) for(j=0;j 2;j+)k=k+*(*(p+i)+j); printf(“%dn“,k); 程序运行后的输出结果是 ( A) 108 ( B) 68 ( C) 99 ( D) 60 40 若 fp已定义为指向某文件的指针,且没有读到该文件的末尾,则 C语言函数feof(fp)的函数返回值是 ( A) EOF ( B)非 0 ( C) -1 ( D) 0 国家二级 C语言机试(选择题)模拟试卷 50答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 算法的空间复杂度是指算法在执行过程中所需要的内
17、存空间,算法的时间复杂度,是指执行算法所需要的计算工作量,两者之间并没有直接关系,答案为 D。 2 【正确答案】 A 【试题解析】 在循环队列中,用队尾指针 rear指向队列中的队尾元素,用排头指针 front指向排头元素的前一个位置。因此,从排头指针 front指向的后一个位置直到队尾指针 rear指向的位置之间所有的元素均为队列中的元 素。所以循环队列中的元素个数与队头指针和队尾指针的变化而变化, A正确。 3 【正确答案】 B 【试题解析】 二叉树中,度为 0的节点数等于度为 2的节点数加 1,即 n2=n0-1,叶子节点即度为 0,则 n2=79,总结点数为 n0+n1+n2=80+7
18、0+79=229,答案为B。 4 【正确答案】 C 【试题解析】 冒泡法是在扫描过程中逐次比较相邻两个元素的大小,最坏的情况是每次比较都要将相邻的两个元素互换,需要互换的次数为9+8+7+6+5+4+3+2+1=45,选 C。 5 【正确答案】 D 【试题解析】 软件指的是计算机系统中与硬件相互依赖的另一部分,包括程序、数据和有关的文档,选 D。 6 【正确答案】 C 【试题解析】 开发阶段包括分析、设计和实施两类任务。其中分析、设计包括需求分析、总体设计和详细设计 3个阶段,实施则包括编码和测试两个阶段, C不属于开发阶段。 7 【正确答案】 A 【试题解析】 结构化方法软件需求分析工具主要
19、有数据流图、数据字典、判定树和判定表。 8 【正确答案】 A 【试题解析】 关系模型采用二维表来表示,即每个二维表称为一个关系。 9 【正确答案】 B 【试题解析】 A和 B为一对多的联系,则对于 A中的每一个实体, B中有多个实体与之联系,而 B与 C为一对一联系,则对于 B中的每一个实体, C中之多有一个实体与之联系,则可推出对于 A中的每一个实体, C中有多个实体与联系,所以为一对多联系。 10 【正确答案】 B 【试题解析】 在 C语言中,或更精确地说成 C标准函数库中表示文件结束符( end of file)。在 while循环中以 EOF作为文件结束标志,这种以 EOF作为文件结束
20、标志的文件,必须是文本文件。在文本文件中,数据都是以 字符的 ASCII代码值的形式存放。我们知道, ASCII代码值的范围是 0255,不可能出现 -1,因此可以用 EOF作为文件结束标志。 11 【正确答案】 D 【试题解析】 C语言所调用的函数可以放在调用它的函数前 ,也可以放在调用它的函数后 ,所以 A错误。 C语言程序总是从 main函数开始执行 ,所以 B错误。 main函数的位置可以放在开始 ,也可以放在中间 ,也可以放在最后 ,所以 C错误。 12 【正确答案】 C 【试题解析】 %取余运算是二目运算符 ,且要求运算对象必须为整数 ,所以选 C。 13 【正 确答案】 B 【试
21、题解析】 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语言中的一个操作符 (operator),不是函数调用 ,简单的说其作用就是返回一个对象或者类
22、型所占的内存字节数。所以选择 A 16 【正确答案】 C 【试题解析】 C语言中用 “%“打印输出字符 “%“,所以 %d,输出为 %d两个普通字符 ,而不是格式控制符 “%d“的含义 ,所以打印结果为 C。 17 【正确答案】 A 【试题解析】 定义语句: char a=82;定义字符变量 a,但是赋初值时却给赋值字符常量,因此 A选项正确。 18 【正确答案】 B 【试题解析】 本题重点考察 字符变量的相关知识。分别给字符型变量 a和 b分别赋值为 A和 Y,即 A和 Y的 ASSCII码,因此输出结果为 65,89,因此 B选项正确。 19 【正确答案】 B 【试题解析】 本题重点考察
23、for语句的循环次数,for(x=0,y=0;(y!=99即将大写字母变为小写字母。因此 B选项正确。 29 【正确答案】 A 【试题解析】 本题中定义了一个指针数组,数组中存放的是字符指针, aa数组的两个元素分别包含了 5个字符,所以可以存放 5个字符的一维数组的首地址,所以 B选项错误。 aa数组的值是指向那两个字符串的字符指针,而不是那两个字符串,所以 C选项错误。 aa本身是一个指向两个字符指针的指针,所以 D选项错误。 30 【正确答案】 C 【试题解析】 本题主要考查了函数定义及调用,以及 while循环语句,执行 fun函数后,首先是找到最后一个字符的地址,然后减去第一个地址得
24、到的就是这个字符串的长度,所以本题答案为 8。 31 【正确答案】 D 【试题解析】 考查函数的递归调用, 只需要一步一步递归调用 fun函数即可,执行 fun( 5) = 5+( 4+( 3+( 2+ fun( 1) =15,所以答案为 D选项。 32 【正确答案】 A 【试题解析】 本题主要考查局部变量和全局变量的区别,题目中函数之外定义的d为全局变量,函数 fun内定义的 d为局部变量,所以执行 fun函数后,打印出8,执行完 d += a+;后 d变为 4,所以答案为 A。 33 【正确答案】 B 【试题解析】 题目中 fun函数被执行了两次,两次执行后,都是返回了函数内部的 b值,所
25、以答案为 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 【试题解析】 本题考查位运算 1为 1,二者与一下为 0,所以 B选项正确。 37 【正确答案】 B 【试题解析】 本
26、题考查结构体变量的引用,题目中要求输出结构体中成员 a的数据, p为指针, *p为结构体变量,那么 *p.a可以表示为结构体中成员 a的数据。 38 【正确答案】 D 【试题解析】 本题考查把数组名作为函数参数,执行 fun函数后, s的值并没有发生变化,仍然是指向 a,所以输出结果为 1.10,选项 D正确。 39 【正确答案】 D 【试题解析】 该题首先给二维数组赋值a34=1,3,5,79,11,13,1517,19,21,23; (*p)4=a指针 p指向二维数组 a的首地址,接下来执行 for循环,首先 i=0, j=0时 k=k+*( *( p+0) +0) =1( a00);然后 i=0, j=1时 k=k+*( *( p+0) +1) =4( a01);然后 j=2时,跳出 j的循环,执行 i的循环 i=1, j=0 时 k=k+*( *( p+1) +0)=13(a10);依次类推一直到 i=3时跳出全部循环。循环语句在这里的功能是累加二维数组第 1列和第 2列的元素,累加结果为 60。 40 【正确 答案】 D 【试题解析】 本题考查文件的定位, feof函数的用法是从输入流读取数据,如果到达文件末尾(遇文件结束符), eof函数值为非零值,否则为 0,所以选项 D正确。