全国计算机等级考试二级C语言真题库之选择题09.docx
《全国计算机等级考试二级C语言真题库之选择题09.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C语言真题库之选择题09.docx(25页珍藏版)》请在冰豆网上搜索。
全国计算机等级考试二级C语言真题库之选择题09
全国计算机等级考试等级考试真题库之选择题(09)
1.下列链表中,其逻辑结构属于非线性结构的是
A)二叉链表
B)循环链表
C)双向链表
D)带链的栈
参考答案:
A
【解析】在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。
带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,是线性表。
在单链表中的结点中增加一个指针域指向它的直接前件,这样的链表,就称为双向链表(一个结点中含有两个指针),也是线性链表。
循环链表具有单链表的特征,但又不需要增加额外的存贮空间,仅对表的链接方式稍做改变,使得对表的处理更加方便灵活,属于线性链表。
二叉链表是二叉树的物理实现,是一种存储结构,不属于线性结构。
答案为A选项。
2.设循环队列的存储空间为Q(1:
35),初始状态为front=rear=35。
现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为
A)15
B)16
C)20
D)0或35
参考答案:
D
【解析】在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。
由于入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时,头尾指针均相等。
答案为D选项。
3.下列关于栈的叙述中,正确的是
A)栈底元素一定是最后入栈的元素
B)栈顶元素一定是最先入栈的元素
C)栈操作遵循先进后出的原则
D)以上说法均错误
参考答案:
C
【解析】栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。
栈的修改是按后进先出的原则进行的。
因此,栈称为先进后出表,或"后进先出"表,所以选择C。
4.在关系数据库中,用来表示实体间联系的是
A)属性
B)二维表
C)网状结构
D)树状结构
参考答案:
B
【解析】关系模型实体间的联系采用二维表来表示,简称表。
选项C为网状模型实体间的联系,选项D为层次模型实体间的联系,选项A属性刻画了实体
5.公司中有多个部门和多名职员,每个职员只能属于一个部门,一个部门可以有多名职员。
则实体部门和职员间的联系是
A)1:
1联系
B)m:
1联系
C)1:
m联系
D)m:
n联系
参考答案:
C
【解析】两个实体集间的联系实际上是实体集间的函数关系,主要有一对一联系(1:
1)、一对多联系(1:
m)、多对一联系(m:
1)、多对多联系(m:
n)。
对于每一个实体部门,都有多名职员,则其对应的联系为一对多联系(1:
m),答案选C。
6.
A)选择
B)投影
C)自然连接
D)并
参考答案:
A
【解析】由关系R到关系S为一元运算,排除C和D。
关系S是关系R的一部分,是通过选择之后的结果,因此选A。
7.数据字典(DD)所定义的对象都包含于
A)数据流图(DFD图)
B)程序流程图
C)软件结构图
D)方框图
参考答案:
A
【解析】在数据流图中,对所有元素都进行了命名,所有名字的定义集中起来就构成了数据字典。
因此选A,而B,C,D都不符合。
8.软件需求规格说明书的作用不包括
A)软件验收的依据
B)用户与开发人员对软件要做什么的共同理解
C)软件设计的依据
D)软件可行性研究的依据
参考答案:
D
【解析】软件需求规格说明书是需求分析阶段的最后成果,是软件开发的重要文档之一。
软件需求规格说明书有以下几个方面的作用。
①便于用户、开发人员进行理解和交流,B正确;②反映出用户问题的结构,可以作为软件开发工作的基础和依据,C正确;③作为确认测试和验收的依据,A正确。
9.下面属于黑盒测试方法的是
A)语句覆盖
B)逻辑覆盖
C)边界值分析
D)路径覆盖
参考答案:
C
【解析】黑盒测试不关心程序内部的逻辑,只是根据程序的功能说明来设计测试用例。
在使用黑盒测试法时,手头只需要有程序功能说明就可以了。
黑盒测试法分等价类划分法、边界值分析法和错误推测法,答案为C。
而A、B、D均为白盒测试方法。
10.下面不属于软件设计阶段任务的是
A)软件总体设计
B)算法设计
C)制定软件确认测试计划
D)数据库设计
参考答案:
C
【解析】从技术观点上看,软件设计包括软件结构设计、数据设计、接口设计、过程设计。
所以A、B、D正确,C为软件测试阶段的任务。
11.下列叙述中错误的是
A)C程序可以由多个程序文件组成
B)一个C语言程序只能实现一种算法
C)C程序可以由一个或多个函数组成
D)一个C函数可以单独作为一个C程序文件存在
参考答案:
B
【解析】一个C语言程序可以实现多种算法,可以由多个程序文件共同构成。
一个C语言程序可以由一个或多个函数组成,一个C函数可以单独作为一个C程序文件存在,被包含到其他程序中。所以选择B选项。
12.C语言源程序名的后缀是
A).C
B).exe
C).obj
D).cp
参考答案:
A
【解析】C语言源程序名的后缀是.C,目标文件的扩展文件是.obj,可执行文件的扩展名是.exe。
13.以下选项中不能用作C程序合法常量的是
A)123
B)'\123'
C)1,234
D)"\x7D"
参考答案:
C
【解析】C选项中不能含有逗号,所以"1,234"不能用作C程序的合法常量。B选项中表示的是八进制的常量,D选项中表示的是十六进制的常量。
14.表达式a+=a-=a=9的值是
A)18
B)-9
C)0
D)9
参考答案:
C
【解析】首先计算a=9,然后计算a-=9,即a=a-9,结果为0,然后计算a+=0,即a=a+0,所以最终结果为0。
15.若有定义语句:
intx=12,y=8,z;
在其后执行语句
z=0.9+x/y;
则z的值为
A)1
B)1.9
C)2
D)2.4
参考答案:
A
【解析】先计算x/y,结果为1,然后计算0.9+1,结果为1.9,但由于变量z为整型,所以取值1,所以z的值为1。
16.阅读以下程序
#include
main()
{intcase;
floatprintF;
printf("请输入2个数:
");
scanf("%d%f",&case,&printF);
printf("%d%f\n",case,printF);
}
该程序在编译时产生错误,其出错原因是
A)定义语句出错,case是关键字,不能用作用户自定义标识符
B)定义语句出错,printF不能用作用户自定义标识符
C)定义语句无错,scanf不能作为输入函数使用
D)定义语句无错,printf不能输出case的值
参考答案:
A
【解析】C语言中标识符的定义中区分大小写,所以printF与printf不一样,可以作为标识符。
而case是C语言中的关键字,不能作为变量名。scanf是标准的输入函数,printf是标准的输出函数,所以选择A选项。
17.有以下程序
#include
main()
{
charc1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c",&c1,&c2,&c3,&c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf("%c%c\n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是
A)1245
B)1256
C)1278
D)1267
参考答案:
A
【解析】Scanf按照格式字符进行输入,所以123与回车的值分别送入了c1、c2、c3、c4变量的存储空间。getchar()函数的功能是从键盘输入的字符串中读入一个字符,所以4送入了变量c5的存储空间,5送入了变量c6的存储空间。所以打印时结果为1245。
18.以下选项中,当x为大于1的奇数时,值为0的表达式是
A)x/2
B)x%2==0
C)x%2!
=0
D)x%2==1
参考答案:
B
【解析】A选项的值为不定值,但绝对不是0。算术运算符的优先级高于关系运算符的优先级,所以当x为大于1的奇数时,B选项的值为假,即0。C选项的值为真,即1。D选项的值为真,即1。选项B正确。
19.以下选项中与
if(a==1)a=b;
elsea++;
语句功能不同的switch语句是
A)switch(a==1)
{case0:
a=b;break;
case1:
a++;
}
B)switch(a)
{case1:
a=b;break;
default:
a++;
}
C)switch(a)
{default:
a++;break;
case1:
a=b;
}
D)switch(a==1)
{case1:
a=b;break;
case0:
a++;
}
参考答案:
A
【解析】if语句的含义是如果a的值为1,将b的值赋给a,否则将a的值自增1。Swich(a==1)中表达式a==1的结果如果为真即为1,则从case1开始执行,直到遇到break语句跳出switch语句,如果a==1的结果如果为假即0,则从case0开始执行,所以与题干含义执行操作相反的是选项A中的语句。
20.若变量已正确定义,有以下程序段
i=0;
doprintf("%d,",i);while(i++);
printf("%d\n",i);
其输出结果是
A)0,1
B)0,0
C)1,1
D)程序进入无限循环
参考答案:
A
【解析】第一次首先先执行循环体打印i的值0,然后判断while的条件i++,先用后自增,所以判断时条件为假,跳出循环,但是仍执行了i的自增操作,i的值为1。在接下来的打印语句中进行打印。
21.有以下程序
#include
main()
{inta=1,b=2,c=3,d=0;
if(a==1&&b++==2)
if(b!
=2||c--!
=3)
printf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
elseprintf("%d,%d,%d\n",a,b,c);
}
程序运行后的输出结果是
A)1,3,2
B)1,3,3
C)1,2,3
D)3,2,1
参考答案:
B
【解析】else总是和最近的if配对,所以进入第一个if语句中条件判断时,因为是逻辑与操作需要两边运算对象的值均为非零值,才为真,所以需要逐个执行判断的结果为1,不再执行第二个case语句中的操作。而是进入第二个if语句条件判断,因为b!
=2条件成立所以整个条件表达式的值为真,所以不再执行逻辑或的第二个运算对象(c--!
=3)c的值不变,也不再执行第一个else语句。打印a的值1,b的值3,c的值3。
22.有以下程序段
inti,n;
for(i=0;i<8;i++)
{n=rand()%5;
switch(n)
{case1:
case3:
printf("%d\n",n);break;
case2:
case4:
printf("%d\n",n);continue;
case0:
exit(0);
}
printf("%d\n",n);
}
以下关于程序段执行情况的叙述,正确的是
A)for循环语句固定执行8次
B)当产生的随机数n为4时结束循环操作
C)当产生的随机数n为1和2时不做任何操作
D)当产生的随机数n为0时结束程序运行
参考答案:
D
【解析】当产生的随机数为4时,对5取余结果为4,执行case4后面语句,见到continue结束本次循环,而非结束程序运行,所以B选项错误。当产生的随机数为1时,执行case1后面的所有语句,直到遇到break语句跳出switch结构;当随机数为2时,执行case2后面的所有语句,直到遇到continue语句跳出本次循环,所以C选项错误。由于循环体中含有exit(0)语句,该语句的功能是终止程序的执行,所以不是固定执行8次,A选项错误。
23.有以下程序
#include
intfun1(doublea)
{
return(int)(a*=a);
}
intfun2(doublex,doubley)
{
doublea=0,b=0;
a=fun1(x);
b=fun1(y);
return(int)(a+b);
}
main()
{
doublew;
w=fun2(1.1,2.0);
printf("%4.2f",w);
}
程序执行后输出结果是
A)0.0
B)5
C)5.21
D)5.00
参考答案:
D
【解析】题中变量w的定义为double型,函数fun2()的定义为int型,按照各类数值型数据间的混合运算,整型数据被转换为实型数据。
因此D选项正确。
24.设有定义语句
int(*f)(int);
则以下叙述正确的是
A)f是基类型为int的指针变量
B)f是指向函数的指针变量,该函数具有一个int类型的形参
C)f是指向int类型一维数组的指针变量
D)f是函数名,该函数的返回值是基类型为int类型的地址
参考答案:
B
【解析】int(*f)(int);为指向函数的指针变量的定义方法,其中f为指向函数的指针变量,第一个int为函数返回值类型,第二个int为函数的形参类型。
因此B选项正确。
25.有以下程序
#include
voidfun(int*a,int*b)
{int*c;
c=a;a=b;b=c;
}
main()
{intx=3,y=5,*p=&x,*q=&y;
fun(p,q);printf("%d,%d,",*p,*q);
fun(&x,&y);printf("%d,%d\n",*p,*q);
}
程序运行后的输出结果是
A)3,5,3,5
B)3,5,5,3
C)5,3,3,5
D)5,3,5,3
参考答案:
A
【解析】fun函数的功能是交换形式参数的值,即交换指针变量a和b的值,但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。
第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并不能影响p和q指针指向的数据,因此第二个printf语句的输出也是3,5。
因此A选项正确。
26.若有定义:
intw[3][5];
则以下不能正确表示该数组元素的表达式是
A)*(&w[0][0]+1)
B)*(*w+3)
C)*(*(w+1))
D)*(w+1)[4]
参考答案:
D
【解析】A选项中*(&w[0][0]+1)表示w[0][1];B选项中*(*w+3)表示w[0][3];C选项中*(*(w+1))表示w[0][1];而D选项中*(w+1)[4]的正确写法是(*w+1)[4],表示w[1][4];因此选择D选项。
27.有以下程序
#include
voidf(intb[])
{inti;
for(i=2;i<6;i++)b[i]*=2;
}
main()
{inta[10]={1,2,3,4,5,6,7,8,9,10},i;
f(a);
for(i=0;i<10;i++)printf("%d,",a[i]);
}
程序运行后的输出结果是
A)1,2,3,4,5,6,7,8,9,10,
B)1,2,6,8,10,12,7,8,9,10,
C)1,2,3,4,10,12,14,16,9,10,
D)1,2,6,8,10,12,14,16,9,10,
参考答案:
B
【解析】数组名是常量,表示的是数组首元素的地址。
当执行f(a)的时候,由于传递的是首地址,相当于直接对数组a进行操作,所以从数组a的第三个元素a[2]到元素a[5],每个元素值扩大两倍。
因此B选项正确。
28.有以下程序
#include
intfun(chars[])
{intn=0;
while(*s<='9'&&*s>='0'){n=10*n+*s-'0';s++;}
return(n);
}
main()
{chars[10]={'6','1','*','4','*','9','*','0','*'};
printf("%d\n",fun(s));
}
程序的运行结果是
A)5
B)9
C)61
D)61490
参考答案:
C
【解析】在fun函数中,while循环的功能是:
逐个取字符数组s的字符判断其是否是数字。
若是则将其作为个位数字保存到变量n中,n的原数据的各个数位将相应左移一个10进制位。
当指针s指向数组的第3位时,循环条件不成立,循环结束,返回n的值,输出n的值为61。
因此C选项正确。
29.若要求从键盘读入含有空格字符的字符串,应使用函数
A)getchar()
B)getc()
C)gets()
D)scanf()
参考答案:
C
【解析】scanf()语句中用"空格"间隔不同的字符串,空格将被全部忽略掉,所以用scanf()函数不能输入空格;getchar()函数用于输入字符,其调用格式为:
ch=getchar(),getchar()函数从终端读入一个字符作为函数值,把读入的字符赋给变量ch。
在输入时,空格、回车符都将作为字符读入,而且只有在用户敲入回车键时,读入才开始执行。
gets()函数的调用形式为:
gets(str_adr),其中str_adr是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。
gets函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。
getc()函数的调用形式为:
ch=getc(pf)其中pf是文件指针,函数的功能是从pf指定的文件中读入一个字符,并把它作为函数值返回。
因此C选项正确。
30.设有如下程序段
#include
chars[20]="Beijing",*p;
p=s;
则执行p=s;语句后,以下叙述正确的是
A)s和p都是指针变量
B)s数组中元素的个数和p所指字符串长度相等
C)可以用*p表示s[0]
D)数组s中的内容和指针变量p中的内容相同
参考答案:
C
【解析】程序定义了字符数组s和字符型指针变量p,并且使得p指向数组,执行p=s;语句后,*p即表示s[0];s数组中元素的个数和p所指字符串长度不相等,因为s数组中元素的个数包括字符串结束标志"\0",而p所指字符串长度不包括"\0";s是字符型数组,p是指针变量;数组s中的内容和指针变量p中的内容不相同,数组中存放的是字符串,而指针变量p存放的是数组的首地址。
因此C选项正确。
31.有以下程序
#include
main()
{chars[]="abcde";
s+=2;
printf("%d\n",s[0]);
}
执行后的结果是
A)输出字符c的ASCII码
B)程序出错
C)输出字符c
D)输出字符a的ASCII码
参考答案:
B
【解析】本题重点考察数组名的概念。
在C语言中,数组名类似于一个指向数组首地址的指针常量,一旦定义就不能修改其内容。
所以本题中的s+=2;语句让数组名s的内容加2是错误的,编译无法通过。
因此B选项正确。
32.有以下程序
#include
#include
voidfun(char*s[],intn)
{char*t;inti,j;
for(i=0;ifor(j=i+1;jif(strlen(s[i])>strlen(s[j]))
{t=s[i];s[i]=s[j];s[j]=t;}
}
main()
{char*ss[]={"bcc","bbcc","xy","aaaacc","aabcc"};
fun(ss,5);printf("%s,%s\n",ss[0],ss[4]);
}
程序的运行结果是
A)aaaacc,xy
B)xy,aaaacc
C)bcc,aabcc
D)aabcc,bcc
参考答案:
B
【解析】函数fun(chars[],intn)的功能是对字符串数组的元素按照字符串的长度从小到大排序,在主函数中执行fun(ss,5)语句后,*ss[]={"xy","bcc","bbcc","aabcc","aaaacc"},ss[0],ss[4]的输出结果为xy,aaaacc。
因此B选项正确。
33.有以下程序
#include
inta=4;
intf(intn)
{intt=0;staticinta=5;
if(n%2){inta=6;t+=a++;}
else{inta=7;t+=a++;}
returnt+a++;
}
main()
{ints=a,i=0;
for(;i<2;i++)s+=f(i);
printf("%d\n",s);
}
程序运行后的输出结果是
A)36
B)24
C)32
D)28
参考答案:
D
【解析】在主函数main()中定义了两个变量s和i,同时给s赋初值。
a=4,i赋初值0。
当i=0时。
执行"s+=f(i);"语句,调用f()并将i的初值0传递给形参n。
首先执行if语句中内条件:
n%2,若条件为假。
则执行else下的语句,a=7,t=7+0=7,使用return返回t,t=7+(a++)=7+5=12,此时a运算完后自增1,变为6;返回主函数中,s=4+12=16。
当i=1时,执行"s+=f(i);"语句,调用f()并将i的初值1传递给形参n。
首先执行if语句中的条件:
n%2,条件为真,执行if下面的语句,t=0,a=6t=0+6=6,使用return返回t,t=6+