1、二级 C语言笔试 35及答案解析(总分:78.00,做题时间:90 分钟)一、B选择题/B(总题数:50,分数:50.00)1.设 p1和 p2是指向同一个 int型一维数组的指针变量,k 为 int型变量,则下列不能正确执行的语句是_。(分数:1.00)A.k=*p1+*p2;B.p2=k;C.p1=p2;D.k=*p1*(*p2);2.在 C语言中,合法的长整型常数是_。(分数:1.00)A.OLB.4962710C.04312765D.0xa34b7fe3.下列程序的输出结果是_。 fun() static int x=5; if(x+5)printf(“%d“,x); else pri
2、ntf(“%d“,x+); main() fun();fun(); (分数:1.00)A.67B.69C.68D.784.以下程序的输出结果是_。 #includestdio.h main() printf(“%d/n“,NULL); (分数:1.00)A.不确定的(因变量无定义)B.0C.-1D.15.以下程序的输出结果是_。 main() int k=4,m=1,p; p=func(k,m);printf(“%d,“,p); p=func(k,m);printf(“%d/n“,p); func(int a,int B) static int m=0,i=2; i+=m+1;m=i+a+b;
3、 return(m); (分数:1.00)A.8,17B.8,16C.8,20D.8,86.下列程序的输出结果是_。 #includestdio.h main() union int k; char i2; *s,a; s= printf(“%d,%d/n“,a,B) ; (分数:1.00)A.6,1B.2,1C.6,0D.2,08.在深度为 5的满二叉树中,叶子结点的个数为_。(分数:1.00)A.32B.31C.16D.159.下面程序 main() int y=9; for(;y0;y-) if(y%30) printf(“%d“,-y); continue; 的输出是_。(分数:1.0
4、0)A.741B.852C.963D.87542110.下面函数 int funl(char*x) char *y=x; while(*y+); return(y-x-1); 的功能是_。(分数:1.00)A.求字符串的长度B.比较两个字符串的大小C.将字符串 x复制到字符串 yD.将字符串 x连接到字符串 y后面11.下列选项中非法的表达式是_。(分数:1.00)A.0=x100B.i=j=0C.(cha(65+3)D.x+1=x+112.下列四个叙述中,错误的是_。(分数:1.00)A.C语言中的关键字必须小写B.C语言中的标识符必须全部由字母组成C.C语言不提供输入输出语句D.C语言中的
5、注释行可以出现在程序的任何位置13.以下对结构体类型变量的定义中,不正确的是_。(分数:1.00)A.typedef struct aa int n; float m; aa; aa td1;B.#define aa struct aa aa int n; float m; td1;C.struct int n; float m; aa; struct aa td1;D.struct int n; float m; td1;14.下面的程序 main() int x=3,y=0,z=0; if(x=y+z)printf(“*“); else printf(“#“); _。(分数:1.00)A.
6、有语法错误不能通过编译B.输出*C.可以通过编译,但是不能通过连接,因而不能运行D.输出#15.以下程序的输出结果是_。 main() union char i2; int k; r; r.i0=2; r.i1=0; printf(“%d/n“,r.k); (分数:1.00)A.2B.1C.0D.不确定16.有如下程序 main() int n=9; while(n6) n-; printf(“%d“,n); 该程序的输出结果是_。(分数:1.00)A.987B.876C.8765D.987617.在 C语言中,要求运算数必须是整型的运算符是_。(分数:1.00)A.%B./C.D.!18.执
7、行下面的程序段 int x=35; char z=A; int B; B=(xwhile(-y); printf(“%d/n“,y-); (分数:1.00)A.-1B.1C.8D.025.若有以下说明: int a10=1,2,3,4,5,6,7,8,9,10,*p=a; 则值为 6的表达式是_。(分数:1.00)A.*p+6B.*(p+6)C.*p+=5D.p+526.以下程序调用 findmax函数求数组中值最大的元素在数组中的下标,请选择填空: #includestdio.h findmax(int*s,int t,int*k) int p; for(p=0,*k=p;pt;p+) if
8、(sps*k)_; main() int a10,i,k; for(i=0;i10;i+)scanf(“%d“,C.a=a/b=2;D.a=aa+1;二、B填空题/B(总题数:14,分数:28.00)51.设一棵完全二叉树共有 500个结点,则在该二叉树中有U 【1】 /U个叶子结点。(分数:2.00)填空项 1:_52.在最坏情况下,冒泡排序的时间复杂度为U 【2】 /U。(分数:2.00)填空项 1:_53.面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个U 【3】 /U。(分数:2.00)填空项 1:_54.软件的需求分析阶段的工作,可以概括为四个方面:U 【4】 /U、
9、需求分析、编写需求规格说明书和需求评审。(分数:2.00)填空项 1:_55.U 【5】 /U是数据库应用的核心。(分数:2.00)填空项 1:_56.若由以下定义,则不移动指针 p,且通过指针 p引用值为 98的数组元素的表达式是U 【6】 /U。int w10=23,54,10,33,47,98,72,80,61,*p=w;(分数:2.00)填空项 1:_57.以下程序的输出结果是U 【7】 /U。 #define MAX(x,y)(x)(y)?(x):(y) main() int a=5,b=2;c=3,d=3,t; t+MAX(a+,b,c+D) *10; printf(“%d/n“,
10、t); (分数:2.00)填空项 1:_58.以下程序的输出结果是U 【8】 /U。 main() unsigned short a=65536; int b; printf(“%d/n“,b=A) ; (分数:2.00)填空项 1:_59.若已经定义 int a=25,b=14,c=19;,以下三目运算符(?:)所构成的语句的执行结果是U 【9】 /U。 a+=2的功能相同,请补充完整。 if(U 【10】 /U) if(U 【11】 /U)y=2*x-1; else y=x; else y=3*x-11;(分数:2.00)填空项 1:_61.以下程序中用户由键盘输入一个文件名,然后输入一串
11、字符(用#结束输入)存放到此文件中,形成文本文件,并将字符的个数写到文件的尾部。请填空。 #includestdio.h main() FILE *fp; char ch,fname32; int count=0; printf(”Input the filename:“); scanf(“%s“,fname); if(fp=fopen(U 【12】 /U,“w+“)=NULL) printf(“Cant open file:%s/n“,fname);exit(0); printf(“Enter data:/n“); while(ch=getchar()!=#) fputc(ch,fp);co
12、unt+; fprintf(U 【13】 /U,“/n%d/n“,count); fclose(fp); (分数:2.00)填空项 1:_62.函数 void fun(float*sn,int n)的功能是:根据以下公式计算 S,计算结果通过形参指针 sn传回;n通过形参传入,n 的值大于等于 0。请补全程序。 S=1-1/3+1/5-1/7+1/(2n+1) void fun(float*sn,int n) float s=0.0,w,f=-1.0; int i=0; for(i=0;i=n;i+) f=U 【14】 /U*f; w=f/(2*i+1); s+=w; U 【15】 /U=s;
13、 (分数:2.00)填空项 1:_63.下面的函数 strcat(str1,str2)实现将字符串 str2拼接到字符串 str1后面的功能。请填空使之完整。char*strcat(str1,str2) char*str1,*str2; char*t=str1; while(U 【16】 /U)str1+; while(U 【17】 /U); return(t);(分数:2.00)填空项 1:_64.以下函数 fun用于求两个整数 a和 b的最大公约数。 fun(a,B) int a,b; int i,j,m,n; if(aB) m=a;a=b;U 【18】 /U; i=a;j=b; whil
14、e(n=U 【19】 /U)!=0) j=i;i=U 【20】 /U; return(i); (分数:2.00)填空项 1:_二级 C语言笔试 35答案解析(总分:78.00,做题时间:90 分钟)一、B选择题/B(总题数:50,分数:50.00)1.设 p1和 p2是指向同一个 int型一维数组的指针变量,k 为 int型变量,则下列不能正确执行的语句是_。(分数:1.00)A.k=*p1+*p2;B.p2=k; C.p1=p2;D.k=*p1*(*p2);解析:评析 指针变量中只存放地址(指针),不要将个整型量(或任何其他非地址类型的数据)赋给个指针变量,所以 B 是不正确的。2.在 C语
15、言中,合法的长整型常数是_。(分数:1.00)A.OL B.4962710C.04312765D.0xa34b7fe解析:评析 在一个整常量后面加个字母 1或 L,则认为是 long int型常量。3.下列程序的输出结果是_。 fun() static int x=5; if(x+5)printf(“%d“,x); else printf(“%d“,x+); main() fun();fun(); (分数:1.00)A.67B.69C.68 D.78解析:评析 模块的代码开始运行后,使用 static语句声明的变量会直保持其值,直至该模块复位或重新启动。在第 1次调用 fun函数时,x 的初值
16、为 5,if 语句的条件不成立,执行 else printf(“%d“x+);语句,输出 6,执行后 x的值变为 7,由于 x是静态局部变量,在函数调用结束后,它并不释放,仍保留x=7。在第 2次调用 fun函数时,if 语句的条件成立,执行 printf(“%d“,x);语句,输出 8。4.以下程序的输出结果是_。 #includestdio.h main() printf(“%d/n“,NULL); (分数:1.00)A.不确定的(因变量无定义)B.0 C.-1D.1解析:评析 NULL 在 C编译器中是个值为 0的常量,它的定义在头文件“stdio.h”中,本题的程序在一开始就包含了这个
17、头文件,所以,在打印的时候,将打印出 0。5.以下程序的输出结果是_。 main() int k=4,m=1,p; p=func(k,m);printf(“%d,“,p); p=func(k,m);printf(“%d/n“,p); func(int a,int B) static int m=0,i=2; i+=m+1;m=i+a+b; return(m); (分数:1.00)A.8,17 B.8,16C.8,20D.8,8解析:评析 将 k和 m的值带入函数 func中,第次调用完 func()后,其中 m和 i的值要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果
18、是 8和 17。6.下列程序的输出结果是_。 #includestdio.h main() union int k; char i2; *s,a; s= printf(“%d,%d/n“,a,B) ; (分数:1.00)A.6,1B.2,1 C.6,0D.2,0解析:评析 第个表达式中,运算的方向是从左至右,所以 a的值为 2;第二个表达式中,等式右边是个逻辑表达式,由于结果为真,所以表达式的值为 1,即 b为 1。8.在深度为 5的满二叉树中,叶子结点的个数为_。(分数:1.00)A.32B.31C.16 D.15解析:评析 所谓满二叉树是指除最后一层外,每层上的所有结点都有两个子结点。也就
19、是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第 K层上有 2k-1个结点,且深度为 m的满二叉树有 2m个结点在满二叉树中,最后一层的结点个数就是叶子结点的个数,本题中深度为 5,故叶子结点数为 25-1=24=16。9.下面程序 main() int y=9; for(;y0;y-) if(y%30) printf(“%d“,-y); continue; 的输出是_。(分数:1.00)A.741B.852 C.963D.875421解析:评析 “%”是求余运算符,所以 if判断语句中实际是指出只有当 y可以被 3整除时方可以继续;-y是先进行 y的自减运算,再使用 y值。
20、所以,最后的打印结果应当为“852”。10.下面函数 int funl(char*x) char *y=x; while(*y+); return(y-x-1); 的功能是_。(分数:1.00)A.求字符串的长度 B.比较两个字符串的大小C.将字符串 x复制到字符串 yD.将字符串 x连接到字符串 y后面解析:评析 本题的考查点是 while()循环语句。 本题首先要注意的是对*y+的运算,由于+和*为同优先级别,且结合方向为自右向左,因此它相当于*(y+)。由于+在 y的右侧是“后加”,因此先对 y的原值进行*运算,然后使 y的值改变。11.下列选项中非法的表达式是_。(分数:1.00)A.
21、0=x100B.i=j=0C.(cha(65+3)D.x+1=x+1 解析:评析 赋值表达式的左侧不能为常量或表达式,所以 D是非法的表达式。12.下列四个叙述中,错误的是_。(分数:1.00)A.C语言中的关键字必须小写B.C语言中的标识符必须全部由字母组成 C.C语言不提供输入输出语句D.C语言中的注释行可以出现在程序的任何位置解析:评析 C 语言规定标识符只能由字母、数字和下划线 3种字符组成,且第个字符必须为字母或下划线。13.以下对结构体类型变量的定义中,不正确的是_。(分数:1.00)A.typedef struct aa int n; float m; aa; aa td1;B.
22、#define aa struct aa aa int n; float m; td1;C.struct int n; float m; aa; struct aa td1; D.struct int n; float m; td1;解析:评析 本题的考查点是结构体类型变量的定义。在选项 C中,aa 是个结构体变量,而不是结构体名,所以 struct aa td1;是非法的。14.下面的程序 main() int x=3,y=0,z=0; if(x=y+z)printf(“*“); else printf(“#“); _。(分数:1.00)A.有语法错误不能通过编译B.输出*C.可以通过编译,
23、但是不能通过连接,因而不能运行D.输出# 解析:评析 本题的考查点是运算符在表达式中的处理原则。本题中把 y+z的值赋给 x,由于 y和 z都等于 0,所以 x的值也为 0,表达式值为 false,输出#。if 语句中 if后面的表达式般为逻辑或关系表达式,但也可以是任意的数值类型。15.以下程序的输出结果是_。 main() union char i2; int k; r; r.i0=2; r.i1=0; printf(“%d/n“,r.k); (分数:1.00)A.2 B.1C.0D.不确定解析:评析 根据共用体的定义可知:共用体 r的成员 k和成员 i2是共用同段内存空间,所以,当程序给
24、 r.i0赋值后,实际上,共用体成员 k的值也确定了,为 2。所以打印输出的结果应当为 2。16.有如下程序 main() int n=9; while(n6) n-; printf(“%d“,n); 该程序的输出结果是_。(分数:1.00)A.987B.876 C.8765D.9876解析:评析 符合 n6 的 n只有 7,8,9;所以循环次数为 3。选项 C、D 可以排赊。又因 n在输出之前要执行 n-,所以输出结果只能是 876。17.在 C语言中,要求运算数必须是整型的运算符是_。(分数:1.00)A.% B./C.D.!解析:评析 题目的四个选项中,B、C、D 都不要求运算数必须为整
25、数,参与模运算(%)的运算数必须是整型数据。18.执行下面的程序段 int x=35; char z=A; int B; B=(xwhile(-y); printf(“%d/n“,y-); (分数:1.00)A.-1B.1C.8D.0 解析:评析 do-while 语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为 0时循环结束。当 y=0时循环结束,printf(“%d/n“,y-)语句是先输出 y再自减,所以输出结果为 0。25.若有以下说明: int a10=1,2,3,4,5,6,7,8,9,10,*p=a; 则值为 6的表达式是_。(分数:1.00)A.*p+6B.
26、*(p+6)C.*p+=5 D.p+5解析:评析 选项 A,*p+6,其值等于 1+6=7;选项 B,*(p+6),其值等于 a6=7;选项 C,*p+=5,其值等于*p=*p+5=1+5=6;选项 D,p+5 是个地址值。26.以下程序调用 findmax函数求数组中值最大的元素在数组中的下标,请选择填空: #includestdio.h findmax(int*s,int t,int*k) int p; for(p=0,*k=p;pt;p+) if(sps*k)_; main() int a10,i,k; for(i=0;i10;i+)scanf(“%d“,C.a=a/b=2; D.a=a
27、a+1;解析:评析 C 语言中的赋值号“=”是个运算符;赋值语句是由赋值表达式加上一个分号构成。赋值表达式的左侧不能为常量或表达式。二、B填空题/B(总题数:14,分数:28.00)51.设一棵完全二叉树共有 500个结点,则在该二叉树中有U 【1】 /U个叶子结点。(分数:2.00)填空项 1:_ (正确答案:250)解析:评析 所谓完全二叉树是指除最后一层外,每层上的结点数均达到最大值;在最后层上只缺少右边的若干结点。具有 n个结点的完全二叉树,其父结点数为 int(n/2),而叶子结点数等于总结点数减去父结点数。本题 n=500,故父结点数等于 int(500/2)=250,叶子结点数等
28、于 500-25=250。52.在最坏情况下,冒泡排序的时间复杂度为U 【2】 /U。(分数:2.00)填空项 1:_ (正确答案:n(n-1)/2 或 0(n(n-1)/2))解析:评析 冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为 n,则在最坏的情况下,冒泡排序需要经过 n/2遍的从:前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为 n(n-1)/2。53.面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个U 【3】 /U。(分数:2.00)填空项 1:_ (正确答案:实体)解析:评析 面向对象的程序设计方
29、法中涉及的对象是系统中用来描述客观事物的个实体,是构成系统的个基本单位,它由组表示其静态特征的属性和它可执行的组操作组成。54.软件的需求分析阶段的工作,可以概括为四个方面:U 【4】 /U、需求分析、编写需求规格说明书和需求评审。(分数:2.00)填空项 1:_ (正确答案:需求获取)解析:评析 软件的需求分析阶段的工作,可以概括为四个方面:需求获取、需求分析、编写需求规格说明书和需求评审。需求获取的目的是确定对目标系统的各方面需求。涉及到的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。55.U 【5】 /U是数据库应用的核心。(分数:2.00)填空项 1:_ (正确答案
30、:数据库设计)解析:评析 数据库设计是数据库应用的核心。在数据库应用系统中的个核心问题就是设计个能满足用户要求,性能良好的数据库,这就是数据库设计。56.若由以下定义,则不移动指针 p,且通过指针 p引用值为 98的数组元素的表达式是U 【6】 /U。int w10=23,54,10,33,47,98,72,80,61,*p=w;(分数:2.00)填空项 1:_ (正确答案:*(p+5)或 p5)解析:评析 本题的考查点是通过指针引用数组元素。 98 是数组 w的第 5个元素(最开始的为第 0个),而通过*p=w 已经将 p指向了数组 w,要想不移动指针 p而引用 98,可以有以下两种方法:p
31、5、*(p+5)。57.以下程序的输出结果是U 【7】 /U。 #define MAX(x,y)(x)(y)?(x):(y) main() int a=5,b=2;c=3,d=3,t; t+MAX(a+,b,c+D) *10; printf(“%d/n“,t); (分数:2.00)填空项 1:_ (正确答案:7)解析:评析 宏替换后,表达式 t=MAX(a+b,c+d)*10 即变为:t=(a+b)(c+d)?(a+b):(c+d)*10;由于(a+b)(c+d)为真,所以 t=(a+b),即为 7。58.以下程序的输出结果是U 【8】 /U。 main() unsigned short a=
32、65536; int b; printf(“%d/n“,b=A) ; (分数:2.00)填空项 1:_ (正确答案:0)解析:评析 对于个 nusigned short short来说,它能取的最大值是 65535。这里给 a赋值 65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以 a的值实际为 0。59.若已经定义 int a=25,b=14,c=19;,以下三目运算符(?:)所构成的语句的执行结果是U 【9】 /U。 a+=2的功能相同,请补充完整。 if(U 【10】 /U) if(U 【11】 /U)y=2*x-1; else y=x; else y
33、=3*x-11;(分数:2.00)填空项 1:_ (正确答案:【10】 x10)解析:【11】 x=1 评析 条件表达式的一般形式为,表达式 1?表达式 2:表达式 3条件运算符的执行顺序:先求解表达式 1,若为非 0(真)则求解表达式 2,此时表达式 2的值就作为整个条件表达式的值;若表达式 1的值为 0(假),则求解表达式 3,表达式 3的值就是整个条件表达式的值。 y=(x=10)?3*x-11:(x=1)?x:2*x-1;的功能是先求(x=1)?x:2*x-1;的值,所的的结果再与前面的语句构成条件表达式进行求值。所以10应该填 x10, 11应该填 x=1。61.以下程序中用户由键盘
34、输入一个文件名,然后输入一串字符(用#结束输入)存放到此文件中,形成文本文件,并将字符的个数写到文件的尾部。请填空。 #includestdio.h main() FILE *fp; char ch,fname32; int count=0; printf(”Input the filename:“); scanf(“%s“,fname); if(fp=fopen(U 【12】 /U,“w+“)=NULL) printf(“Cant open file:%s/n“,fname);exit(0); printf(“Enter data:/n“); while(ch=getchar()!=#) f
35、putc(ch,fp);count+; fprintf(U 【13】 /U,“/n%d/n“,count); fclose(fp); (分数:2.00)填空项 1:_ (正确答案:【11】fname)解析:【12】fp 评析 fopen()函数实现打开文件的功能,通常的调用方式为:FILE *fp;fp=fopen(文件名,使用文件方式),因此,第一个横线处要求填写要打开文件的名字 fname。fprintf()函数的般调用方式为:fprintf(文件指针,格式字符串,输出表列),所以第二个横线处应填写 fp。62.函数 void fun(float*sn,int n)的功能是:根据以下公式计
36、算 S,计算结果通过形参指针 sn传回;n通过形参传入,n 的值大于等于 0。请补全程序。 S=1-1/3+1/5-1/7+1/(2n+1) void fun(float*sn,int n) float s=0.0,w,f=-1.0; int i=0; for(i=0;i=n;i+) f=U 【14】 /U*f; w=f/(2*i+1); s+=w; U 【15】 /U=s; (分数:2.00)填空项 1:_ (正确答案:【14】-1 或-1.0)解析:【15】*sn 评析 由于在对 S求和时,相邻两项的符号刚好相反,而在函数 fun中没有对数据进行取反的操作,故第空的目的是对数据进行取反,以
37、保证序列中相邻两项的符号不同。故第个应填-1 或-1.0。在执行完循环体后,要将求和结果通过指针参数的形式传递绐调用 fun的函数,故第二空应填*sn。63.下面的函数 strcat(str1,str2)实现将字符串 str2拼接到字符串 str1后面的功能。请填空使之完整。char*strcat(str1,str2) char*str1,*str2; char*t=str1; while(U 【16】 /U)str1+; while(U 【17】 /U); return(t);(分数:2.00)填空项 1:_ (正确答案:【16】*str1 或 *str1!=/0 或 *str1!=0 或
38、*str1!=NUL)解析:【17】*str1+=*str2+ 或 *str1+=*str2,*str2+ 评析 函数 strcat(str1,str2)实现将字符串 str2连接到字符串 str1后面,所以首先要找到字符串 str1的串尾,根据 C语言的语法规定,一个串的串尾定是个隐含字符“/0”,而在程序中,对字符串中字符的访问是通过两个指针变量来完成的,因此要找到字符串 str1的串尾,要判断:str1 是否为“/0”,要找到字符串 str2的串尾,要判断*str2是否为“/0”,程序中必须以使字符串中字符逐顺序体现,所以在题中我们应填写“*str1”和“*str1+=*str2+”。6
39、4.以下函数 fun用于求两个整数 a和 b的最大公约数。 fun(a,B) int a,b; int i,j,m,n; if(aB) m=a;a=b;U 【18】 /U; i=a;j=b; while(n=U 【19】 /U)!=0) j=i;i=U 【20】 /U; return(i); (分数:2.00)填空项 1:_ (正确答案:【18】b=m)解析:【19】j%i 【20】n 评析 函数中的变量 i和 j分别存放两个形参的最小数和最大数,在语句i=a和 j=b执行之前,要将 a和 b分别变为最小数和最大数,当 ab 时,程序使用中间变量将两者交换,所以题中第个空中应当填写“b=m”;为求两个整数的最大公约数,程序的 where循环条件必须为 j整除 i成立,所以题中第二个空中应当填写“j%i”;程序要通过 i的值返回最大公约数,因此在循环中要将每次整除的公钓数赋给 i,以保证最后返回的是两个,整数的最大公约数,所以第三个空中应当填写“n”。