1、国家二级( C语言)笔试模拟试卷 81及答案与解析 1 在深度为 5的满二叉树中,结点的个数为 ( )。 ( A) 32 ( B) 31 ( C) 16 ( D) 15 2 在数据结构中,从逻辑上可以把数据结构分成 ( )。 ( A)动态结构和静态结构 ( B)线性结构和非线性结构 ( C)集合结构和非集合结构 ( D)树形结构和图状结构, 3 下面这个程序段的时间复杂度是 ( )。 for (i=1; i n; i+) y=y+3; for (j=0;j =(2*n);j+) x+; ( A) O(log2n) ( B) O(n) ( C) O(nlog2n) ( D) O(n2) 4 程序
2、流程图 (PFD)中的箭头代表的是 ( )。 ( A)组成关系 ( B)控制流 ( C)调用关系 ( D)数据流 5 在面向对象方法中,如果 “鸡 ”是一类对象, “公鸡 ”、 “母鸡 ”等都继承了 “鸡 ”类的性质,因而是 “鸡 ”的 ( )。 ( A)子类 ( B)实例 ( C)对象 ( D)父类 6 在结构化设计方法中生成的结构图 (SC)中,带有圆圈的小箭头表示 ( )。 ( A) 模块 ( B)数据的流向 ( C)模块间的信息传递 ( D)模块之间的调用关系 7 程序的测试方法中,使用测试用例在计算机上运行程序,使程序在运行过程中暴露错误,这种方法称为 ( )。 ( A)静态分析 (
3、 B)动态分析 ( C)代码检查 ( D)代码质量度量 8 关系表中的每一横行称为一个 ( )。 ( A)元组 ( B)码 ( C)属性 ( D)字段 9 下列关系运算中,能使经运算后得到的新关系中元组个数少于原来关系中元组个数的是 ( )。 ( A)选择 ( B)投影 ( C)连接 ( D) 并 10 利用 E-R模型进行数据库的概念设计,可以分成 3步:首先设计局部 E-R模型,然后把各个局部 E-R模型综合成一个全局的模型,最后对全局 E-R模型进行( ),得到最终的 E-R模型。 ( A)简化 ( B)结构化 ( C)最小化 ( D)优化 11 能将高级语言程序转换成目标语言程序的是
4、_。 ( A)调试程序 ( B)解释程序 ( C)编译程序 ( D)编辑程序 12 是构成 C语言程序的基本单位。 ( A)函数 ( B)过程 ( C)子程序 ( D)子例程 13 可以在 C语言中 用做用户标识符的是 _。 ( A) void define WORD ( B) as_b3 _123 If ( C) for -abc cas ( D) 2c Do SIG 14 若有以下类型说明语句: char w; int x; float y, z; 则表达式 w*x+z-y的结果为 _类型。 ( A) float ( B) char ( C) int ( D) double 15 main
5、() float x=123.456; printf(“%-5.2fn“,x);以上程序输出的结果是_。 ( A) 123.4 ( B) 123.5 ( C) 123.45 ( D) 123.46 16 下面语句的输出结果是 _。 printf(“%dn“,strlen(“t“065xffn“); ( A) 14 ( B) 8 ( C) 5 ( D)输出项不合法,无正常输出 17 下列程序的输出结果是 _。 main() int a=0, b=0, c=0; if(+a0|+b 0)+c; printf(“na=%d,b=%d,c=%d“,a,b,c) ; ( A) a=0,b=0,c=0 (
6、 B) a=1,b=1,c=1 ( C) a=1,b=0,c=1 ( D) a=0,b=1,c=1 18 下列程序的输出结果是 _。 main() int i; for(i=1; i+1; i+) if(i 4)printf(“%d“,i+); break; printf(“%d“,i+); ( A) 55 ( B) 56 ( C)程序错误,没有输出 ( D)循环条件永远为真,死循环 19 下列程序的输出结果是 _。 #define A100 main() int i=0,sum=0; do if(i=(i/2)*2)continue; sum+=i; while(+i A) ; printf
7、(“%dn“,sum); ( A) 2500 ( B) 2050 ( C) 4 ( D) 0 20 下列程序的输出结果是 _。 main() int i=3; switch(i) case 1: case 2: printf(“%d“,i); case 3: case 4: break; default:printf(“OK“); ( A) 0 ( B) 3 ( C) OK ( D)没有任何输出 21 若 x和 y代表整型数,以下表达式中不能正 确表示数学关系 |x-y| 10的是 ( )。 ( A) abs(x-y) 10 ( B) x-y -10 for(b=1;b =c;b+) s=s+
8、1; 则与上述程序段功能等价的赋值语句是 ( )。 ( A) s=a+b; ( B) s=a+c; ( C) s=s+c; ( D) s=b+c; 23 有以下程序: main() int x=0,y=5,z=3; while(z- 0 printf(“%d,%d,%dn“,x,y,z); 程序执行后的输出结果是 ( )。 ( A) 3,2,0 ( B) 3,2, -1 ( C) 4,3, -1 ( D) 5, -2, -5 24 有以下程序: main() int i,s=0; for(i=1;i 10;i+=2) s+=i+1; ptintf(“%dn“,s); 程序执行后的输出结果是 (
9、 )。 ( A)自然数 1 9的累加和 ( B)自然数 1 10的累加和 ( C)自然数 1 9中奇数之和 ( D)自然数 1 10中偶数之和 25 有以下程序: main() int i,n=0; for(i=2;i 5;i+) do if(i%3) continue; n+; while(!i); n+; printf(“n=%dn“,n); 程序执行后的输出结果是 ( )。 ( A) n=5 ( B) n=2 ( C) n=3 ( D) n=4 26 若程序中定义了以下函数: double myadd(double a,double b) return (a+b); 并将其放在调用语句之
10、后,则在调用之前应该对该函数进行说明,以下选项中错误的说明是 ( )。 ( A) double myadd(double a,b); ( B) double myadd(double,double); ( C) double myadd(double b,double a); ( D) double myadd(double x,double y); 27 有以下程序: char fun(char x,char y) if(x y) return x; return y; main() int a=9,b=8,c=7; printf(“%cn“,fun(fun(a,b),fun(b,c); 程
11、序的执行结果是 ( )。 ( A) 函数调用出错 ( B) 8 ( C) 9 ( D) 7 28 设有定义: int n=0,*p=,则以下选项中,正确的赋值语句是 ( )。 ( A) p=1; ( B) *q=2; ( C) q=p; ( D) *p=5; 29 有以下程序: void f(int v,int w) int t; t=v;V=W;W=t; main() int x=1,y=3,z=2; if(x y) f(x,y); else if(y z) f(y,z); else f(x,z); printf(“%d,%d %dn“,x,y,Z); 执行后输出结果是 ( )。 ( A)
12、1, 2, 3 ( B) 3, 1, 2 ( C) 1, 3, 2 ( D) 2,3, 1 30 有以下程序段: int a10=1,2,3,4,5,6,7,8,9,10,*p= b=p5; b中的值是 ( )。 ( A) 5 ( B) 6 ( C) 8 ( D) 9 31 s1和 s2已正确定义并分别指向两 个字符串。若要求:当 s1所指字符串大于 s2所指字符串时,执行语句 S;则以下选项中正确的是 ( )。 ( A) if(sl s2)S; ( B) if(strcmp(s1,s2)S; ( C) if(strcmp(s2,s1 0)S; ( D) if(strcmp)(s1,s2) 0
13、)S; 32 下面程序的输出结果是 ( )。 include stcdio.h f(int b,int n) int i,r; r = 1; for(i=0;i =n;i+) r=r*bi; return r; main() int x,a=2,3,4,5,6,7,8,9; x=f(a,3); printf(“%dn“,x); ( A) 720 ( B) 120 ( C) 24 ( D) 6 33 有以下程序: #include stdio.h main() int a=1,2,3,4,5,6,7,8,9,10,11,12,*p=a+5,*q=NULL; *q=*(p+5); printf(“
14、%d %d n“,*p,*q); 程序运行后的输出结果是 ( )。 ( A)运行后报错 ( B) 66 ( C) 611 ( D) 510 34 有以下程序: int f(int b4) int i,j,s=0; for(j=0;i 4;i+) i=j; if(i 2) i=3-j; s+=bij; return s; main() int a44=1,2,3,4,0,2,4,6,3,6,9,12,3,2,1,0; printf(“%dn“,f(a); 执行后的输出结果是 ( )。 ( A) 12 ( B) 11 ( C) 18 ( D) 16 35 有以下定义: #include stdio
15、.h char a10,*b=a; 不能给数组 a输入字符串的语句是 ( )。 ( A) gets(a) ( B) gets(a10) ( C) gets( printf(“%dn“, strlen(p4); 执行后输出结果是 ( )。 ( A) 2 ( B) 3 ( C) 4 ( D) 5 37 在函数调用过程中,如果函数 funA调用了函数 funB,函数 funB又调用了函数funA,则 ( )。 ( A)称为函数的直接递归调用 ( B)称为函数的间接递归调用 ( C)称为函数的循 环调用 ( D) C语言中不允许这样的递归调用 38 已有定义: int i,a10,*p;,则合法的赋值
16、语句是 ( )。 ( A) p=100; ( B) p=a5 ( C) p=a2+2 ( D) p=a+2; 39 有以下程序: fun (iht a, int b) if(a b)return(a); else return(b); main() int x=3,y=8,z=6,r; r=fun(fun(x,y),2*z); printf(“%dn“,r); 程序运行后的输出结果是 ( )。 ( A) 3 ( B) 6 ( C) 8 ( D) 12 40 若有定义 “int*p3;”,则以下叙述中正确的是 ( )。 ( A)定义了一个基类型为 int的指针变量 p,该变量具有 3个指针 (
17、B)定义了一个指针数组 p,该数组含有 3个元素,每个元素都是基类型为 int的指针 ( C)定义了一个名为 *p的整型数组,该数组含有 3个 int类型元素 ( D)定义了一个可指向一维数组的指针变量 p,所指一维数组应具有 3个 int类型元素 41 有以下程序: main() unsigned char a,b,c; a=0x3; b=a|0x8; c=b 1; printf(“%d%dn“,b,C); 程序运行后的输出结果是 ( )。 ( A) -11 12 ( B) -6 -13 ( C) 12 24 ( D) 11 22 42 下面程序的功能是输出以下形式的金字塔图案: * * *
18、 * main() int i,j; for(i=1;i =4;i+) for(j=1;j =4-i;j+)printf(“ “); for(j=1;j=( );j+)printf(“*“); printf(“n“); 在下划线处应填入的是 ( )。 ( A) i ( B) 2*-1 ( C) 2*i+1 ( D) i+2 43 有以下程序: void sort(int a, int n) int i,j,t; for(i=0;i n-1;i+=2) for(j=i+2;j n;j+=2) if(ai aj)t=ai;ai=aj;aj=t; main() int aa10=1,2,3,4,5,
19、6,7,8,9,10,i; sort(aa,10); for(i=0;i 10;i+) printf(“%d“,aai); printf(“n“); 其输出结果是 ( )。 ( A) 1,2,3,4,5,6,7,8,9,10, ( B) 10,9,8,7,6,5,4,3,2,1, ( C) 9,2,7,4,5,6,3,8,1,10, ( D) 1,10,3,8,5,6,7,4,9,2, 44 以下程序段中,不能正确赋字符串 (编译时系统会提示错误 )的是 ( )。 ( A) char s10=“abcdefg“; ( B) char t=“abcdefg“,*s=t; ( C) char s1
20、0;s=“abcdefg“; ( D) char s10;strcpy(s,“abcdefg“); 45 有以下程序: #include string.h main(int argc, char *argv ) int i,len=0; for(i=1;i argc;i+=2) len+=strlen(argvi); printf(“%dn“,len); 经编译链接后生成的可执行文件是 ex.exe,若运行时输入以下带参数的命令行 ex abcd efg h3 k44 执行后输出的结果是 ( )。 ( A) 14 ( B) 12 ( C) 8 ( D) 6 46 有以下程序: void f(i
21、nt a,int i,int j) int t; if(i j) t=ai;ai=aj;aj=t; f(a,i+1,j-1); main() int i, aa5=1,2,3,4,5; f(aa,0,4); for(i=0;i 5;i+) printf(“%d,“,aai); printf(“n“); 执行后输出结果是( )。 ( A) 5,4,3,2,1, ( B) 5,2,3,4,1, ( C) 1,2,3,4,5, ( D) 1,5,4,3,2, 47 有以下程序: struct STU char num10; float score3;); main() struct stu s3=“
22、20021“,90,95,85, “20022“,95,80,75, “20023“,100,95,90,*p=s; int i; float sum=0; for(i=0;i 3,i+) sum=sum+p- scorei; printf(“%6.2fn“,sum); 程序运行后的输出结果是 ( )。 ( A) 260 ( B) 270 ( C) 280 ( D) 285 48 有以下程序: #include stdlib.h main() char *p,*q; p=(char*)malloc(sizeof(char)*20); q=p; scanf(“%s%s“,p,q); ptintf
23、(“%s%sn“,p,q); 若从键盘输入 abc def回车,则输出的结果是 ( )。 ( A) def def ( B) abc def ( C) abc d ( D) d d 49 有以下程序: #include stdio.h main() FILE *fp; int i,k=0,n=0; fp=fopen(“d1.dat“,“w“); for(i=1;i 4;i+) fprintf(fp,“%d“,i); fclose(fp); fp=fopen(“d1.dat“,“r“); fscanf(fp,“%d%d“, printf(“%d %dn“, k,n); fclose(fp); 执
24、行后输出结果是 ( )。 ( A) 1 2 ( B) 123 0 ( C) 1 23 ( D) 0 0 50 以下程序试图把从终端输入的字符输出到名为 abc.txt的文件中,直到从终端读入字符 #时结束输入和输出操作,但程序有错。 #include stdio.h main() FILE *fout; char ch; fout=fopen(abc.txt,W); ch=fgetc(stdin); while (ch!=#) fputc (ch,fout); ch=fgetc(stdin); fclose (fout); 出错的原因是 ( )。 ( A)函数 fopen调用形式错误 ( B)
25、输入文件没有关闭 ( C)函数 fgetc调用形式错误 ( D)文件指针 stdin没有定义 51 在最坏情况下,冒泡排序所需要的比较次数为【 】。 52 在面向对象方法中,信息隐蔽是通过对象的【 】性来实现的。 53 软件生命周期包括 8个阶段。为使各时期的任务更明确,又可以分为以下 3个时期:软件定义期、软件开发期、软件维护期。编码和测试属于【 】期。 54 数据独立性分为逻辑独立性与物理独立性。当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程序不必修改,称为【 】。 55 在关系运算中,【 】运 算是在指定的关系中选取所有满足给定条件的元组,构成一个新的关系,而这个
26、新的关系是原关系的一个子集。 56 执行下列程序的输出结果是【 】。 main() float a = 1,b; b=+a* +a; printf(“%fn“,b); 57 若有如下程序: main() int s=1,2,3,4,5,6,*p=s; printf“%d,%dn“,*(p+3),*(p+5) 则程序运行后的输出结 果是【 】。 58 执行下面程序后,输出结果是【 】。 main() char s12=“very good!“; printf(“%d“,strlen(s); 59 若有如下程序: void sub() static int x=8; x/=2;printf(“%d
27、“,x); main() int m; for(m=0;m 2;m+) sub(); 则程序运行后的输出结果是 【 】 . 60 若有以下程序: main() int a44=l,2,-3,-4,0,-12,-13,14,-21,23,0,-24, -31,32,-33,0; int i,j,s=0; for( i=0; i 4; i+ ) for( j=0; j 4; j+ ) if (aij 0) continue; if (aij=0) break; s+=ai j; printf(“%dn“,s); 执行后输出的结果是【 】。 61 double fun(int n) double s
28、=0.0,fac=1.0; int i; for(i=1;i =n;i+) fac=fac 【 】; s=s+fac; return s; 62 若有以下程序: int f(int x,int y) return (y-x)*x; main() int a=3,b=4,c=5,d; d=f(f(3,4),f(3,5); printf(“%dn“,d); 执行后输出的结果是【 】。 63 设函数 findbig已定义为求 3个数中的最大值。以下程序将利用函数指针调用findbig函数。请填空。 main() int findbig(int,int,int); int(*f) (),x,yz,z,
29、big; f=【 】 ; scanf(“%d%d%d“, big=(*f)(x,y,z); printf(“big=%dn“,big); 64 以下程序的输出结果是【 】。 #define MCRA(m) 2*m #define MCRB(n,m) 2*MCRA(n)+m main() int i=2, j=3; printf(“%dn“,MCRB(j,MCRA(i); 65 设有以下定义: struct ss int info; struct ss *link; x,y,z; 且已建立如下图所示链表结构, 请写出删除点 y的赋值语句【 】。 66 已有文本文件 test.txt,其中的内容为
30、: Hello,everyone!。以下程序中,文件test.txt已正确为 “读 ”而打开,由文件指针 fr指向该文件,则程序的输出结果是【 】。 #include stdio.h main() FILE *fr; char str40; fgets(str,5,fr); printf(“%sn“,str); fclose(fr); 67 下面 rotme函数的功能是:将 n行 n列的矩阵 A转置为 A。例如: 请填空。 #define N 4 void rotate(int aN) int i,j,t; for(i=0;i N;i+) for(j=0;【 】 ;j+) t=aij; 【 】
31、 ; aj i=t; 68 以下函数的功能是删除字符串 s中的所有数字字符。请填空。 void dele (char *s) int n=0,i; for(i=0, si; i+) if (【 】 ) sn+=si; sn=【 】 ; 国家二级( C语言)笔试模拟试卷 81答案与解析 1 【正确答案】 B 【试题解析】 根据二叉树的定义,深度为 m的二叉树最多有 2m-1个结点。由此可知答案为 B项。注意,满二叉树中叶子结点的个数为 2m-1个。 2 【正确答案】 B 【试题解析】 逻辑结构即数据元素之间的逻辑关系,是从逻辑关系上描述数据,与数据的存储无关。因此根据数据元素 与数据元素之间的关
32、系,逻辑结构被分为两大类:线性结构和非线性结构。 3 【正确答案】 D 【试题解析】 语句的频度指的是该语句重复执行的次数。一个算法中所有语句的频度之和构成了该算法的运行时间。在本例算法中,语句 的频度是 n-1,语句 的频度是 (n-1)(2n+1)-2n2-n-1。则该程序段的时间复杂度是 T(n)=n-1+2n2-n-1=O(n2)。 4 【正确答案】 B 【试题解析】 在程序流程图 (PFD)中,箭头代表的是控制流,用以指明程序的动态执行顺序。 5 【正确答案】 A 【试题解析】 面向对象方法中,继承是表示类之间的相似性的机制。如果类 X继承类 Y,则 X为 Y的子类, Y为 X的父类
33、 (超类 )。如果 “鸡 ”是一类对象, “公鸡 ”、 “母鸡 ”等都继承了 “鸡 ”类的性质,因而是 “鸡 ”的子类。 6 【正确答案】 C 【试题解析】 在结构化设计方法中生成的结构图 (SC)中,包括以下 4种成分:模块 (用矩形框表示 )、调用 (带有箭头的连线 )、模块间信息传递 (带有圆圈的小箭头 )、辅助符号 (如菱形符号表示有条件的选择,循环调用符号表示循环调用下层模块等 )。 7 【正确答案】 B 【试题解析】 从是否需要执行被测软件的角度,测试方法可以分为静态测试和动态测试方法。静态测试包括代码检查、静态结构分析、代码质量度量等,动态测试是为了发现错误而执行程序的过程,是根
34、据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去运行程序,以发现程序错误的过程。如果将程序的测试方法分为静态分析和动态分析,则使用测试用例在计算机上运行程序,使程序在运行过程中暴露错误,这是动态分析。 8 【正确答案】 A 【试题解析】 在关系模型中,把数据看成一个二维表,每一个 二维表称为一个关系。关系表中的每一横行称为一个元组。 9 【正确答案】 A 【试题解析】 选择运算是在指定的关系中选取所有满足给定条件的元组,构成一个新的关系,而这个新的关系是原关系的一个子集。因此,一个关系经选择运算后得到的新关系中,元组个数少于原来关系中元组个数。 10 【正
35、确答案】 D 【试题解析】 在概念设计中按照模块的划分画出每个模块的 E-R图,然后把这些图合成一张 E-R图作为全局模型,最后应该对全局 E-R图进行优化,看看是否有重复和不合理的地方。不能只是进行简单的合并。 11 【正确答案】 C 【试题解析】 用高级语言编写的程序为 “源程序 ”,而计算机只能识别和执行由 0和 1组成的二进制指令,所以高级语言必须先用一种称为 “编译程序 ”的软件,把源程序翻译成二进制形式的 “目标程序 ”。 12 【正确答案】 A 【试题解析】 C程序是由函数构成的。一个 C源程序至少包含一个 main函数,也可以包含一个 main函数和若干个其他函数,因此,函数是
36、 C程序的基本单位。 13 【正确答案】 B 【试题解析】 C语言规定,标识符只能由字母、数字和下划线三种符号组成,而且第 一个字符必须是字母或下划线。另外还需要注意的是关键字不能作标识符。选项 A中 void, C中 for都为关键字, D中 2c以字母开头。 14 【正确答案】 A 【试题解析】 在进行运算时,不同类型的数据参加运算;需要先将其转换成同一类型的数据,然后再进行运算。转换的顺序由低到高为:char,shorintunsignedlongdoublefloat ,故结果为 float型。 15 【正确答案】 D 【试题解析】 f格式符,用来输出实数,以小数形式输出。 “%-m.
37、nf”的含义是:输出数据 共占 m列,其中 n位小数,如果输出位数小于 m,则右端补空格。如果总长度大于列数,则按实际情况四舍五入输出。 16 【正确答案】 C 【试题解析】 在 C语言中,以 “”开头的字符均为转义字符,其中 “”后可跟 1 3位八进制数或在 “”后跟字母 x及 1 2位十六进制数,以此来代表一个特定的字符。 17 【正确答案】 C 【试题解析】 “|”是或运算,它有个 “短路 ”的特点需特别注意,当 “|”运算符左边的表达式的值为真时,则程序就不再对 “|”右边的表达式的值进行运算,而是使得整个表达式的值直接 为真。 18 【正确答案】 B 【试题解析】 本程序中有个 fo
38、r循环,但注意到 for循环的条件是 “i+1”,也就是只要 i+1的值为真 (非零值均为真 ),就执行循环。当 i=1的时, i+1的值为真,判断if条件不成立,执行 i+,输出 i的值为 5。 19 【正确答案】 A 【试题解析】 本题程序的功能是求 1到 99之间 (包括 1和 99)所有奇数之和。程序中的 while循环的终止条件为 +i=100,在 while循环体内,如果 i是偶数,则执行 continue,跳过这一次循环,执行下一次循环,否则求和 。最后输出的值是 1到 99之间 (包括 1和 99)所有奇数之和 (1+99)*50/2=2500。 20 【正确答案】 D 【试题
39、解析】 在题中, i的值为 3,由于 “case 3: ”后面没有 break语句,所以继续向下执行 “case 4:”后面的语句,由于 “case 4: ”后面的语句为 break强行迟出switch语句,所以,本题没有任何输出。 21 【正确答案】 C 【试题解析】 选项 A用了一个绝对值函数 abs(),故选项 A正确;选项 B中用了一个 ”语句的 fopen()函数参数是错误的,应该用双引号 “,正确的应改为 “fout=fopen(“abc.txt“, “w“);”。所以, A选项为所选。 51 【正确答案】 n(n-1)/2 【试题解析】 在最坏情况下,冒泡排序所需要的比较 次数为 n(n-1)/2。 52 【正确答案】 封装 【试题解析】 封装是一种信息隐蔽技术,目的在于将对象的使用者和对象的设计者分开。用户只能见到对象封装界面上的信息,不必知道实现的细节。 53 【正确答案】 软件开发。