真题和详细解析.docx
《真题和详细解析.docx》由会员分享,可在线阅读,更多相关《真题和详细解析.docx(28页珍藏版)》请在冰豆网上搜索。
真题和详细解析
绝密★启用前
2010年9月全国计算机等级考试二级笔试试卷
C语言程序设计及参考答案
一、选择题(每小题2分,共70分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。
请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是
A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的
B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构
D)上述三种说法都不对
答案:
选B【解析】线性表的顺序存储结构:
每个结点只需要存放表中的数据元素;线性表的链式存储结构:
每个结点除了存放表中的数据元素外,还要存放指针域,用来指示其后继结点的存储位置信息;所以链式存储结构需要存储空间一般多余顺序存储结构。
(2)下列叙述中正确的是
A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
D)上述三种说法都不对
答案:
选C【解析】栈是一端固定、一端活动的顺序存储结构,其中固定的一端为栈底,活动的一端为栈顶。
当有新元素进栈时,栈顶指针向上移动;当有元素出栈时,栈顶指针向下移动。
在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化,所以选C。
(3)软件测试的目的是
A)评估软件可靠性
B)发现并改正程序中的错误
C)改正程序中的错误
D)发现程序中的错误
答案:
选D【解析】软件测试的目的:
尽可能多的发现软件中的错误,以查找错误为中心。
软件调试的任务;在软件测试的基础上,诊断和改正程序中的错误。
(4)下面描述中,不属于软件危机表现的是
A)软件过程不规范
B)软件开发生产率低
C)软件质量难以控制
D)软件成本不断提高
答案:
选A【解析】软件危机包括成本、质量、生产率等问题,主要表现在:
软件需求的增长得不到满足;软件开发成本和进度无法控制;软件质量难以保证;软件维护程度底;软件成本不断提高;软件开发生产率的提高赶不上硬件的发展和应用的增长。
(5)软件生命周期是指
A)软件产品从提出、实现、使用维护到停止使用退役的过程
B)软件从需求分析、设计、实现到测试完成的过程
C)软件的开发过程
D)软件的运行维护过程
答案:
选A【解析】通常将软件产品从提出、实现、使用维护到停止使用退役的过程陈伟软件生命周期。
(6)面向对象方法中,继承是指
A)一组对象所具有的相似性质
B)一个对象具有另一个对象的性质
C)各对象之间的共同性质
D)类之间共享属性和操作的机制
答案:
选D【解析】继承是面向对象方法的主要特征。
在面向对象的软件技术中,继承是指子类自动地共享基类中定义的数据和方法的机制。
使用已有的类定义建立新类。
新类直接继承其父类的描述(数据和操作)或特性,子类自动共享父类中定义的数据和方法。
(7)层次型、网状型和关系型数据库划分原则是
A)记录长度
B)文件的大小
C)联系的复杂程度
D)数据之间的联系方式
答案:
选D【解析】数据模型按照不同的应用层次分为概念数据模型、逻辑数据模型和物理数据模型。
三种模型属于逻辑数据模型,划分原则是根据数据之间的联系方式。
(8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员、与实体计算机之间的联系是
A)一对一
B)一对多
C)多对多
D)多对一
答案:
选C【解析】两个实体间的联系可分为3种:
1.一对一联系:
主表中的一条记录与相关表中的一条记录相关联;2.一对多联系:
主表中的一条记录与相关表中的多条记录相关联;3.多对多联系:
主表中的多条记录与相关表中的多条记录相关联。
本题中的实体“工作人员”和“计算机”的联系属于多对多。
(9)数据库设计中反映用户对数据要求的模式是
A)内模式
B)概念模式
C)外模式
D)设计模式
答案:
选C【解析】数据系统的三级模式:
概念模式、外模式、内模式。
内模式处于最底层,反映了数据在计算机中的实际存储形式;概念模式处于中层,反映了设计者的数据全局逻辑要求;外模式处于最外层,反映了用户对数据的要求。
(10)有三个关系R、S和T如下:
RST
A
B
C
a
1
2
b
2
1
c
3
1
A
D
c
4
A
B
C
D
c
3
1
4
则由关系R和S得到关系T的操作是
A)自然连接
B)交
C)投影
D)并
答案:
选A【解析】考点为关系模型中的常见运算。
投影:
从一个关系中选择若干列,是一元运算。
本题为二元运算,排除C。
交、并:
取相同关系模式的两个关系的交集和并集,是二元运算。
本题中R、S为不同关系模式,排除选项B、D。
自然连接:
对具有共同属性(列)的两个关系,按共同属性值相同的行连接,形成新的关系。
参与自然连接的两个关系可以是不同的关系模式,所以选A。
(11)以下关于结构化程序设计的叙述中正确的是
A)一个结构化程序必须同时由顺序、分支、循环三种结构组成
B)结构化程序使用goto语句会很便捷
C)在C语言中,程序的模块化是利用函数实现的
D)由三种基本结构构成的程序只能解决小规模的问题
答案:
选C【解析】选A错误,简单的程序可以只有顺序结构组成,不必同时包含三种结构。
选项B错误,结构化程序限制是有goto语句,尽可能使用替代语句。
选项C正确,函数是组成C语言程序的基本单位,用函数实现程序的模块化。
选项D错误,实践证明,由三种基本结构构成的程序可以解决任何复杂的问题。
(12)以下关于简单程序设计的步骤和顺序的说法中正确的是
A)确定算法后,整理并写出文档,最后进行编码和上机调试
B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档
C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档
D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构
答案:
选B【解析】简单程序设计的步骤:
(1)确定数据结构
(2)确定算法(3)编码(4)在计算机上调试程序(5)整理并写出文档
(13)以下叙述中错误的是
A)C程序在运行过程中所有计算都以二进制方式进行
B)C程序在运行过程中所有计算都以十进制方式进行
C)所有C程序都需要编译链接无误后才能运行
D)C程序中整型变量只能存放整数,实型变量只能存放浮点数
答案:
选B【解析】计算机内部各种数据的处理都以二进制方式进行,所以A正确,B错误。
选项C正确:
编译和链接过程不能有任何错误,才能生成exe文件运行。
选项D正确:
整型变量只能存放整数,用字符型赋值,最后存放的也是整数(ASCII码值)。
实型变量只能存放浮点数,用整数赋值,最后也要转换为浮点型(如1.0)。
(14)有以下定义:
inta;longb;doublex,y;则以下选项中正确的表达式是
A)a%(int)(x-y)
B)a=x!
=y;
C)(a*y)%b
D)y=x+y=x
答案:
选A【解析】%运算符要求两边的操作数必须为整数。
选项A正确:
a及(int)(x-y)均为整数。
选项C错误:
(a*y)为double类型。
(int与double运算,结果为double)。
选项B错误:
该选项为语句,不是表达式。
去掉分号后是正确的表达式a=(x!
=y)。
选项D错误:
赋值运算符的结合性是从右到左,相当于y=(x+y=x),而x+y=x是不正确的,赋值号的左值不能为常量或表达式。
(15)以下选项中能表示合法常量的是
A)整数:
1,200
B)实数:
1.5E2.0
C)字符斜杠:
‘\’
D)字符串:
"\007"
答案:
选D【解析】选项A错误:
在C语言中,整数没有千位分隔符的表示形式。
选项B错误:
用指数表示实数时,E后面的指数必须为整数。
选项C错误:
在C语言中,要表示字符斜杠,需使用转义字符:
‘\\’。
选项D正确;\007为转义字符,\后带有1~3为数字,为八进制数字,该字符为特殊字符响铃(beep),选项D中的字符串中只包含beep这个字符。
注:
main(){chars[10]=”\007”;charch=’\007’;prinf(“%s\n”,s);prinf(“%c\n”,ch);运行结果:
两次响铃
(16)表达式a+=a-=a=9的值是
A)9B)_9C)18D)0
答案:
选D【解析】“+=-==”均为赋值运算符,结合性为从右到左。
表达式相当于:
a+=a-=(a=9),执行a=9后,接着执行a-=a,结果为a=0;最后执行a+=a,结果a=0,整个赋值表达式的值也为0.
(17)若变量已正确定义,在if(W)printf(“%d\n,k”);中,以下不可替代W的是
A)a<>b+cB)ch=getchar()C)a==b+cD)a++
答案:
选A【解析】C语言中的不等于运算符为:
!
=,没有<>的写法,所以选项A错误。
If(W)中的W一半为关系表达式或者逻辑表达式,也可以为任何合法表达式。
运算原则:
表达式为非0值表示逻辑真,0表示逻辑假。
例:
if(a++)只要a不为0,表达式就为真;if(ch=getchar())zhiyaoshuruzifudeASCII码值不为0,表达式就为真。
(18)有以下程序
#include
main()
{inta=1,b=0;
if(!
a)b++;
elseif(a==0)if(a)b+=2;
elseb+=3;
printf(”%d\n”,b);
}
程序运行后的输出结果是
A)0B)1C)2D)3
答案:
选A【解析】else配对原则:
与它上面最近的未配对的if语句配对。
程序中的等价语句为:
if(!
a)b++;elseif(a==0){if(a)b+=2;elseb+=3;}两个条件均不满足,没有执行任何肤质语句,b保持原来的值不变(b=0)。
(19)若有定义语句inta,b;doublex;则下列选项中没有错误的是
A)switch(x%2)B)switch((int)x/2.0
{case0:
a++;break;{case0:
a++;break;
case1:
b++;break;case1:
b++;break;
default:
a++;b++;default:
a++;b++;
}}
C)switch((int)x%2)D)switch((int)(x)%2)
{case0:
a++;break;{case0.0:
a++;break;
case1:
b++;break;case1.0:
b++;break;
default:
a++;b++;default:
a++;b++;
}}
答案:
选C【解析】主要观察switch后的表达式和case后的常量。
Switch后的表达式应该为整形表达式或字符表达式,case后的常量类型和switch一致。
选项A错误:
%要求两边的操作数必须为整数,x%2中的x为double类型。
选项B错误:
switch后的表达式不为整型,不应该进行处罚运算,应进行求余运算。
选项D错误:
case后面的表达式与switch不一致。
选项C正确。
(20)有以下程序
#include
main()
{inta=1,b=2;
while(a<6){b+=a;a+=2;b%二10;}
printf(”%d,%d\n”,a,b);
}
程序运行后的输出结果是
A)5,11B)7,1C)7,11D)6,1
答案:
选B【解析】考点为while循环语句,循环条件为a<6.程序的执行流程为:
(初始值:
a=1b=2)第一次循环(a=1):
b=1+2=3a=1+2=3b=3%10=3;第二次循环(a=3):
b=3+3=6a=3+2=5b=6%10=6;第三次循环(a=5):
b=6+5=11a=5+2=7b=11%10=1;此时a<6不成立,退出循环,a=7,b=1。
(21)有以下程序
#include<stdio.h>
main()
{inty=10;
while(y--);
printf(”Y=%d\n”,Y);
}
程序执行后的输出结果是
A)y=0B)y=-1C)y=1D)while构成无限循环
答案:
选B【解析】考点为while语句及“—”运算符。
注意:
while(y--);的循环体空语句。
y—是先使用y的值,在减1.循环条件为:
只要“y—”为非0值,就始终循环(执行空语句)。
Y的值不断减1,循环条件不成立时,y—的值为0(即y的值为0),终止循环。
终止循环后,y的值还要减1,最后输出y的值为-1.
(22)有以下程序
#include<stdio.h>
main()
{chars[」=”rstuv";
printf(”%c\n”,*s+2);
}
程序运行后的输出结果是
A)tuvB)字符t的ASCII码值C)tD)出错
答案:
选C【解析】s为字符数组名,代表数组首地址,指向数组第一个元素s[0](字符‘r’)。
*s+2表示s所指向的字符的ASCII码值加2,s指向的字符为r,加2后代表的字符为t,最后用%c格式输出,所以输出字符t。
注意:
不要把*s+2理解为*(s+2),本题巧合的是都代表字符‘t’。
(23)有以下程序
#include<stdio.h>
#include<string.h>
main()
{charx[]=”STRING”;
x[0」=0;x[1]=’\0’;x[2」=’0’;
printf(”%d%d\n”,sizeof(x),strlen(x));
}
程序运行后的输出结果是
A)61B)70C)63D)71
答案:
选B【解析】
·sizeof()运算符:
当操作数是数组名时,结果是该数组所占内存空间的总字节数。
·数组x存放字符串“STRING”,加上结束标志‘\0’,共7个字符,相当于:
charx[7]=“STRING”,每个字符占1个字节,sizeof(x)返回数组x的总字节数为7.
·strlen()函数:
计算字符串的长度时,遇到结束标志为止,且长度不包括结束标志。
数组x在定义是赋初值后,又重新赋值,x[0]=0即想x[0]=‘\0’,所以strlen(x)=0.
·关于结束标志:
‘\0’即ASCII码值为0的字符,也就是整数0。
(24)有以下程序
#include<stdio.h>
Intf(intx);
main()
{intn=1,m;
m=f(f(f(n)));printf(”%d\n”,m);
}
intf(intx)
{returnx*2;}
程序运行后的输出结果是
A)1B)2C)4D)8
答案:
选D【解析】三次调用f函数:
f(n)=f
(1)=2f
(2)=4f(4)=8m=f(f(f(n)))=f(f(f
(1)))=f(f
(2))=f(4)=8
(25)以下程序段完全正确的是
A)int*p;scanf("%d",&p);B)int*p;scanf(“%d”,p);
C)intk,*p=&k;scanf("%d",p);D)intk,*p:
;*p=&k;scanf(“%d”,p);
答案:
选C【解析】函数格式:
scanf(格式控制,地址表列)
·p为指针,本身即为地址,在scanf函数中不需要使用&p的形式,所以选项A错误。
(指针变量p的值由系统分配,不需要人工输入赋值,否则会引起无法预知的错误)
·选项B:
指针p没有赋初值,是一个不确定的值,指向不确定的内存区域,这个区域可能存放有用的指令或数据。
在这个不确定的区域输入数据,可能会发生无法预知的错误,所以选项B不完全正确。
·对于指针p,如果在定义时付出资,应使用int*p=&k;的形式如果在定义后赋值,只能使用p=&k;的形式,所以选项D错误。
·综上所述,选项C正确。
(26)有定义语句:
int*p[4];以下选项中与此语句等价的是
A)intp[4];B)int**p;C)int*(p「4」);D)int(*p)「4」;
答案:
选C【解析】对于int*p[4],[]的优先级大于*,先计算[]里的内容。
所以int*p[4]相当于:
int*(P[4]),而不是int(*p)[4]。
选项C正确:
定义了一个包含有4个元素的指针数组。
选项A错误:
定义的是普通的整型数组。
选项B错误:
定义的是指向指针的指针。
选项D错误:
定义了一个指向由4个元素组成的一维数组的指针。
(27)下列定义数组的语句中,正确的是
A)intN=10;B)#defineN10
intx[N];intx[N];
C)intx[0..10];D)intx[];
答案:
选B【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。
选项B正确:
选项中的N为符号常量,可以用来定义数组大小。
选项A错误:
选项中的N为变量,不能用来定义数组大小。
选项D错误:
定义数组时应指明数组大小。
如果不指明数组大小,需要给定初值的个数。
如:
intx[]={1,2,3};
(28)若要定义一个具有5个元素的整型数组,以下错误的定义语句是
A)inta[5]=﹛0﹜;B)intb[]={0,0,0,0,0};
C)intc[2+3];D)inti=5,d[i];
答案:
选D【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。
选项C正确:
数组大小是一个常量表达式,相当于C[5]。
选项D错误:
i为变量,不能用来定义数组大小。
数组可以在定义的时候初始化:
选项A正确:
可以只给一部分元素赋值,未赋值元素的值为0.选项B正确:
数组定义时可以不指明长度,初值个数即为数组长度。
(29)有以下程序
#include<stdio.h>
voidf(int*p);
main()
{inta[5]={1,2,3,4,5},*r=a;
f(r);printf(”%d\n”;*r);
}
voidf(int*p)
{p=p+3;printf(”%d,”,*p);}
程序运行后的输出结果是
A)1,4B)4,4C)3,1D)4,1
答案:
选D【解析】·主程序中r=a,r的值为数组a首地址(a[0]地址),r指向a[0]。
·执行函数调用f(r)时,实参指针r的值传给形参指针p,即p也指向a[0]。
在函数中,p的值加3,p指向a[3],所以输出*p时的值为4.
·然后返回到主程序,输出*r的值。
注意:
实参指针r的值传给形参指针p后,在函数内部p的改变对r是没有任何影响的。
返回到主程序后,实参指针r仍指向a[0],所以输出*r时为1.(int*r=a;相当于int*r;r=a;)
(30)有以下程序(函数fun只对下标为偶数的元素进行操作)
#include<stdio.h>
voidfun(int*a;intn)
{inti、j、k、t;
for(i=0;i<n一1;1+=2)
{k=i;‘
for(j=i;ja〔k])k=j;
t=a〔i];a〔i]=a[k];a〔k]=t;
}
}
main()
{intaa「10」={1、2、3、4、5、6、7},i;
fun(aa、7);
for(i=0,i<7;i++)printf(”%d,”,aa[i]));
printf(”\n”);
}
程序运行后的输出结果是
A)7,2,5,4,3,6,1B)1,6,3,4,5,2,7C)7,6,5,4,3,2,1D)1,7,3,5,6;2,1
答案:
选A【解析】·主程序中调用fun函数,将实参数组名aa传给形参指针a,二者指向相同的内存区域,同时n=7.
·根据题目开化寺说明及分析,函数fun的功能是对下标为偶数的元素按从大到小的顺序排序(选择法排序),奇数下标的元素不变。
·所以主程序中的输出结果为:
7,2,5,4,3,6,1,
a[0]a[2]a[4]a[6]
↓↓↓↓
1
2
3
4
5
6
7
↑
aa
(31)下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST"要求的是
A)if(strcmp(s2,s1)==0)ST;B)if(sl==s2)ST;
C)if(strcpy(sl,s2)==1)ST;D)if(sl-s2==0)ST;
答案:
选A【解析】字符串的比较只能通过strcmp函数进行,只有选项A正确。
格式:
strcmp(字符串1,字符串2)
(1)如果字符串1=字符串2,函数值为0.
(2)如果字符串1>字符串2,函数值为一正整数。
(3)如果字符串1<字符串2,函数值为一负整数。
选项B、D是比较s1、s2的等级孩子是否相同而非内容。
选项C是字符串复制而非比较。
(32)以下不能将s所指字符串正确复制到t所指存储空间的是
A)while(*t=*s){t++;s++;}B)for(i=0;t[i]=s[i];i++);
C)do{*t++=*s++;}while(*s);D)for(i=0,j=0;t[i++]=s[j++];);
答案:
选C【解析】四个选项都可以实现字符串的复制,但选项C不能将s所指字符串的结束标志(‘\0’)复制到t所指的空间中,没有正确复制所有内容,其他几个选项都可以。
选项A:
执行循环条件时将s指向的字符赋给t,在循环体内两个指针加1分别指向下一个字符,如此循环下去,最后一次将s指向的结束标志赋给t,循环结束。
选项B、D:
在for语句的表达式2(循环条件)中实现复制操作,复制完成后,下标加1指向下一个字符,如此循环,最后一次把结束标志复制完成后退出循环。
选项C:
++和*同优先级,结合方向为自右而左,*s++等价于*(s++)。
先执行结束标志前的复制操作,然后指针s加1指向结束标志,此时循环结束,没有执行复制结束标志的操作。
注意:
结束标志(‘\0’)即整数0,当循环条件表达式的值为结束标志时,即相当于逻辑假,退出循环。
(33)有以下程序(strcat函数用以连接两个字符串)
#include<stdio.h>
#include<string.h>
main()
{chara[20]=”ABCD\OEFG\0”,b[]=”IJK”;
strcat(a,b);printf(”