全国计算机等级考试C语言2级笔试题-2009年09月
第30次考试题目
选择题
软件技术基础单选题(1-10)
下列各题A)、B),C)、D)四个选项中,只有一个选项是正确的。
1.下列数据结构中,属于非线性结构的是()
A)循环队列B)带链队列C)二叉树D)带链栈
C
[解析]根据数据结构中各数据元素之间前后关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。线性结构表示数据元素之间为一对一的关系,非线性结构表示数据元素之间为一对多或者多对一的关系。根据各种结构的定义知二叉树是一种非线性结构。
2.下列数据结构中,能够按照“先进后出”原则取数据的是()
A)循环队列B)栈C)队列D)二叉树
B
[解析]栈是限定只在一端进行插入与删除的线性表,通常称插入、删除的这一端为栈顶,另一端为栈底。栈顶元素总是后被插入的元素,也是最先被删除的元素;栈底元素总是最先被插人的元素,也是最后才能被删除的元素。栈是按照“先进后出”或“后进先出”的原则组织数据的。
3.对于循环队列,下列叙述中正确的是()
A)队头指针是固定不变的B)队头指针一定大干队尾指针
C)队头指针一定小于队尾指针D)队头指针可以大干队尾指针,也可以小于队尾指针
D
[解析]循环队列是将顺序队列首尾相连形成的,随着插入元素或删除元素的进行,其队头指针及队尾指针是在不断变化的,有时可能会出现队头指针大于队尾指针的情况,也可能是队尾指针大于队头指针,故答案为D)。
4.算法的空间复杂度是指()
A)算法在执行过程中所需要的计算机存储空间B)算法所处理的数据量
C)算法程序中的语句或指令条数D)算法在执行过程中所需要的临时工作单元数
A
[解析]算法的空间复杂度是指:算法执行过程中所需的存储空间。一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。
5.软件设计中划分模块的一个准则是()
A)低内聚低耦合B)高内聚低耦合C)低内聚高耦合D)高内聚高耦合
B
[解析]模块划分应考虑的因素包括模块之间的耦合和内聚。一般来说,要求模块之间的耦合尽可能地低,即模块尽可能独立,要求模块的内聚程度尽可能地高,即遵循高内聚、低耦合的原则。
6.下列迭项中不属于结构化程序设计原则的是()
A)可封装B)自顶向下C)模块化D)逐步求精
A
[解析]模块化、自顶向下、逐步求精都是结构化程序设计的原则;可封装是面向对象程序设计原则。
7.软件详细设计产生的图如下:
该图是()
A)N-S图B)PAD图C)程序流程图D)E-R图
C
[解析]N-S图是由若干基本框图构成的流程图,其特点是没有流程线;PAD图即问题分析图(ProblemAnalysisDiagram),它是一种由左往右展开的二维树型结构;程序流程图用于描述问题解决的过程和步骤,其中方框表示处理步骤,菱形框表示逻辑判断,箭头表示控制流向;E-R图即实体-联系图(EntityRelationshipDiagram),用来描述现实世界的概念模型,构成元素有实体、属性和联系,分别用矩形、椭圆形和菱形表示。本题答案为C)。
8.数据库管理系统是()
A)操作系统的一部分B)在操作系统支持下的系统软件
C)一种编译系统D)一种操作系统
B
[解析]数据库管理系统是指位于用户与操作系统之间的数据管理软件。数据库管理系统是为数据库建立、使用和维护而配置的软件。
9.在E-R图中,用来表示实休联系的图形是()
A)椭圆形B)矩形C)菱形D)三角形
C
[解析]E-R图中用矩形表示实体(等同于表),用椭圆形表示实体的属性(等同于表中字段),用菱形表示实体关系(等同于外键)。
10.有三个关系R,S和T如下:
其中关系T由关系R和S通过某种操作得到,该操作为()
A)选择B)投影C)交D)并
D
[解析]两个相同结构关系的并是由属于这两个关系的元组组成的集合。
基础单选题(11-15)
11.以下叙述中正确的是()
A)程序设计的任务就是编写程序代码并上机调试
B)程序设计的任务就是确定所用数据结构
C)程序设计的任务就是确定所用算法
D)以上三种说法都不完整
D
[解析]程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。所以选项A)、B)、C)说法都不完整。
12.以下选项中,能用作用户标识符的是()
A)voidB)8_8C)_0_D)unsigned
C
[解析]C语言的标识符命名规则为:①只能由字母、数值和下划线3种字符组成;②第一个字符必须是字母或下划线;③不能与C语言中的关键字或保留字相同。
13.阅读以下程序
#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编译系统已经预定义的、具有特殊用途的保留标识符(即关键字)同名,否则程序在编译时会出现错误。题目源程序中使用了已经预定义的关键字case,所以将出现错误。
14.表达式:(int)((double)9/2)-(9)%2的值是()
A)OB)3C)4D)5
B
[解析](itn)((double)9/2)的值为4,(9)%2的值为1,因此(int)((double)9/2)-(9)%2的值为3。
15.若有定义语句:intx=10;则表达式x-=x+x的值为()
A)-20B)-10C)0D)10
B
[解析]x-=x+x可化为:x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。
16.有以下程序
#include
main()
{inta=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2b);
}
程序运行后的输出结果是()
A)0,0B)1,0C)3,2D)1,2
D
[解析]执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2b=2,所以输出结果为2。
17.设有定义:inta=1,b=2,c=3;,以下语句中执行效果与其它三个不同的是
A)if(a>b)c=a,a=b,b=c;
B)if(a>b){c=a,a=b,b=c;}
C)if(a>b)c=a;a=b;b=c;
D)if(a>b){c=a;a=b;b=c;}
C
[解析]逗号表达式的求解过程是:按表达式顺序从左往右依次求解。本题中由于判断条件a>b的值为假,所以选项A)、B)、D)中if语句后面的语句均未被执行,而C)中的后两条语句a=b和b=c被执行,因此选项C)的执行效果与其他三个不同。
18.有以下程序
#include
main()
{intc=0,k;
for(k=1;k<3;k++)
switch(k)
{default:c+=k;
case2:c++;break;
case4:c+=2;break;
}
printf("%d\n",c);
}
程序运行后的输出结果是()
A)3B)5a)7D)9
A
[解析]第一次循环时,k=1,在switch语句中,先执行default后面的语句,即c=c+k=1,因为没有break语句,所以不会跳出switch结构,会接着执行ease2后面的语句,即c=c+1=2,然后跳出switch;第二次循环时,k=2,直接执行case2后面的语句,即c=c+1=3,然后跳出switch语句,结束循环,执行输出语句。
19.以下程序段中,与语句:k=a>b?(b>c?1:0):0;功能相同的是()
A)if((a>b)&&(b>c))k=1;elsek=0;
B)if((a>b)‖(b>c))k=1;elsek=0;
C)if(a<=b)k=0;elseif(b<=c)k=1;
D)if(a>b)k=1;elseif(b>c)k=1;elsek=0;
A
[解析]表达式k=a>b?(b>c?1:0):0表示:如果(a>b)条件为真,则k取值(b>c?1:0),否则k取值0;当a>b的情况下,如果b>c,则k值为1,否则为0。所以该表达式与选项A)功能相同。
20.有以下程序
#include
main()
{chars[]={"012xy"};
inti,n=0;
for(i=0;s[i]!=0;i++)
if(s[i]>=''a''&&s[i]<=''z'')n++;
printf("%d\n",n);
}
程序运行后的输出结果是()
A)0B)2C)3D)5
B
[解析]在字符串数组s[i]中,只有当下标i=3和i=4时,才满足订条件,所以n的值从0增加两次,结果为2。
21.有以下程序
#include
main()
{intn=2,k=0;
while(k++&&n++>2);
printf("%d%d\n",k,n);
}
程序运行后的输出结果是()
A)02B)13C)57D)12
D
[解析]本题考查逻辑运算符的“短路”现象,由于k的值为0,表达式首先去求k++的值,因为表达式k++的值为0,系统完全可以确定逻辑表达式的运算结果总是为0,因此将跳过n++>2,不再对它进行求值,即k的值加1,n的值不变。
22.有以下定义语句,编译时会出现编译错误的是()
A)chara=''a'';B)chara=''\n'';
C)chara=''aa'';D)chara=''\x2d'';
C
[解析]aa是字符串,不用加上单引号。
23.有以下程序
#include main()
{charc1,c2;
c1=''A''+''8''-''4'';
c2=''A''+''8''-''5'';
printf("%c,%d\n",c1,c2);
}
已知字母A的ASCII码为65,程序运行后的输出结果是
A)E,68B)D,69C)E,DD)输出无定值
A
[解析]c1输出字符的ASCII码比字母A大4,即字母E;c2以十进制数字形式输出,因此可以判断本题答案为A)。
24.有以下程序
#include
voidfun(intp)
{intd=2;
p=d++;
printf("%d",p);
}
main()
{inta=1;
fun(a);
printf("%d\n",a);
}
程序运行后的输出结果是()
A)32B)12C)21D)22
C
[解析]程序运行后,首先输出的是p的值,然后再输出a的值。p=d++,得到P的值为d的初始值2;a的值不变,仍为1。
25.以下函数findmax拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能。
#defineMIN-2147483647
intfindmax(intx[],intn)
{inti,max;
for(i=0;i {max=MIN;
if(max }
returnmax;
}
造成错误的原因是()
A)定义语句inti,max;中max未赋初值
B)赋值语句max=MIN;中,不应给max赋MIN值
C)语句if(max D)赋值语句max=MIN;放错了位置
D
[解析]对max赋初值,应该要放在循环语句之前,不然每次循环都将是从MIN开始比较。
26.有以下程序
#include
main()
{
intm=1,n=2,p=&m,q=&n,r;
r=p;p=q;q=r;
printf("%d,%d,%d,%d\n",m,n,p,q);
}
程序运行后的输出结果是()
A)1,2,1,2B)1,2,2,1
C)2,1,2,1D)2,1,1,2
B
[解析]m和n的值不变,输出结果为1,2;指针p和q交换了指向的位置,即p=&n,q=&m,输出结果分别为2,1。
27.若有定义语句:inta[4][10],p,q[4];且0≤i<4,则错误的赋值是()
A)p=aB)q[i]=a[i]C)p=a[i]D)p=&a[2][1]
A
[解析]直接将二维数组a赋给p不合法,两者类型不匹配。
28.有以下程序
#include
#include
main()
{
charstr[][20]={"QneWorld","oneDream!"},p=str[1];
printf("%d,",strlen(p));
printf("%s\n",p);
}
程序运行后的输出结果是()
A)9,OneWorldB)9,OneDream!
C)10,OneDream!D)10,OneWorld
C
[解析]可以将二维数组str看成一个是一个特殊的一维数组,其元素也是一个数组。那么,str[0]为“OneWorld”,str[1]为“OneDream!”。
29.有以下程序
#include
main()
{inta[]={2,3,5,4},i;
for(i=0;i<4;i++)
switch(i%2)
{case0:switch(a[i]%2)
{case0:a[i]++;break;
case1:a[i]--;
}
break;
case1:a[i]=0;
}
for(i=0;i<4;i++)
printf("%d",a[i]);
printf("\n");
}
程序运行后的输出结果是()
A)3344B)2050C)3040D)0304
C
[解析]第一次循环,i=0,i%2=0,a[0]%2=0,a[0]=a[0]+1=3;第二次循环,i=1,1%2=1,a[1]=0;第三次循环,i=2,a[2]%2=1,a[2]=a[2]-1=4;第四次循环,i=3,i%2=1,a[3]=0。
30.有以下程序
#include
#include
main()
{
chara[10]=”abcd";
printf("%d,%d\n",strlen(a),sizeof(a));
}
程序运行后的输出结果是
A)7,4B)4,10C)8,8D)10,10
B
[解析]strlen()用来返回字符串的长度,而si-zeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。
31.下面是有关C语言字符数组的描述,其中错误的是()
A)不可以用赋值语句给字符数组名赋字符串
B)可以用输入语句把字符串整体输入给字符数组
C)字符数组中的内容不一定是字符串
D)字符数组只能存放字符串
D
[解析]字符数组中的内容既可以是字符,也可以是字符串,选项D)说法不正确。
32.下列函数的功能是()
fun(chara,charb)
{
while((b=a)!=''\0'')
{a++;b++;}
}
A)将a所指字符串赋给b所指空间
B)使指针b指向a所指字符串
C)将a所指字符串和b所指字符串进行比较
D)检查a和b所指字符串中是否有''\0''
A
[解析]表达式b=a是将a所指的字符赋给b所指的空间,然后,指针a和b依次后移,直到到达指针a所指字符串的结尾。
33.设有以下函数:voidfun(intn,chars){……}则下面对函数指针的定义和赋值均正确的是()
A)void(pf)();pf=fun;
B)voidpf();pf=fun;
C)voidpf();Pf=fun;
D)void(pf)(int,char);pf=&fun;
A
[解析]函数指针的定义形式是:数据类型标识符(指针变量名)()。void(pf)()定义了一个没有返回值的函数指针Pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给pf赋值时,只把函数名fun赋给Pf即可。所以正确答案为选项A)。
34.有以下程序
#include
intf(intn);
main()
{inta=3,s;
s=f(a);
s=s+f(a);
printf("%d\n",s);
}
intf(intn)
{
staticinta=1;
n+=a++;
returnn;
}
程序运行后的输出结果是()
A)7B)8C)9D)10
C
[解析]s=f(a)表达式第一次调用f(n)函数时,f(n)函数运行结果为n=4,a=2,即s等于4;s=s+f(a)表达式第二次调用f(n)函数时,f(n)函数运行结果为n=5,所以得到s值为9。
35.有以下程序
#include
#definef(x)xxx
main()
{inta=3,s,t;
s=f(a+1);
t=f((a+1));
printf("%d,%d\n",s,t);
}
程序运行后的输出结果是
A)10,64B)10,10C)64,10D)64,64
A
[解析]s=f(a+1)=a+1a+1a+1=10;s=f((a+1))=(a+1)(a+1)(a+1)=64。
36.下面结构体的定义语句中,错误的是
A)structord{intx;inty;intz;};structorda;
B)structord{intx;inty;intz;}structorda;
C)structord{intx;inty;intz;}a;
D)struct{intx;inty;intz;}a;
B
[解析]定义结构体变量有三种方式:①先声明结构体类型,再定义变量名,如选项A)所示;②在声明类型的同时定义变量,如选项C)所示;③直接定义结构体类型变量,如选项D)所示。
37.设有定义:charc;,以下选项中能够使字符型指针c正确指向一个字符串的是
A)charstr[]="string";c=str;B)scarf("%s",c);
C)c=getchar();D)c="string";
A
[解析]选项B)、D)中,没有为字符串分配空间,因此不能用c指向字符串。选项C)中getchar()函数返回一个字符,不能将字符赋给字符指针c。选项A)中首先定义了字符数组str,然后将str的首地址赋给指针c,这样就使指针c指向了字符串“string”。
38.有以下程序
#include
#include
structA{inta;charb[10];doublec;};
structAf(stmctAt);
main()
{
structAa={1001,"ZhangDa",1098.0);
a=f(a);
printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
structAf(structAt)
{t.a=1002;
strcpy(t.b,"changRong");
t.c=1202.0;
returnt;
}
程序运行后的输出结果是()
A)1001,ZhangDa,1098.0
B)1002,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1002,ChangRong,1202.0
D
[解析]在主函数中,通过a=f(a)实现函数调用,所以输出的结构体变量相应变为1002,ChangRong,1202.0。
39.若有以下程序段
intr=8;
printf("%d\n",r>>1);
输出结果是()
A)16B)8C)4D)2
C
[解析]8用二进制表示为1000,右移1位后为0100,即十进制4。
40.下列关于C语言文件的叙述中正确的是()
A)文件由一系列数据依次排列组成,只能构成二进制文件
B)文件由结构序列组成,可以构成二进制文件或文本文件
C)文件由数据序列组成,可以构成二进制文件或文本文件
D)文件由字符序列组成,其类型只能是文本文件
C
[解析]文件由数据序列组成,可以构成二进制文件,也可以构成文本文件。
二、填空题
软件技术基础填空题(1-5)
1.某二叉树有5个度为2的结点以及3个度为1的结点,则该二叉树中共有______个结点。
14
[解析]在二叉树中,度为0的结点数是度为2的结点数加1,故二叉树中结点数的总和为度为0的结点数、度为1的结点数及度为2的结点数三者相加,得出结果为14个结点。
2.程序流程图中的菱形框表示的是______。
逻辑判断
[解析]绘制流程图时事实描述用椭圆形表示、行动方案用矩形表示、问题用菱形表示、箭头代表流动方向。
3.软件开发过程主要分为需求分析、设计、编码与测试四个阶段,其中______阶段产生“软件需求规格说明书”。
需求分析
[解析]需求分析阶段的工作主要包括需求获取、需求分析、编写需求规格说明书和需求评审等4方面,产生的主要文档为软件需求规格说明书,它可以为用户、分析人员和设计人员之间的交流提供方便,直接支持目标软件系统的确认,也可以作为控制软件开发进程的依据。
4.在数据库技术中,实体集之间的联系可以是一对一或一对多或多对多的,那么“学生”和“可选课程”的联系为______。
多对多
[解析]一名学生可以选择多门课程,一门课程也可以由多名学生选择,因此是多对多的联系。
5.人员基本信息一般包括:身份证号,姓名,性别,年龄等。其中可以作为主关键字是______。
身份证号
[解析]主关键字是表中区别不同的记录的标识,在该表中只有身份证号能具有这个作用,所以用其作为主关键字。
综合填空题(6-15)
6.若有定义语句:inta=5;,则表达式:a++的值是______。
5
[解析]a++的含义是在使用a值以后,使a值加1,所以a++的值为5。
7.若有语句doublex=17;inty;,当执行y=(int)(x/5)%2;之后y的值为______。
1
[解析]y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。
8.以下程序运行后的输出结果是______。
#include
main()
{intx=20;
printf("%d",0 printf("%d\n",0 }
10
[解析]第一个printf语句输出的结果是逻辑表达式(x>01,x<20)的值,显然为真,即为1;第二个printf语句输出的是逻辑表达式(x>0&&x<20)的值,该值为假,即为0。
9.以下程序运行后的输出结果是______。
#include
main()
{inta=1,b=7;
do{
b=b/2;a+=b;
}while(b>1);
printf("%d\n",a);
}
5
[解析]第一次循环执行后,b=3,a=4,满足条件b>1,循环继续;第二次循环执行后,b=1,a=5,不满足条件b>1,结束循环。所以输出的a值为5。
10.有以下程序
#include
main()
{intf,f1,f2,i;
f1=0;f2=1;
printf("%d%d",f1,f2);
for(i=3;i<=5;i++)
{f=f1+f2;
printf("%d",f);
f1=f2;
f2=f;
}
printf("\n");
}
程序运行后的输出结果是______。
01123
[解析]第一个printf语句输出结果为01。循环体总共循环三次,第一次循环结果为,f=1,f1=1,f2=1;第二次循环结果为f=2,f1=1,f2=2;第三次循环结果为f=3,f1=2,f1=3。
11.有以下程序
#include
inta=5;
voidfun(intb)
{inta=10;
a+=b;
printf("%d",a);
}
main()
{intc=20;
fun(c);
a+=c;
printf("%d\n",a);
}
程序运行后的输出结果是______。
3025
[解析]fun(c)调用函数fun(b),函数执行结果为a=a+b=10+20=30;调用完函数后,主函数继续执行,输出结果a=a+c=5+20=25。
12.设有定义:
structperson
{intID;
charname[12];
}p;
请将scanf("%d",______);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。
&p.ID
[解析]结构体成员的引用通过符号“.”来表示,通过scanf语句对变量进行赋值时,要用取地址符&。
13.有以下程序
#include
main()
{chara[20]="Howareyou?",b[20];
scanf("%s",b);
printf("%s%s\n",a,b);
}
程序运行时从键盘输入:Howareyou?<回车>
则输出结果为______。
Howareyou?How
[解析]用%s格式输入字符串时,空格和回车都做为输入数据的分隔符,不能被读入,因此数组b的输出结果为HOW。
14.有以下程序
#include
typedefstruct
{intnum;doubles;}REC;
voidfunl(RECx){x.num=23;x.s=88.5;}
main()
{RECa={16,90.0);
funl(a);
printf(”%d\n“,a.num);
}
程序运行后的输出结果是______。
16
[解析]主函数中,通过funl()函数将a值传递给x,但没有把形参x的值返回,此时变量a的值并没有发生变化,所以输出a.Hum的值为16。
15.有以下程序
#include
fun(intx)
{if(x/2>0)fun(x/2);
printf("%d",x);
}
main()
{fun(6),printf("\n");}
程序运行后的输出结果是______。
136
[解析]依次执行fun(6),fun(3),fun(1),当执行fun(6)时要调用fun(3),执行fun(3)时要调用fun(1),所以输出的结果为136。
|
|