计算机等级考试二级C笔试试题及答案解析.docx
- 文档编号:12090414
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:27
- 大小:37.09KB
计算机等级考试二级C笔试试题及答案解析.docx
《计算机等级考试二级C笔试试题及答案解析.docx》由会员分享,可在线阅读,更多相关《计算机等级考试二级C笔试试题及答案解析.docx(27页珍藏版)》请在冰豆网上搜索。
计算机等级考试二级C笔试试题及答案解析
2010年3月计算机等级考试二级C笔试试题及答案解析
2010年3月计算机等级考试二级C笔试试题
一、选择题
(1)下列叙述中正确的是(A)
A)对长度为n的有序链表进行查找,最坏清况下需要的比较次数为n
B)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(n/2)
C)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(log2n)
D)对长度为n的有序链表进行对分查找,最坏情况下需要的比较次数为(nlog2n)
(2)算法的时问复杂度是指(D)
A)算法的执行时间
B)算法所处理的数据量
C)算法程序中的语司或指令条数
D)算法在执行过程中所需要的基本运算次数
(3)软件按功能可以分为:
应用软件、系统软件和支撑软件(或工具软件)。
下面属于系统软件的是(B)
A)编辑软件 B)操作系统 C)教务管理系统 D)浏览器
(4)软件(程序)调试的任务是(A)
A)诊断和改正程序中的错误 B)尽可能多地发现程序中的错误
C)发现并改正程序中的所有错误 D)确定程序中错误的性质
(5)数据流程图(DFD图)是(C)
A)软件概要设计的工具 B)软件详细设计的工具
C)结构化方法的需求分析工具 D)面向对象方法的需求分析工具
(6)软件生命周期可分为定义阶段,开发阶段和维护阶段。
详细设计属于(B)
A)定义阶段 B)开发阶段 C)维护阶段 D)上述三个阶段
(7)数据库管理系统中负责数据模式定义的语言是(A)
A)数据定义语言 B)数据管理语言 C)数据操纵语言 D)数据控制语言
(8)在学生管理的关系数据库中,存取一个学生信息的数据单位是(D)
A)文件 B)数据库 C)字段 D)记录
(9)数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它属于数据库设计的(A)
A)需求分析阶段 B)逻辑设计一阶段 C)概念设计阶段 D)物理设计阶段
(10)有两个关系R和T如下:
则由关系R得到关系T的操作是(A)
A)选择 B)投影 C)交 D)并
(11)以下叙述正确的是
A)C语言程序是由过程和函数组成的
B)C语言函数可以嵌套调用,例如:
fun(fun(x))
C)C语言函数不可以单独编译
D)C语言中除了main函数,其他函数不可作为单独文件形式存在
解析:
选B。
选项A错误,c语言中没有过程的概念。
选项B正确,c语言中函数可以嵌套调用。
选项C错误,c语言中可以对包含一个或多个函数的源程序单独编译。
选项D错误,c语言程序可以由多个源程序组成,其中一个源程序文件包含main函数,其他函数可以写在另外的源程序文件中,作为单独文件形式存在。
(12)以下关于C语言的叙述中正确的是
A)C语言中的注释不可以夹在变量名或关键字的中间
B)C语言中的变量可以在使用之前的任何位置进行定义
C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致
D)C语言的数值常量中夹带空格不影响常量值的正确表示
解析:
选A。
选项A正确,注释夹在变量名和关键字中间,变量和关键字失去意义,语法错误。
选项B错误,变量定义可以在函数开始,函数外面或者复合语句的开始。
不可以放在使用它之前的任何位置,比如放在循环体内会造成重复定义。
选项C错误,例如赋值语句,只要赋值兼容即可,不一定类型必须一致。
比如实型数据和字符数据都可以赋给整型变量。
选项D错误,原因同A。
(13)以下C语言用户标识符中,不合法的是
A)_1 B)AaBc C)a_b D)a—b
解析:
选D。
标识符由字母、数字、下划线组成,第一个字符必须为字母或下划线。
D出现了非法字符。
(14)若有定义:
doublea=22;inti=0,k=18;,则不符合C语言规定的赋值语句是
A)a=a++,i++; B)i=(a+k)<=(i+k); C)i=a; D)i=!
a;
解析:
选C。
运算符%要求两边的操作数必须为整数,所以选项C错误。
B和选项D中,可以将逻辑值赋给变量i,最后i的值都为0。
选项A中的自增赋值运算也是正确的,不过整体上是逗号表达式语句。
(15)有以下程序
#include
main()
{chara,b,c,d;
scanf(“%c%c”,&a,&b);
c=getchar();d=getchar();
printf(“%c%c%c%c\n”,a,b,c,d);
}
当执行程序时,按下列方式输入数据(从第1列开始,代表回车,注意:
回车也是一个字符)
12
34
则输出结果是
A)1234
B)12
C)12
3
D)12
34
解析:
选C。
程序用两种方式分别输入4个字符赋给a、b、c、d。
1赋给a,2赋给b,回车也是一个字符,赋给c,3赋给d,多余的字符不被读取。
最后的输出结果是选项C。
(16)以i关于C语言数据类型使用的叙述中错误的是
A)若要准确无误差的表示自然数,应使用整数类型
B)若要保存带有多位小数的数据,应使用双精度类型
C)若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型
D)若只处理“真”和“假”两种逻辑值,应使用逻辑类型
解析:
选D。
C语言中没有逻辑型数据,所以选项D错误,其他选项的说法正确。
(17)若a是数值类型,则逻辑表达式(a==1)||(a!
=1)的值是
A)1 B)0 C)2 D)不知道a的值,不能确定
解析:
选A。
逻辑或运算的两边只要有一个成立,结果就为真
(1)。
而a==l和a!
=l是相互对立的两个条件,肯定有一个成立,所以表达式的值为1。
(18)以下选项中与if(a==1)a=b;elsea++;语句功能不同的switch语句是
A)switch(a)
{case:
a=b;break;
default:
a++;
}
B)switch(a==1)
{case0:
a=b;break;
case1:
a++;
}
C)switch(a)
{default:
a++;break;
case1:
a=b;
}
D)switch(a==1)
{case1:
a=b;break;
case0:
a++;
}
解析:
选B。
选项A和选项C根据switch语句的功能,可以判断是正确的。
选项A和选项C中,主要看表达式(a==1)。
当a=1时,此表达式成立,值为1,应该执行case1;当a!
=l时,此表达式不成立,值为0,应该执行case0。
只有选项B与其他功能不同。
(19)有如下嵌套的if语句
if(a if(a
elsek=c;
else
if(b
elsek=c;
以下选项中与上述if语句等价的语句是
A)k=(a B: C; B)k=(a ((Bc)? b: c); C)k=(a ((A A: E): ((B B: C); D)k=(a A: C; 解析: 选C。 条件语句k=(a a: b的功能: if(a k=a; else k=b; 排除A和D的基础上,选项C的功能和题目是完全等价的。 (20)有以下程序 #include main() {ini,j,m=1; for(i=1;i<3;i++) {for(j=3;j>O;j--) {if(i*j)>3)break; m=i*j; } } printf("m=%d\n",m); } 程序运行后的输出结果是 A)m=6 B)m=2 C)m=4 D)m=5 解析: 选A。 在循环嵌套语句中,外层循环执行2次,内层循环正常执行3次。 m*=(i*j)m=m*(i*j) 外层循环: 第一次循环,i=1,i*j>3始终不成立。 i=1j=3m=l*(1*3)=3 i=lj: 2m=3*(1*2)=6 i=lj=lm=6*(1*1)=6 外层循环: 第二次循环,i=2;i=2j=3此时i*j>3条件成立,执行break退出内层循环,外层循环是最后一次循环,同时退出,接着输出m的值为6。 (21)有以下程序 #include(stdio.h> main() {inta=l;b=2; for(;a<8;a++){b+=a;a+=2;} printf("%d,%d\n",a,b); } 程序运行后的输出结果是 A)9,18 B)8,11 C)7,11 D)10,14 解析: 选D。 考点为FOR语句的执行流程。 当a<8时执行循环体,执行完循环体后,接着执行a++,再判断循环条件a<8是否成立。 经过三次循环后a<8不成立了,输出a=10b=14。 (22)有以下程序,其中k的初值为八进制数 #include main() {intk=011; printf("%d\n",k++); } 程序运行后的输出结果是 A)12 B)11 C)10 D)9 解析: 选D。 C语言中,整型常量以0开头,表示是一个八进制数。 (11)8=1*8+1*1=(9)10。 K++表示先输出K的值,再加1。 %d表示以十进制格式输出整数,所以选项D正确。 (23)下列语句组中,正确的是 A)char*s;s="Olympic"; B)chars[7];s="Olympic"; C)char*s;s={"Olympic"}; D)chars[7];s={"Olympic"}; A: C;<> ((A A: E): ((B B: C);<> ((B B: C;<> 解析: 选A。 字符型指针变量可以用选项A的赋值方法: char*s;s=“Olympic",选项C的写法: char*s,s={“Olympic”};是错误的。 字符数组可以在定义的时候初始化: chars[]={“Olympic"};或者chars[]=“Olympic",都是正确的。 但是不可以在定义字符数组后,对数组名赋值。 (数组名是常量,代表数组首地址)所以选项B和选项D都是错误的。 对于本例,选项B、D中字符数组s的大小至少为a,才能存放下字符串。 (字符串的末尾都有结束标志“\0”) (24)以下关于return语句的叙述中正确的是 A)一个自定义函数中必须有一条return语句 B)一个自定义函数中可以根据不同情况设置多条return语句 C)定义成void类型的函数中可以有带返回值的return语句 D)没有return语句的自定义函数在执行结束时不能返回到调用处 解析: 选B。 自定义函数中可以没有return语句,如一些不需要返回值的函数。 自定义函数中可以有多条return语句。 例如在分支结构中,可以从不同的分支中返回到调用程序。 定义成void类型的函数,不允许从该函数取得返回值,也不允许使用return语句。 授有return语句的函数在执行到函数的最后一条语句后会自动返回到调用处。 (25)下列选项中,能正确定义数组的语句是 A)intnum[0..2008]; B)intnum[]; C)intN=2008; intnum[N]; D)#defineN2008 intnum[N]; 解析: 选D。 C语言中不允许定义动态数组,定义数组的大小必须为常量表达式。 选项D中的N为符号常量,可以用来定义数组大小。 选项A、B为不正确的用法。 选项C中的N为变量,不能用来定义数组大小。 (26)有以下程序 #include voidfun(char*c,intd) {*c=*c+1;d=d+1; printf("%c,%c,",*c,d); main() {charb='a',a='A'; fun(&b,a);printf("%e,%e\n",b,a); } 程序运行后的输出结果是 A)b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B 解析: 选A。 C语言中函数参数的传递是值传递,是把实参的值传给形参,是单向传递,形参的改变不会影响到实参的值。 (27)若有定义int(*Pt)[3];,则下列说法正确的是 A)定义了基类型为int的三个指针变量 B)定义了基类型为int的具有三个元素的指针数组pt C)定义了一个名为*pt、具有三个元素的整型数组 D)定义了一个名为pt的指针变量,它可以指向每行有三个整数元素的二维数组 解析: 选D。 int(*pt)[3]定义名为pt的指针变量,用来指向包含有3个整型元素的一维数组。 也就是说指针变量pt的类型为行指针。 如果有一个二维数组a[4][3],a是二维数组名,存放二维数组的首地址。 二维数组名a的基类型为指向3个元素的一维数组的行指针。 所以可以进行赋值: pt=a;(二者基类型一致)即指针变量pt可以指向这个二维数组。 (28)设有定义doublea[10],*s=a;,以下能够代表数组元素a[3]的是 A)(*s)[3] B)*(s+3) C)*s[3] D)*s+3 解析: 选B。 根据指针S的定义,选项A的写法是错误的,(*s)后不能带下标。 选项B的写法是指向一维数组的指针的标准用法,表示数组元桑a[3]。 选项c的写法是也是错误的,*s[3]相当于*(s[3]),而s[3]是一个数组元素不是指针。 选项D的写法表示把数组的第一个元素(即a[0])加3,不能代表a[3]。 (29)有以下程序 #include(stdio.h) main() {inta[5]={1,2,3,4,5},b[5]={O,2,1,3,0},i,s=0; for(i=0;i<5;i++)s=s+a[b[i]]); printf("%d\n",s); } 程序运行后的输出结果是 A)6 B)10 C)11 D)15 解析: 选C。 在程序的5次循环中,分别把b数组中的5个元素作为a数组的下标,累加到s中。 s=a[O]+a[2]+a[l]+a[3]+a[0]=1+3+2+4+1=11 (30)有以下程序 #include main() {intb[3][3]={O,1,2,0,1,2,O,1,2},i,j,t=1; for(i=0;i<3;i++) for(j=i;j<=i;j++)t+=b[i][b[j][i]]; printf("%d\n",t); } 程序运行后的输出结果是 A)1 B)3 C)4 D)9 解析: 选C。 外层循环执行3次,内层循环执行1次(仅j=i时) i=0t=t+b[0][b[0][0]]=t+b[0][0]=1+0=1 i=lt=t+b[1][b[1][1]]=t+b[1][1]=1+1=2 i=2t=t+b[2][b[2][2]]=t+b[2][2]=2+2=4 (31)若有以下定义和语句 chars1[10]="abcd! ",*s2="\n123\\"; printf("%d%d\n",strlen(s1),strlen(s2)); 则输出结果是 A)55 B)105 C)107 D)58 解析: 选A。 strlen函数返回字符串的长度。 strlen函数求字符串的长度时,遇到结束标志'\0'为止,但长度不包括结束标志。 字符数组sl的后5个没有赋值,都为‘\0’,所以strlen(sl)的值为5。 字符指针s2所指向的字符串中,\n为转义字符换行符,表示1个字符。 \\也为转义字符,代表‘\’,表示1个字符,其后为字符串结束标志‘\0'。 所以strlen(s2)的值也为5。 (32)有以下程序 #include #defineN8 voidfun(int*x,inti) {*x=*(x+i);} main() {inta[N]={1,2,3,4,5,6,7,8},i; fun(a,2); for(i=0;i {printf("%d",a[i]);} printf("\n"); } 程序运行后的输出结果是 A)1313 B)2234 C)3234 D)1234 解析: 选C。 数组名代表热组首地址,即a[0]的地址。 函数调用: fun(a,2)参数传递后,形参指针x获得数组首地址,即指向a[0]形参变量i=2。 *x=*(x+2)*x即a[0].*(x+2)即a[2]。 执行上式后,a[O]变为3.a[2]不变。 返回到主程序: 循环4次,输出a热组前4个元素,3234 (33)有以下程序 #include intf(intt[],intn); main {inta[4]={1,2,3,4},s; s=f(a,4);printf("%d\n",s); } intf(intt[],intn) {if(n>0)returnt[n-1]+f(t,n-1); elsereturn0; } 程序运行后的输出结果是 A)4 B)1O C)14 D)6 解析: 选B。 考点为递归函数的使用 (34)有以下程序 #include intfun() {staticintx=1; x*2;returnx; } main() {inti,s=1, for(i=1;i<=2;i++)s=fun(); printf("%d\n",s); } 程序运行后的输出结果是 A)O B)1 C)4 D)8 解析: 选C。 考点为静态局部变量的使用。 fun函数中的x为静态局部变量,占用固定的内存单元,下一次调用时仍可保留上次调用时的值。 也就是说,如果多次调用fun函数,x的定义只在第一次调用时有效,从第二次调用开始,x的定义相当于不存在,直接使用x的值。 主程序中调用两次fun函数: 第一次调用: x=lx=x*2=2s=2 第二次调用: x=x*2=4s=4 (35)有以下程序 #include #defineSUB(a)(a)-(a) main() {inta=2,b=3,c=5,d; d=SUB(a+b)*c; printf("%d\n",d); } 程序运行后的输出结果是 A)0 B)-12 C)-20 D)10 解析: 选C。 考点为带参数的宏定义。 宏定义中的参数没有类型,仅为字符序列,不能当作表达式运算。 宏展开时,把实参字符串原样写在替换文本中。 d=SUB(a+b)*c=(a+b)-(a+b)*c=5-25=-20 (36)设有定义: structcomplex {intreal,unreal;}data1={1,8},data2; 则以下赋值语句中错误的是 A)data2=data1; B)data2=(2,6); C)data2.real=data1.real; D)data2.real=data1.unreal; 解析: 选B。 考点为结构体变量的定义和初始化。 题目中定义了一个结构体类型,由两个int类型的成员real、unreal组成。 定义结构体类型的同时,定义两个结构体变量datal和data2,其中datal赋了初值。 结构体变量之间可以整体赋值,选项A正确。 结构体变量的初始化只能在定义时进行,如datal形式,且必须使用{},选项B错误。 结构体变量中的成员的地位和普通变量一样,在赋值兼容的情况下可以相互赋值,选项C和选项D正确。 (37)有以下程序 #include #include structA {inta;charb[10];doublec;}; voidf(structAt); main() {structAa={1001,"ZhangDa",1098.0}; f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c); } voidf(structAt) {t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;} 程序运行后的输出结果是 A)1001,zhangDa,1098.0 B)1002,changRong,1202.0 C)1001,ehangRong,1098.O D)1002,ZhangDa,1202.0 解析: 选A。 考点为结构体变量作为函数参数。 C语言中函数参数的传递是值传递,把实参的值传给形参后,形参的改变不会影响到实参的值。 结构体变量作为函数参数时,和普通变量用法一样。 程序调用函数f时,实参a传给形参t,函数内部对t的各成员重新赋值,但对形参t的改变不会影响到实参a,所以返回到主程序输出a的各成员的值时,值保持不变。 (38)有以下定义和语句 structworkers {intnum;charname[20];charc; struct {intday;intmonth;intyear;}s; }; structworkersw,*pw; pw=&w; 能给w中year成员赋1980的语句是 A)*pw.year=198O; B)w.year=1980; C)pw->year=1980; D)w.s.year=1980; 解析: 选D。 考点为结构体类型的嵌套定义.在结构体类型中定义另一个结构体类型后,引用内嵌结构体类型的成员时,必须逐级引用成员名进行定位,不能直接使用内嵌结构体类型中的成员.只有选项D正确。 (39)有以下程序 #include main() {inta=2,b=2,c=2; printf("%d\n",a/b&c); } 程序运行后的输出结果是 A)O B)1 C)2 D)3 解析: 选A。 考点为除法运算符”/”和按位与运算符”&”的使用。 其中除法运算符”/”的优先级高。 a/h&e=2/2&2=1&2=0 (40)有以下程序 #include main() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机等级考试 二级 笔试 试题 答案 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)