全国计算机等考二级C语言程序设计第4章无纸化考试题库答案与解析文档格式.docx
《全国计算机等考二级C语言程序设计第4章无纸化考试题库答案与解析文档格式.docx》由会员分享,可在线阅读,更多相关《全国计算机等考二级C语言程序设计第4章无纸化考试题库答案与解析文档格式.docx(130页珍藏版)》请在冰豆网上搜索。
9.B。
【解析】C语言中用户标识符不能与C编译系统已经预定义的、具有特殊用途的保留标识符(即关键字)同名。
选项A,define,void为关键字;
选项C,for,case为关键字;
选项D,D0为关键字。
10.D。
【解析】因为在逻辑表达式中,两边的赋值表达式都成立,即值为1,故选择D选项。
11.C。
【解析】选项A是先将a的值赋给变量b,再将变量b的值赋给变量C,不合题意;
B选项中由于c的值不为0,在将c的值赋给变量a后,表达式a=c的值为1,不再对表达式b=c计算;
对于C选项,表达式a=c的值为1,再求表达式b=C的值为1,然后进行逻辑与运算;
D选项将b的值赋给c后再赋给a,故选择C选项。
12.D。
【解析】本题可以写成:
a+a+(a-(a*a)),因为*的优先级最高,其次是-=的,+的优先级最低,所以先求a-=a*a=9,表达式变为a+a+-=9,即a=a-9=-6,再次变为a+(-6)=-12,故选择D选项。
13.B。
【解析】数组下标从0开始,A选项中所赋值的个数超过了数组的长度;
C选项中定义a为字符型变量,而不是数组,赋值错误;
D选项中,整型数组不能赋字符串。
14.A。
【解析】本题主要考查按位求反运算和C语言正负数的表示。
“0”代表正数,“1”代表负数;
x=7的二进制为00111,第一个0代表正数,~x为ll000,第一个1代表负数,值为8。
15.B。
【解析】在while(E)中,表达式E可以是C语言中任意合法的条件表达式,但不能为空,由它来控制循环体是否执行。
在选项B中表达式E>
0||E<
0是一个逻辑表达式。
16.C。
【解析】在m数组中赋值的是字符串,其长度为7,末尾有结束符ˊ\0ˊ,故字节数为8,而n数组中赋的是字符,其长度为7,故C选项正确。
17.B。
【解析】本题考查if…else语句。
if条件为真则执行后面的表达武,如果if为假则执行else语句。
18.D。
【解析】{intk=-3;
if(k<
=0)printf(″****\n″)elsewind(″&&&&\n″);
)中printf(″****\n″)缺少分号,因此会报编译错误。
19.C。
【解析】当执行fun函数时,因为参数传递时是地址传递,因此形参值的改变会影响实参中的数,在执行fun函数时先输出12,接着把*x赋3,*y赋4,此时带回主函数中,输出的值为34。
20.D。
【解析】因为字符数组s[];
中的数组名S表示的是一个地址常量。
所以语句“s+=2;
”不能将指针在当前位置的基础上再向后移动两位,因而程序编译时出错。
21.B。
【解析】水平制表符中,'
\t'
表示的是横向跳若干格;
选项B中,ˊ\039ˊ错误,ˊ\039ˊ是八进制形式表的字符,最大数为7,但其中出现ˊ9ˊ,ˊ,ˊ是字符逗号;
选项D中,ˊ\nˊ表示的是换行。
22.B。
【解析】第一个for循环的作用是让P指向每行的首地址,第二个for循环的作用是把它指向的字符串输出,故选择B选项。
23.D。
【解析】当k=1时,循环成立,输出w[1]的数组即EFGH,接着执行k++后k为2;
当k=2时,循环成立,输出w[2]的数组即IJKL,接着执行k++后,k为3;
当k=3时,循环不成立,退出。
24.C。
【解析】因为a=2,b=-1,f(a<
b)中a%b为假,便不执行下面的if..else,直接运行printf(″%d\n″,c);
输出结果是2。
因此正确选项为C。
25.B。
【解析】在定义*p=&r时,是表示r的地址赋给了P所指的存储单元,因此选项B正确。
26.B。
【解析】
(x&1)&&(z<
ˊ2ˊ)=(0.5&1)&&(ˊaˊ<
ˊzˊ)=1&&1=1,故选择B选项。
27.D。
【解析】要想使程序输出25,则j-40=25,j=65,而j初值是50,所以填入for循环的语句,使引用的数组元素累加65-50=15即可。
D选项中,i下标从0开始,i=2指向第3个数50+a[2]=50+10=60,继续循环60+a[3]=60+5=65,此时i4跳出,循环结束。
28.B。
【解析】二维数组的元素可以看成是按矩阵形式存放的,数组第一维的下标是i,说明它前面还有i行,有i*m个元素,数组第二维的下标是j,说明它静面还有j列,有j
个元素,所以共有i*m+j个元素。
29.B。
【解析】首先分两块,逗号前面的是第一块,先执行,逗号后面的是第二块,后执行;
两个块中,括号里的先执行,a-=a-5;
//执行前’a=0,执行后,a-=-5,a=5;
c=a;
//c=5;
a=b;
//a=b=0;
b+3;
//执行,但是不修改任何数字。
所以,最后结果是:
0,0,5。
B选项符合结果。
30.A。
【解析】本题主要考查结构体数组的使用。
x[i].num为结构体xl-i]中的hum成员,x[i].num[2]是结构体x[i]中name成员的第3个元素。
程序执行循环过程时:
第1次循环,i=1,输出x[i].num,x[1].name[2]的值;
第2次循环,i=2,输出x[2].num,x[2].name[2]的值,即3N;
第3次循环,i=3,输出x[3].num,x[3].name[2]的值,即4A;
第4次循环,i=4,输出x[4].num,x[4].name[2]的值,即5U。
31.A。
【解析】p=a,相当于重新把a中的内容赋给a本身,所以a[2]=6。
32.A。
【解析】函数fun的作用是将指针a指向指针b的内容,然后将该内容加1。
执行语句“fun(p1,p2);
”后,pl和p2指向的地址并未改变,只是将p2指向的存储单元的值增加1。
所以,答案是A。
33.A。
【解析】函数intfun(intn)的功能是求1+2+…+n的值并返回。
所以执行程序时,给变量x输入10后,执行语句“x=fun(x);
”,x的值将变为1到10中10个整数的累加和,即55。
34.D。
【解析】因为首先k-2,然后你进行一次循环后,k自增两次,变成4,所以这时候s又成l了。
然后当k-4的时候,s=1,j=4,然后执行内层循环,s=1+4,然后j自增等于5,s=5+5,然后j再自增为6,跳出内层循环。
k自增两次后等于6,不成立,跳出外层循环。
然后输出s的值,即为10。
因此正确选项为D。
35.B。
【解析】本题考查switch,case语句,当k-0时,循环体成立,执行switch后表达式的值为ˊ1ˊ,执行caseˊ1ˊ,i的值为0,因为没有break语句,继续执行其后的语句,到最后一个语句时i的值为3,此时v[i]++,v[3]=1,接着执行k++后,k的值为1,当k=1时,循环成立。
执行switch后的表达式的值为ˊ2ˊ,执行caseˊ2ˊ,i的值为1,因为没有break语句,继续执行其后的语句,到最后一个语句时,i的值为3,此时v[i]++,v[3]=2,接着执行k++后,k的值为2,依次下去,caseˊ4ˊ也会执行,最后i的值一定为3,到v[3]=8时循环结束,而v[o]~v[2]的值一直没有变化,故选择B选项。
36.C。
【解析】x的值为十进制数102,而y的值为八进制数012,根据题意将y用十进制表示为10%md,in为指定输出数据的宽度,若位数小于m则左端补以空格,若位数大于in则按实际输出,所以答案是C。
37.B。
【解析】while语句执行如下:
当z=3,x=0时,表达式z-->
0&&++x<
5为真,z的值变为2,x的值变为1,执行语句“y=y-1;
”,y的值变为4;
当z=2,x=l时,表达式z-->
0&&++x<
5为真,z的值变为1,x的值变为2,执行语句“y=y-1;
”y的值变为3;
当z=1,x=2时,表达式z-->
5为真,z的值变为0。
x的值变为3,执行语句“y=y-1;
”,y的值变为2;
当z=0,x=3时,表达式z-->
0为假,表达式(z-->
5)为假,z的值为-1,不进行++x<
5的判断,不执行语句y=y-1;
;
所以x的值为3,y的值为2,z的值为-1。
答案为B。
38.C。
【解析】y的初始值为~1,当x不等于0时,给y赋值为1,也就是这时x>
0和x>
0都为1,然后如果x>
0时y的值又赋值为1,注意后面的else语句是跟if(x>
0)y=1相匹配,就是说除了x>
0y=1之外,其他的情况y都为0。
39.B。
【解析】通过观察可知图形共4行,主函数中通过一个for循环四次,输出4行。
第一行输出3个空格和1个“*”,第2行输出2个空格和3个“*”,第3行输出3个空格和5个“*”,第四行输出7个“*”,主函数中通过第二个循环控制每行的输出空格数,第三个for循环控制输出的“*”的个数,总结规律:
每行输出的“*”的个数,总比前一行的多2个,且第一行的个数为1,可以断定每行输出的“*”的个数组成了一个公差为2的等差数列,所以每行输出“*”的个数即该等差数列的通项,故该空格处应该填写2*i-1。
40.A。
【解析】位置指针当前值函数ftell()的基本调用格式为ftell(fp)。
ftell函数的功能:
得到fp所指向文件的当前读写位置,即位置指针的当前值,如果函数的返回值为-1L,表示出错。
第2套选择题答案与解析
1.D。
【解析】算法的空间复杂度是指执行这个算法所需的存储空fq。
算法所占用的存储空间包括算法程序所占用的空fq、输入的初始数据所占用的存储空间、算法执行过程中所需要的额外空间。
2.C。
【解析】结构化程序设计的原则和方法之一是限制使用GOTO语句,但不是绝对不允许使用。
其他三项为结构化程序设计的原则。
3.A。
【解析】%既然求余数,运算对象必须是整数。
【解析】数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式。
一种数据结构可以根据需要采用不同的存储结构,存储结构有顺序和链式两种。
不同的存储结构,其处理的效率不同。
5.D。
【解析】所谓的后序遍历是指,首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左、右树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
因此,后序遍历二叉树的过程也是一个递归过程。
6.C。
【解析】面向对象的设计方法的基本原理是使用现实世界的概念抽象地思考问题从而自然地解决问题。
它虽强调模拟现实世界中的概念但不强调算法,但是它鼓励开发者在软件开发的过程中从应用领域的概念角度去思考。
7.D。
【解析】文件系统所管理的数据文件基本上是分散、相互独立的。
相对于数据库系统,以此为基础的数据处理存在3个缺点:
数据冗余大、数据的不一致性、程序与数据的依赖性强。
8.D。
【解析】选项A,可以用for循环代替;
选项B,不满足条件时即条件的逻辑值为假(0)时退出,break也可以;
选项C,while(条件),条件为真时进行循环,为假(0)时退出。
9.A。
【解析】软件危机的表现包括:
①对软件开发的进度和费用估计不准确;
②用户对已完成的软件系统不满意的现象时常发生;
③软件产品的质量往往靠不住;
④软件常常是不可维护的;
⑤软件通常没有适当的文档;
⑥软件成本在计算机系统总成本中所占的比例逐年上升;
⑦软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势。
10.C。
【解析】对象的封装性是指从外面看只能看到对象的外部特性,而对象的内部,其处理能力的实行和内部状态对外本来就是不可见的、隐蔽的。
【解析】数据库系统由如下5个部分组成:
数据库(DB)、数据库管理系统(DBMS)、数据库管理员(人员)、系统平台之一——硬件平台(硬件)、系统平台之二一一软件平台(软件)。
其中DB(DataBase)即数据库,是统一管理的相关数据的集合;
DBMS即数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,为用户或应用完程序提供访问DB的方法。
由以上可知,选项C为正确答案。
12.A。
【解析】标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或者下划线。
B选项int不是表达变量类型的标识符,它不能再用作变量名和函数名。
C选项do是C语言的一个关键字。
D选项标识符不符合只能以字母或下划线开始的要求。
13.D。
【解析】||和&&的优先级高于+和-,||和&&的优先级相等,且是左结合的,就是从左边开始结合到右边。
按照这个规则,正确选项为D。
14.C。
【解析】本题考查printf函数的格式。
第1个printf函数,格式说明的个数是2,而输出项的个数是3,所以对于多余的输出项k不予输出;
第2个printf函数,有2个%说明,第1个%后面的字符要原样输出。
“%x”和“%o”分别表示以十六进制和八进制无符合型输出整型数据(不带前导0x或0)
15.A。
【解析】通过地址来引用数组元素的方法有下列5种:
①a[i][j];
②*(a[i]+j);
③*(*(a+i)+j);
④*(a[i][j]);
⑤(&a[0][0]4-3*i+j)。
故A正确。
16.D。
【解析】在x=2,y=x4-3/2中,3/2=1,24-1=3,因此表达式的值为3,因为x、y为double型变量,故选择D选项。
17.C。
【解析】选项A、B的空间不够;
选项D中字符串存储要有结束符ˊ\0ˊ,且要占用一个空间,printf用来输出字符,不能输入字符串。
【解析】本题考查自增运算符“++”、逻辑与运算符“&&”和逻辑或运算符“||”。
自增运算符“++”出现在变量之前,表示先使变量的值加1,再使用变量的值进行运算;
出现在变量之后,表示先使用变量的值进行运算,再使用变量的值加1。
当逻辑与运算符“&&”两边的运算对象都为真时,逻辑表达式的值才为真;
当逻辑或运算符“||”只要一个值为1,值就为1。
根据运算符的优先级,题中应先计算内层括号中的值。
++j是先自加后运算,因此运算时j的值等于3,所以表达式++j=3成立,即表达式的值为1:
1与任何数都为进行或(1I)运算,结果都为1,因此k=3的表达式i++是先运算后自加,因此运算时i为1,所以j++=1成立,自加1后i=2。
if语句的条件为真即“1”,所以输出i、j、k的值分别是2,3,3。
19.B。
【解析】scanf('
'
%d,%d'
,&a,&b);
//a=3,b=4s=a;
//s=3if(s=b)//此处先将b(b=4赋给s,则s=4s=b返回值为4s*=s:
//s=s*s=16因此输出结果为16。
正确答案为B。
20.C。
【解析】只有当3个if条件同时成立,即能够同时被2、3、7整除时,才输出i的值,而从0到50能够同时被2、3、7整除的数只有42,故选择c选项。
21.C。
【解析】即输出x[0][2]x[l][1]x[2][0]分别为357。
22.A。
【解析】在程序语句中,k的初始值为5,进行第1次while循环后,k自减1为4,非0,执行循环体里的printf语句,输出k,此时k的值变为1。
程序执行第2次循环时,k自减1变为0,为假,退出while循环语句。
所以程序的最后结果为1。
23.C。
【解析】函数fun(intx,inty)的功能是返回x+y的值。
在主函数中,变量a、b、c的初始值分别为1、2、3。
因此,逗号表达式“a++,b++,a+b”的值等于5,表达式c++的值为3,调用于函数的表达式为“fun(5,3);
”,其返回值等于8。
24.A。
【解析】当x为1时,执行case1,a自加等于l,因为casel后没有break,接着执行CaSe2,此时a的值为2,b自加为1,故选择A选项。
【解析】SSEEK_SET代表文件的开始,SEEK_END代表文件末尾,SEEK_CUR代表文件当前位置。
【解析】在第1次外层for循环中,首先x++得到x=1。
进入到内层for循环,只有循环j的值为奇数时,变量x的值才自加1,所以在内层for循环执行过程中,变量x的值自加两次,当退出内层for循环时,x=3,然后执行x++,得到x=4。
在进入执行第2次外层for循环中,首先x++得到x=5。
进入到内层for循环,只有循环变量j的值为奇数时,变量X的值才自加1,所以在内层for循环执行过程中,变量x的值自加1两次,当退出内层for循环时,x=7,然后执行x++,得到x=8,所以打印输出变量X的值为8。
27.C。
28.C。
【解析】在for循环语句中自变量i从0开始,每次自加2,执行s+一*(t+i)语句,因为C语言规定数组名做表达式相当于数组的首地址,也就是第一个元素的地址。
因此,*(t+i)代表数组的第i+1个元素,所以程序运行的结果是1+3+5+7+9=25,即变量S的值等于25。
29.A。
【解析】本题在函数intfun(intn)的定义中又出现了对函数fun的调用,所以函数fun是递归函数。
因而在主函数中调用x=fun(x)时,当输入10赋给变量x时,递归调用的过程为
fun(10)=l0+fun(9)=10+9+fun(8)=10+9+8+fun(7)
=10+9++8+7+fun(6)=10+9++8+7+6+fun(5)
=10+9++8+7+6+5+fun(4)
=l0+9++8+7+6+5+4+fun(3)
=10+9++8+7+6+5+4+3+fun
(2)
=10+9++8+7+6+5+4+3+2+fun
(1)
=10+9++8+7+6+5+4+3+2+l+fun(0)
=10+9++8+7+6+5+4+3+2+1=55
30.C。
【解析】在函数intfun(intx[],intn)的定义中,变量sum为一个静态局部变量。
由于在整个程序运行期间,静态局部变量在内存中的静态存储中占据着永久的存储单元。
函数intfun(intx[],intn)的功能是求出数组x[]各个元素的和,所以在主函数中,调用函数fun(a,5)后,变量sum=1+2+3+4+5=15,当再次调用fun(b,4)后,变量sum=15+6+7+8+9=45,所以s=15+45=60。
31.D。
【解析】执行第一次for循环时,用表达式p[i][j]!
=ˊ\0ˊ来判断字符串数组指针P是否到达字符串的结尾,如果没有到达,继续执行while中的语句。
if语句表示(P[i][j]-ˊ\0ˊ)除2的余数不为0时,即字符串所有奇数执行后面的语句。
所以退出第1次for的循环体时,输出为397,执行第2次循环体。
对字符串“2584”进行处理,输出结果为5,因而最后输出结果为3975。
32.B。
【解析】从题目中可知,ˊ\Oˊ、ˊ\tˊ、'
ˊ\\ˊ分别为一个字符,而sizeof是求字节个数的函数,其中包括ˊ\0ˊ占的字节,strlen函数是求数组长度的函数,其以ˊ\0ˊ结束,因此strlen的值为5,sizeof的值为20。
33.C。
【解析】数组的下标是从0开始的,选项A中越界,行下标和列下标都不能越界;
选项B中,虽然是个地址,但是也同样越界了;
选项C中表示的是第一个的首地址;
选项D表示的是其元素的值,并不是地址。
【解析】由题目中线性链表的定义可知,要将q和r所指的结点交换前后位置,只要使q指向r的后一个结点,P指向r结点,r指向q结点即可。
而在选项D中,r->
next=q,这时r指向的节点为q;
p->
next=r,这时P指向的节点为r;
q->
next=r->
next,因为r结点已经指向q,所以执行这个语句后q又指向q,所以选项D不正确。
35.D。
36.B。
【解析】指针中存放的是变量的地址,指针也可以进行增减运算,这时指针移动的最小单位是一个存储单元,而不是一个字节。
所以题中“P+6”指的是将指针向后移动了6个存储单元,即指向uE63,存放的是b[6]的地址。
37.D。
【解析】由n!
的数字定义可知n!
=n*(n-1)*(n2)*…*1。
在选项A中,由于f的初值为0,在for循环语句中,f依次乘以1,2,3,…,n,最后计算得到f=n!
=0,所以选项A不正确。
在选项B中,f的初值为1,在for循环语句中,f依次乘以1,2,3,…,(n-1),最后计算得到f=(n-1)!
,所以选项B不正确。
在选项C中,f的初值为l,在for循环语句中,f依次乘以n,n+1,n+2,…,所以选项C不正确。
在选项D中,f的初值为1,在for循环语句中,f依次乘以n,n-1,n-2,…,2,最后计算得到f=n!
,所以选项D正确。
38.A。
【解析】strcpy实现的功能是复制,该操作把are复制到a中,a[o][3]=ˊ&ˊ,且strcpy(a[1],″you″)把you复制到a[1]中,故输出a为“are&you”。
39.A。
【解析】本题主要考查按位与运算,x=011050的二进制形式为00010010000101000,01252的二进制形式为0000001010101010,两者相与得0000001000101000。
40.D。
(x*1000+0.5)--x移动3位小数,加0.5,也就是小数第4位加5,若这位大于等于5,则进1到个位。
5.16894*1000-)5168.94+0.5->
5169.44接下来:
(int)(x*1000+0.5)取整变5169,5169/(double)1000)-)5.169。
所以printf(″%f\n″,5.169)结果是5.16900。
因此正确答案为D。
第3套选择题答案与解析
【解析】本题考查对软件生命周期的理解,软件生命周期整体上可分为定义阶段、开发阶段和维护阶段。
其中定义阶段包括可行性研究与计划制订和需求分析;
开发阶段包括概要设计、详细设计、开发和测试;
维护阶段是一个单独阶段,不包含在开发阶段内,它是所花费用最多的一个阶段。
【解析】视图设计的设计次序分3种:
自顶向下、自底向上和由内向外。
它们为视图设计提供了具体的操作方法,设计者可根据实际情况灵活掌握。
3.C。
【解析】根据二叉树的性质及定义,一棵深度为k且有2k-1个结点的二叉树为满二叉树。
满二叉树的叶子结点为