配色: 字号:
全国计算机等级考试C语言2级笔试题-(25)2007年4月1
2013-07-14 | 阅:  转:  |  分享 
  
2007年4月全国等级考试题目

第25次(已经修改)



一、选择题

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。

(1-11题,软件技术基础单向选择题目)

1.下列叙述中正确的是()

A)算法的效率只与问题的规模有关,而与数据的存储结构无关

B)算法的时间复杂度是指执行算法所需要的计算工作量

C)数据的逻辑结构与存储结构是一一对应的

D)算法的时间复杂度与空间复杂度一定相关



B

[解析]根据时间复杂度和空间复杂度的定义可知,算法的时间复杂度与空间复杂度并不相关。数据的逻辑结构就是数据元素之间的逻辑关系,它是从逻辑上描述数据元素之间关系的,是独立于计算机中的,数据的存储结构是研究数据元素和数据元素之间的关系如何在计算机中表示,它们并非一一对应。算法的执行效率不仅与问题的规模有关,还与数据的存储结构有关。



2.在结构化程序设计中,模块划分的原则是()

A)各模块应包括尽量多的功能

B)各模块的规模应尽量大

C)各模块之间的联系应尽量紧密

D)模块内具有高内聚度、模块间具有低耦合度



D

[解析]在结构化程序设计中,一般较优秀的软件设计尽量做到高内聚、低耦合,这样有利于提高软件模块的独立性,这也是模块划分的原则。



3.下列叙述中正确的是()

A)软件测试的主要目的是发现程序中的错误

B)软件测试的主要目的是确定程序中错误的位置

C)为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作

D)软件测试是证明软件没有错误



A

[解析]软件测试是为了发现错误而执行程序的过程,且为了达到好的测试效果,应该由独立的第三方来构造测试,程序员应尽量避免检查自己的程序。



4.下面选项中不属于面向对象程序设计特征的是()

A)继承性B)多态性C)类比性D)封装性



C

[解析]面向对象程序设计的3个主要特征是:封装性、继承性和多态性。



5.下列对队列的叙述正确的是()

A)队列属于非线性表B)队列按“先进后出”原则组织数据

C)队列在队尾删除数据D)队列按“先进先出”原则组织数据



D

[解析]队列是一种操作受限的线性表。它只允许在线性表的一端进行插入操作,另一端进行删除操作。其中,允许插入的一端称为队尾(rear),允许删除的一端称为队首(front)。队列具有先进先出的特点,它是按“先进先出”的原则组织数据的,故本题答案为D)。



6.对下列二叉树进行前序遍历的结果为()

A)DYBEAFCZXB)YDEBFZXCAC)ABDYECFXZD)ABCDEFXYZ



C

[解析]二叉树前序遍历的含义是:首先访问根结点,然后按前序遍历根结点的左子树,最后按前序遍历根结点的右子树,前序遍历二叉树的过程是一个递归的过程。根据题目中给出的二叉树的结构可知前序遍历的结果是:ABDYECFXZ。



7.某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为()

A)n+lB)n-1C)2nD)n/2



A

[解析]对于任何一棵二叉树T,如果其终端结点(叶子)数为n1,度为2的结点数为n2,则n1=n2+1。所以该二叉树的叶子结点数等于n+1。



8.在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是()

A)并B)交C)投影D)笛卡儿乘积



B

[解析]在关系运算中,“交”的定义如下:设R1和R2为参加运用算的两个关系,它们具有相同的度n,且相对应的属性值取自同—个域,则R1∩R2为交运算,结果仍为度等于n的关系,其中的元组既属于R1又属于R2。

根据定义可知,不改变关系表的属性个数但能减少元组个数的是交运算,故本题答案为B)。



9.在E-R图中,用来表示实体之间联系的图形是()

A)矩形B)椭圆形C)菱形D)平行四边形



C

[解析]E-R模型可用E-R图来表示,它具有3个要素:①实体(型)用矩形框表示,框内为实体名称。②属性用椭圆型来表示,并用线与实体连接。属性较多时也可以将实体及其属性单独列表。③实体间的联系用菱形框表示。用线将菱形框与实体相连,并在线上标注联系的类型。



10.下列叙述中错误的是()

A)在数据库系统中,数据的物理结构必须与逻辑结构一致

B)数据库技术的根本目标是要解决数据的共享问题

C)数据库设计是指在已有数据库管理系统的基础上建立数据库

D)数据库系统需要操作系统的支持



A

[解析]数据库设计(DatabaseDesign)是指根据用户的需求,在某一具体的数据库管理系统上设计数据库的结构并建立数据库的过程;数据库技术的根本目标是要解决数据共享的问题;数据库需要操作系统的支持;数据的物理结构又称数据的存储结构,就是数据元素在计算机存储器中的表示及其配置。数据的逻辑结构是指数据元素之间的逻辑关系,它是数据在用户或程序员面前表现的方式,在数据库系统中,数据的物理结构不一定与逻辑结构一致。



11.算法中,对需要执行的每一步操作,必须给出清楚、严格的规定。这属于算法的()

A)正当性B)可行性C)确定性D)有穷性



C

[解析]一个算法应当具有5个特性,即有穷性、确定性、可行性、有零个或多个输入以及有一个或多个输出。算法的确定性是指:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的执行结果。

(12-50),C语言综合单向选择题

12.以下叙述中错误的是()

A)计算机不能直接执行用C语言编写的源程序

B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件

C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件

D)后缀为.obj和.exe的二进制文件都可以直接运行



D

[解析]一个C语言的源程序(后缀名为.c)在经过编译器编译后,先生成一个汇编语言程序,然后由编译程序再将汇编语言程序翻译成机器指令程序,即目标程序(后缀名为.obj),目标程序不可以直接运行,它要和库函数或其它目标程序连接成可执行文件(后缀名为.exe)后方可运行。故本题答案为D)。



13.按照C语言规定的用户标识符命名规则,不能出现在标识符中的是()

A)大写字母B)连接符C)数字字符D)下划线



B

[解析]在C语言中,用户标识符命令规则规定:变量名只能由字母、数字或下划线3种字符组成,且第一个字符必须为字母或下划线。在C语言中,大写字母和小写字母被认为是两个不同的字符。据此规定A)、D)、C)三个选项是正确的,而B)选项是连字符,不在C语言规定的命名变量标识符的范围内。



14.以下叙述中错误的是()

A)C语言是一种结构化程序设计语言

B)结构化程序由顺序、分支、循环三种基本结构组成

C)使用三种基本结构构成的程序只能解决简单问题

D)结构化程序设计提倡模块化的设计方法



C

[解析]结构化程序设计是指在程序的构成上只使用顺序、选择(即分支)和循环3种结构组成的编程方式。它强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路,是把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。结构化程序设计提倡模块化的设计方法。



15.对于一个正常运行的C程序,以下叙述中正确的是()

A)程序的执行总是从main函数开始,在main函数结束

B)程序的执行总是从程序的第一个函数开始,在main函数结束

C)程序的执行总是从main函数开始,在程序的最后一个函数中结束

D)程序的执行总是从程序中的第一个函数开始,在程序的最后一个函数中结束



A

[解析]一个C程序总是从main函数开始执行,而不论其在程序中的位置。在main函数中可以调用程序中的其他函数,而其他函数却不可以调用main函数。程序最后再从main函数中结束。



16.设变量均已正确定义,若要通过scanf("%d%c%d%c",&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:口代表空格字符)()

A)10口X口20口Y<回车>

B)10口X20口Y<回车>

C)10口X<回车>20口Y<回车>

D)10X<回车>20Y<回车>

D

[解析]本题中,scanf函数的格式控制没有空格,所以,对于选项A)、B)、C),输入的第一个空格会作为字符赋值给变量c1,而不会被解释成分隔符。



17.若有代数式(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是()

A)sqrt(abs(n^x+e^X))B)sqrt(fabs(pow(n,x)+pow(x,e)))

C)sqrt(fabs(pow(n,x)+exp(X)))D)sqrt(fabs(pow(x,n)+exp(x)))



C

[解析]本题主要考查C语言的库函数。abs求整数的绝对值,fabs求双字节型的绝对值,pow函数的原形是doublepow(doubleX,doubleY),计算x的y次方;exp函数的原形是doubleexp(doubleX),求10的X次方;sqrt函数的原形是doublesqrt(doublex),为x的平方根。故本题答案为C)。



18.设有定义:intk=0;,以下选项的四个表达式中与其他三个表达式的值不相同的是()

A)k++B)k+=1C)++kD)k+1



A

[解析]因为“intk=0;”,所以B)、C)、D)三个选项的表达式的值都等于1,而A)选项的表达式的值等于0。这是因为“k++”这个表达式先进行取k值的运算,然后是k值自加1。故本题答案为A)。



19.有以下程序,其中%u表示按无符号整数输出

main()

{

unsignedintx=0xFFFF;/x的初值为+六进制数/

printf("%u\n",x);

}

程序运行后的输出结果是()

A)-1B)65535C)32767D)0xFFFF



B

[解析]“%u”格式符用来以+进制形式输出无符号整型变量,其取值范围是0~65535。本题中无符号整型变量x=0xFFFF(+六进制)表示的是无符号整型变量的最大值65535。



20.设变量x和y均已正确定义并赋值。以下if语句中,在编译时将产生错误信息的是()

A)if(x++);B)if(x>y&&y!=0);

C)if(x>0)x-elsey++;D)if(y<0){;}elsex++;



C

[解析]C语言规定,在“if(表达式)语句1;else语句2;”这种形式的if语句中,在每一个else前面有一个分号,整个语句结束处有一分号。在本题的C)选项中,else前面少了一个分号,这样程序在编译时,会出现语法错误。



21.以下选项中,当x为大于1的奇数时,值为0的表达式是()

A)x%2==1B)x/2C)x%2!=0D)x%2==0



D

[解析]因为x的值为大于1的奇数,所以x除以2的余数等于1,因此,选项A)、C)中表达式的结果为真,不为0;对于选项B)来说,x除以2的商不会等于0;选项D)中表达式的结果为假,即等于0。



22.以下叙述中正确的是()

A)break语句只能用于switch语句体中

B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环

C)break语句只能用在循环体内和switch语句体内

D)在循环体内使用break语句和continue语句的作用相同



C

[解析]break语句的功能是跳出正在执行的条件语句或循环语句。它可以出现在switch语句中,也可以出现在循环语句中。continue语句只是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判断。



23.有以下程序

main()

{intk=5,n=0;

do

{switch(k)

{case1:

case3:n+=1;k--;break;

default:n=0;k--;

case2:

case4:n+=2;k--;break;

}

printf("%d",n);

}while(k>0&&n<5);

}

程序运行后的输出结果是()

A)235B)0235C)02356D)2356



A

[解析]因为变量的初始值分别为“k=5,n=0”,所以程序第一次进入循环时,执行default语句,这时k=4,执行"case4:”这个分支,结果是“n=2,k=3”,打印出2;程序然后进行第二次循环,这时“n=2,k=3”,执行"case3:”这个分支,结果是“n=3,k=2”,打印出3;程序进行第三次循环,这时“n=3,k=2”,执行“case2:case4:”这两个分支,结果是“n=5,k=1”,打印出5,这时因为n=5不满足n<5的循环条件,因此退出循环,程序运行结束。因此输出结果是235。



24.有以下程序

main()

{inti,j;

for(i=1;i<4;i++)

{

for(j=i;j<4;j++)

printf("%d%d=%d",i,j,ij);

printf("\n");

}

}

程序运行后的输出结果是()

A)11=112=213=321=222=431=3

B)11=112=213=322=423=633=9

C)11=112=222=413=323=633=9

D)11=121=222=431=332=633=9



B

[解析]本题主要考查了for循环的嵌套。外层for循环的自变量i从1开始,每次循环后增l,至到i等于3结束。内层循环的自变量j每次从i开始,每次循环后增1,至到j等于3结束。在每次外循环开始后,内层循环在一行上先打印“ij=两个乘数的积”,然后换行,下次循环从下一行开始打印。



25.以下合法的字符型常量是()

A)''\x13''B)''\081''C)''65''D)"\n"



A

[解析]C语言的字符常量是用单引号(即撇号)括起来的一个字符。除此之外,在C语言中还允许用以一个“\”开头的字符序列来表示字符常量。其中,形式“\ddd”表示1到3位8进制数所代表的字符;形式“\xhh”表示1到2位16进制数所代表的字符。在本题中‘\x13’表示回车符,是一个字符常量;‘\081’用8进制数所代表的字符,但形式不正确,因为8进制数所表示的字符中不会出现数字“8”;‘65’不是一个字符,而是一个+进制数字;“\n”是用双引号括起来的一个字符,表示一个字符串,而不是字符常量。



26.在C语言中,函数返回值的类型最终取决于()

A)函数定义时在函数首部所说明的函数类型

B)return语句中表达式值的类型

C)调用函数时主调函数所传递的实参类型

D)函数定义时形参的类型



A

[解析]在C语言中,应当在定义函数时指定函数值的类型,凡不加类型说明的函数,一律自动按整型处理。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中的表达式类型不一致,则以函数类型为主。即函数类型决定返回值的类型。



27.已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是()

A)c=(c-''A'')%26+''a''B)c=c+32C)c=c-''A''+''a''D)c=(''A''+c)%26-''a''



D

[解析]C语言中,字符数据参加运算时,实际上是其ASCII码参与计算。大写字母的ASCII码比其对应的小写字母的ASCII码小31。因此要将大写字母转化为小写字母只需将其加上32即可。所以选项B)、C)都符合条件,因为变量C中存储的是大写字母,所以“c-''A''”的值一定小于26,故选项A)与选项C)的含义相同。故本题答案为D)。



28.有以下函数

intfun(chars)

{chart=s;

while(t++);

return(t-s);

}

该函数的功能是

A)比较两个字符串的大小

B)计算s所指字符串占用内存字节的个数

C)计算s所指字符串的长度

D)将s所指字符串复制到字符串t中



B

[解析]循环语句while(t++);执行完时,指针变量t就指向了字符中结束符‘\o’之后的位置,所以语句return(t-s);返回的就是字符串s所用内存的字节个数。



29.设已有定义:floatx;,则以下对指针变量p进行定义且赋初值的语句中正确的是()

A)floatp=1024;B)intp=(float)x;C)floatp=&x;D)floatp=&x;



D

[解析]指针变量只能存储地址,选项A)错误。只有浮点型指针才能指向浮点型数据,选项B)错误。在定义指针变量时必须加上星号“”,选项C)错误。故本题答案为D)。



30.有以下程序

#include

main()

{intn,p=NULL;

p=&n;

printf("Inputn:");

scanf("%d",&p);

printf("outputn:");

printf("%d\n",p);

}

该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是()

A)intn,p=NULL;B)p=&n;C)scanf("%d",&p)D)printf("%d\n",p);



A

[解析]指针变量在定义时需要加星号,而在赋值时则不用,故选项B)错误。本题中,scanf()函数和printf()函数都是要对指针变量p指向的地址处的数据进行访问,不是变量本身。选项C)中多了取地址运算符,选项D)中少了指针运算符。



31.以下程序中函数f的功能是:当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。

voidf(intb[],intn,intflag)

{inti,j,t;

for(i=0;i
for(j=i+1;j
if(flag?b[i]>b[j]:b[i]
{t=b[i];b[i]=b[j];b[j]=t;}

}

main()

{inta[10]={5,4,3,2,1,6,7,8,9,10},i;

f(&a[2],5,0);

f(a,5,1);

for(i=0;i<10;i++)

printf("%d,",a[i]);

}

程序运行后的输出结果是()

A)1,2,3,4,5,6,7,8,9,10,

B)3,4,5,6,7,2,1,8,9,10,

C)5,4,3,2,1,6,7,8,9,10,

D)10,9,8,7,6,5,4,3,2,1,



B

[解析]在main()中,“f(&a[2],5,0);”语句的功能是对数组a[10]中从a[2]到a[6]的数宇(即3,2,1,6,7)进行从大到小排序,这时数组a[10]中的数字序列变为{5,4,7,6,3,2,1,8,9,10}。“f(a,5,1);”语句的功能是对数字序列{5,4,7,6,3,2,1,8,9,10}中的5,4,7,6,3进行从小到大的排序,所以数组a[10]中的数字序列最终变为{3,4,5,6,7,2,1,8,9,10}。



32.有以下程序

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

[解析]在main()中,f(a)语句的作用是对数组a[10]中从a[2]到a[5]的各个数字乘以2,所以数组a[10]中的数字就变成了{1,2,6,8,10,12,7,8,9,10},最后在屏幕上输出。



33.有以下程序

typedefstruct{intb,p;}A;

voidf(Ac)/注意:c是结构变量名/

{intj;

c.b+=1;

c.p+=2;

}

main()

{inti;

Aa={1,2};

f(a);

printf("%d,%d\n",a.b,a.p);

}

程序运行后的输出结果是()

A)2,3B)2,4C)1,4D)1,2



D

[解析]本题考查的是函数调用时的数据传递问题。因为在调用函数f()时只是进行的值传递,即单向传递,函数的调用及对形参的处理过程并不会引起实参数值的变化。故本题答案为D)。



34.有以下程序

main()

{inta[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}},i,j,k,t;

for(i=0;<4:i++)

for(j=0;j<3;j++)

for(k=j+1;k<4;k++)

if(a[j][i]>a[k][i]

{t=a[j][i];a[j][i]=a[k][i]=a[k][i]=t;}/按列排序/

for(i=0;i<4;i++)printf("%d,",a[i][i]);

}

程序运行后的输出结果是()

A)1,6,5,7,B)8,7,3,1,



C)4,7,5,2,D)1,6,2,1,



A

[解析]本题利用多重for循环的嵌套来实现对二维数组元素的按列排序。利用最外层循环来实现对列的控制。内部循环利用选择法对数组元素按照从小到大的顺序进行排列。最后输出对角线上的元素值。故本题答案为A)。



35.有以下程序

main()

{inta[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}},i,k,t;

for(i=0;i<3;i++)

for(k=i+1;k<4;k++)

if(a[i][i]
{t=a[i][i];a[i][i]=a[k][k];a[k][k]=t;}

for(i=0;i<4;i++)

printf("%d,",a[0][i]);

}

程序运行后的输出结果是()

A)6,2,1,1,B)6,4,3,2,

C)1,1,2,6,D)2,3,4,6,



B

[解析]本题使用选择法对二维数组对角线上的元素按从大到小的顺序进行排列。最后输出数组第一行的数据。故本题答案为B)。



36.有以下程序

voidf(intq)

{inti=0;

for(;i<5;i++)

(q)++;

}

main()

{inta[5]={1,2,3,4,5},i;

f(a);

for(i=0;i<5;i++)

printf("%d,",a[i]);

}

程序运行后的输出结果是

A)2,2,3,4,5,B)6,2,3,4,5,

C)1,2,3,4,5,D)2,3,4,5,6,



B

[解析]调用函数f()时,将数组a的地址传递给了指针q,此时q指向的就是数组a的第一个元素a[0]。在5次循环过程中,q始终指向a[0],因此a[0]的值增加了5。最后的输出结果为“6,2,3,4,5”。



37.有以下程序

#include

main()

{charp[20]={''a'',''b'',''c'',''d''},q[]="abc",r[]="abcde";

strcpy(p+strlen(q),r);

strcat(p,q);

printf("%d%d\n",sizeof(p),strlen(p));

}

程序运行后的输出结果是()

A)209B)99C)2011D)1111



C

[解析]函数strlen()返回的是数组的实际长度,而sizeof返回的是数组定义的总长度。因为字符数组p[20]定义为20字节长度,所以sizeof(p)的值为20。“strcpy(p+strlen(q),r);”语句的功能把字符数组r拷贝到字符数组p从p[3]开始到p[7]的位置中,这时字符数组p的有效字符长度为8。然后再执行"strcat(p,q);”语句(字符串连接),即把字符数组q连接到字符数组p后面,这时字符数组p的有效长度为11。



38.有以下程序

#include

main()

{charp[20]={''a'',''b'',''c'',''d''},q[]="abc",r[]="abcde";

strcat(p,r);

strcpy(p+strlen(q),q);

printf("%d\n",strlen(p));

}

程序运行后的输出结果是()

A)9B)6C)11D)7



B

[解析]strcpy()函数的功能是将字符串q复制到从p[3]位置开始的存储单元,同时复制字符串结束标志‘\0’到p[6]中。函数strlen()返回的是字符串中不包括‘\0’在内的实际长度,故本题答案为B)。



39.有以下程序

#include

voidf(charp[][10],intn)/字符串从小到大排序/

{chart[10];inti,j;

for(i=0;i
for(j=i+1;j
if(strcmp(p[i],p[j])>0)

{strcpy(t,p[i]);

strcpy(p[i],p[j]);

strcpy(p[j],t);

}

}

main()

{charp[5][10]={"abc","aabdfg:,"abbd","dcdbe","cd"};

f(p,5);

printf("%d\n",strlen(p[0]));

}

程序运行后的输出结果是()

A)2B)4C)6D)3



C

[解析]本题中函数f()利用选择法对字符串数组p中的字符中按从小到大排序,字符串比较的方法是:依次对S1和S2所指字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符(ASCII码值)决定所在串的大小,因此最后在p[0]中存储的是最小的字符串是“aabdfg”。最后用strlen()函数求得该字符串的长度为6。



40.有以下程序

voidf(intn,intr)

{intr1=0;

if(n%3==0)r1=n/3;

elseif(n%5==0)r1=n/5;

elsef(--n,&r1);

r=r1;

}

main()

{intm=7,r;

f(m,&r);

printf("%d",r);

}

程序运行后的输出结果是()

A)2B)1C)3D)0



A

[解析]本题考查了函数的递归调用。在f函数中,当m=7时,程序执行“f(--n,&r1);”语句,递归调用f(6,&r1),程序执行“r1=n/3;”语句,即r1=6/3=2,然后执行“r=r1;”语句,所以输出结果为2。



41.有以下程序

main(intargc,charargv[])

{intn=0,i;

for(i=1;i
n=n10+argv[i]-''0'';

printf("%d\n",n);

}

编译连接后生成可执行文件tt.exe。若运行时输入以下命令行tt12345678。程序运行后的输出结果是()

A)12B)12345C)12345678D)136



D

[解析]运行时输入该命令后,参数argc的值为4,字符串数组argv[1]、argv[2]、argv[3]分别为“12”、“345”、“678”,然后取这3个参数的第一个字符,将其转化成原来的数字并组合成一个新的三位数。



42.有以下程序

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)24B)28C)32D)36



B

[解析]本题考查的是变量的作用域问题。程序中定义了多个变量a,全局变量、静态变量和局部变量分别在自己的作用域中参与运算。在main()函数中首先执行“s+=f(0);”语句,而f(0)返回值为12,所以第一次循环结束s的值等于4+12=16;第二次开始时,当执行f(1)时,在f(1)中执行“if(n%2){inta=6;t+=a++;}”和“returnt+a++;”这两条语句,所以f(1)的返回值等于12。再在主函数中执行“s+=f(1);”语句,也就是16+12=28。



43.有一个名为init.txt的文件,内容如下:

#defineHDY(A,B)A/B

#definePRINT(Y)printf("y=%d\n",Y)

有以下程序

#include"init.txt"

main()

{inta=1,b=2,c=3,d=4,k;

k=HDY(a+c,b+d);

PRINT(k);

}

下面针对该程序的叙述正确的是()

A)编译出错B)运行出错C)运行结果为y=0D)运行结果为y=6



D

[解析]本题考查的是带参数的宏定义。不仅要进行简单的字符替换,还要进行参数替换。根据宏替换的规则,本题在进行替换宏HDY时,没有像所希望的那样将HDY(a+c,b+d)替换成(a+c)/(b+d),而是替换成了“a+c/b+d”,因此结果k为6。



44.有以下程序

main()

{

charch[]="uvwxyz",pc;

pc=ch;

printf("%c\n",(pc+5));

}

程序运行后的输出结果是()

A)zB)0C)元素ch[5]的地址D)字符y的地址



A

[解析]将字符串的地址赋值给字符指针变量后,指针就指向了该字符串的第一个字符,即“p=''u''”,所以(p+5)指向的字符是‘z’。



45.有以下程序

structS{intn;inta[20];};

voidf(structSp)

{inti,j,t;

for(i=0;in-1;i++)

for(j=i+1;jn;j++)

if(p->a[i]>p->a[j])

{t=p->a[i];p->a[i]=p->a[j];p->a[j]=t;}

}

main()

{inti;

structSs={10,{2,3,l,6,8,7,5,4,10,9}};

f(&s);

for(i=0;i
printf("%d,",s.a[i]);

}

程序运行后的输出结果是()

A)1,2,3,4,5,6,7,8,9,10,

B)10,9,8,7,6,5,4,3,2,1,

C)2,3,1,6,8,7,5,4,10,9,

D)10,9,8,7,6,1,2,3,4,5,



A

[解析]本题中,在调用函数f()时,实参是结构体变量s的地址,所以在函数中对形参的改变会影响到实参的数值。函数f()实现的功能是把结构体的成员数组中的值按从小到大顺序进行排列。



46.有以下程序

structS{intn;inta[20];};

voidf(inta,intn)

{inti;

for(i=0;i
}

main()

{inti;

structSs={10,{2,3,1,6,8,7,5,4,10,9}};

f(s.a,s.n);

for(i=0;i
printf("%d,",s.a[i]);

}

程序运行后的输出结果是()

A)2,4,3,9,12,12,11,11,18,9,

B)3,4,2,7,9,8,6,5,11,10,

C)2,3,1,6,8,7,5,4,10,9,

D)1,2,3,6,8,7,5,4,10,9,



A

[解析]本题中,在调用函数时将结构体变量的两个成员作为实参,其中的成员数组a实际向函数f()传递的是该数组的地址,因此在函数f()中所对应的形参发生改变时,该数组内的数据也会发生改变。函数f()实现的功能是将成员数组中的前9个元素分别加上该元素的下标,作为新的元素。



47.有以下程序段

typedefstructnode{intdata;structnodenext;}NODE;

NODEp;

以下叙述中正确的是()

A)p是指向structnode结构变量的指针的指针

B)NODEp;语句出错

C)p是指向structnode结构变量的指针

D)p是structnode结构变量



C

[解析]在C语言中,typedef用于说明一种新的类型名,本题中的node被定义为一种结构体类型名,NODE被定义为指向这种结构体变量的指针,我们可以用它来定义一个指向该类型结构体变量的指针。



48.有以下程序

main()

{

unsignedchara=2,b=4,c=5,d;

d=a|b;

d&=c;

printf("%d\n",d);

}

程序运行后的输出结果是()

A)3B)4C)5D)6



B

[解析]本题考查的内容是按位与和按位或运算符的使用,由运算规则可知,d的最终结果为4。



49.有以下程序

#include

main()

{FILEfp;

intk,n,a[6]={1,2,3,4,5,6};

fp=fopen("d2.dat","w");

fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);

fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);

fclose(fp);

fp=fopen("d2.daf","r");

fscanf(fp,"%d%d",&k,&n);

printf("%d%d\n",k,n);

fclose(fp);

}

程序运行后的输出结果是()

A)12B)14C)1234D)123456



D

[解析]将有6个元素的整型数组分两行输出到一个文件中,因为输出的都是数字并且每行都没有分隔符,所以当再对其进行读取操作时,每一行都会被认为是一个完整的数,而换行符则作为它们的分隔符。故本题答案为D)。



50.有以下程序

#include

main()

{FILEfp;

inti,a[6]={1,2,3,4,5,6};

fp=fopen("d3.dat","w+b");

fwrite(a.sizeof(int),6,fp);

fseek(fp,sizeof(int)3,SEEK_SET);

/该语句使读文件的位置指针从文件头向后移动3个int型数据/

fread(a,sizeof(int),3,fp);

fclose(fp);

for(i=0;i<6;i++)

printf("%d,",a[i]);

}

程序运行后的输出结果是()

A)4,5,6,4,5,6,B)1,2,3,4,5,6,

C)4,5,6,1,2,3,D)6,5,4,3,2,1,



A

[解析]首先利用fwrite函数将数组a中的数据写到文件中,接着fseek函数的功能是读文件的位置,指针从文件头向后移动3个int型数据,这时文件位置指针指向的是文件中的第4个int数据“4”。然后fread函数将文件fp中的后3个数据4,5,6读到数组a中,这样就覆盖了数组中原来的前3项数据。最后数组中的数据就成了{4,5,6,4,5,6},故本题答案为A)。





二、填空题

请将每一个空的正确答案写在【1】至【20】序号的横线上。

(1-5,软件技术基础填空题)

1.在深度为7的满二叉树中,度为2的结点个数为【1】。



63

[解析]根据二叉树的性质,一棵深度为k的满二叉树有2k-1个结点,所以深度为7的满二叉树有27-1=127个节点;又因为在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1,即所以总节点数为n0+n2=2n2+1=127,所以n2=63,即度为2的结点个数为63,所以[1]应填入63。



2.软件测试分为白箱(盒)测试和黑箱(盒)测试。等价类划分法属于【2】测试。



黑箱或黑盒

[解析]黑箱测试是根据程序规格说明所规定的功能来设计测试用例,它不考虑程序的内部结构和处理过程。常用的黑箱测试技术分为等价类划分、边界分析、错误猜测以及因果图等。



3.在数据库系统中,实现各种数据管理功能的核心软件称为【3】。



数据库管理系统(DBMS)

[解析]数据库管理系统(DatabaseManagementSystem)简称DBMS,对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。它是数据库系统的核心软件。



4.软件生命周期可分为多个阶段,一般分为定义阶段、开发阶段和维护阶段。编码和测试属于【4】阶段。



开发

[解析]软件生命周期(SDLC,软件生存周期)是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,其中的编码和测试属于开发阶段。



5.在结构化分析使用的数据流图(DFD)中,利用【5】对其中的图形元素进行确切解释。



数据字典

[解析]数据字典(DataDictionary,简称DD)就是用来定义数据流图中的各个成分的具体含义。数据字典的任务是对于数据流图中出现的所有被命名的图形元素在数据字典中作为—个词条加以定义,使得每一个图形元素的名字都有一个确切的解释。



6.执行以下程序后的输出结果是【6】。

main()

{inta=10;

a=(35,a+4);printf("a=%d\n",a);

}





a=14

[解析]本题考查的是的表达式的优先级问题。先计算表达式35=15,再计算a+4=14,将数据14赋值给a,根据printf()函数内的输出格式控制串,最后的输出结果应为“a=14”。



7.当执行以下程序时,输入1234567890<回车>,则其中while循环体将执行【7】次。

#include

main()

{charch;

while((ch=getchar())==''0'')prinft("#");

}





0

[解析]通过getchar()函数来取得从键盘输入的数据,再判断其是否是字符‘0’,如果是,则执行一次循环,因为从键盘输入的1234567890都是整型数,不是字符.所以while循环执行的条件始终不成立,循环体执行的次数为0。



8.以下程序的运行结果是【8】。

intk=0;

voidfun(intm)

{m+=k;

k+=m;

printf("m=%dk=%d",m,k++);

}

main()

{inti=4;

fun(i++);

printf("i=%dk=%d\n",i,k);

}



m=4k=4i=5k=5

[解析]由于在main()函数中,变量i=4,所以就调用fun(4)则输出“m=4k=4”。然后变量k增1等于5,变量i增1等于5,所以main()函数的“printf("i=%dk=%d\n",i,k);”语句输出“i=5k=5”。



9.以下程序的运行结果是【9】。

main()

{inta=2,b=7,c=5;

switch(a>0)

{case1:switch(b<0)

{case1:printf("@");break;

case2:printf("!");break;

}

case0:switch(c==5)

{case0:printf("");break;

case1:printf("#");break;

case2:printf("$");break;

}

default:printf("&");

}

printf("\n");

}



#&

[解析]表达式“c==5”的值为真,所以表达式的值等于1,因此输出符号“#”。然后执行“bleak”,继而去执行“default:printf("&");”语句,输出符号“&”。



10.以下程序的输出结果是【10】。

#include

main()

{printf("%d\n",strlen("IBM\n012\1\\"));}



9

[解析]本题的字符串中共有9个字符,它们分别是''1'',''B'',''M'',''\n'',''0'',''1'',''2'',''\1'',''\\'',其中“\n”表示换行,“\\”表示反斜杠字符“\”。所以本题的最后输出结果为9。



11.已定义charch=''$'';inti=1,j;,执行j!=ch&&i++以后,i的值为【11】。



1

[解析]在执行逻辑表达式“j=!ch&&i++”时,首先判断j=!ch的值,因为“ch=''$''”不为0,所以“j=!ch=0”,

编译系统便不再计算表达式“i++”的值,i的值不变,仍为1。



12.以下程序的输出结果是【12】。

#include

main()

{chara[]={''\1'',''\2'',''\3'',''\4'',''\0''};

printf("%d%d\n",sizeof(a),strlen(a));

}





54

[解析]字符串处理函数strlen()返回的是字符数组的实际长度,不包括字符申结束标志‘\0’。而sizeof运算符则计算的是字符数组的总长度,包括串末尾的结束标志。



13.设有定义语句:inta[][3]={{0},{1}{2}};,则数组元素a[1][2]的值是【13】。



0

[解析]本题考查的是二维数组初始化问题。题中对数组的a[0][0],a[1][0],a[2][0]3个元素分别赋值为0,1,2,其余的元素都自动赋0。所以a[1][2]的值为0。



14.以下程序的功能是:求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。请填空。

main()

{intx[10],a[9],i;

for(i=0;i<10;i++)scanf("%d",&x[i]);

for(【14】;i<10;i++)

a[i-1]=x[i]+【15】;

for(i=0;i<9;i++)printf("%d",a[i]);

printf("");

}





[14]i=1[15]x[i-1]

[解析]对于10个数,相临的两个数相加取和,总共要进行9次加法运算。所以空14处应填入i=1。相临的两个数相加取和,放在数组a中,x[0]与x[1)的和存放在a[0]中。所以空15处应填入x[i-1]。



15.以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上。请填空。

main()

{intx,y,z,max,px,py,pz,pmax;

scanf("%d%d%d",&x,&y,&z);

px=&x;py=&y;pz=&z;pmax=&max;

【16】;

if(pmax
if(pmax
printf("max=%d\n",max);

}



pmax=px

[解析]首先将变量x的值放到max中,然后依次和变量y、z进行比较。若有比max大的数,将该数存放到max中,这样最后在max中的值就是x、y、z中的最大值。



16.以下程序的输出结果是【17】。

intfun(intx,intn)

{if(n==0)

returnx[0];

else

returnx[0]+fun(x+1,n-1);

}

main()

{inta[]={1,2,3,4,5,6,7};

printf("%d\n",fun(a,3));

}



10

[解析]本题考查的是函数的递归调用。在调用一个函数的过程中又直接或间接的调用该函数本身。第一次调用时,指针x指向的是a[0],n的值为3,每调用一次n自减l,x加1,指向数组a中的下一个元素,当n为0时函数开始返回,最后的返回值等于a[0]+a[1]+a[2]+a[3]=10。



17.以下程序的输出结果是【18】。

#include

main()

{chars1,s2,m;

s1=s2=(char)malloc(sizeof(char));

s1=15;

s2=20;

m=s1+s2;

printf("%d\n",m);

}





40

[解析]本题中指针s1和s2都指向同一个内存中的地址。因此语句“s2=20;”执行后,s1=s2=20。所以m最后的值为40。



18.设有说明

structDATE{intyear;intmonth;intday;};

请写出一条定义语句,该语句定义d为上述结构体类型变量,并同时为其成员year、month、day依次赋初值2006、10、1:【19】。



structDATEd={2006,10,1};

[解析]本题考查结构体变量初始化的问题。正确的语句应为“structDATEd={2006,10,1};”。



19.设有定义:FILEfw;,请将以下打开文件的语句补充完整,以便可以向文本文件readme.txt的最后续写内容。

fw=fopen("readme.txt",【20】);



"a"

[解析]本题考查的是文件的打开方式。要向文本文件的末尾续写内容,需要使用方式“a”(追加)打开文件。





献花(0)
+1
(本文系发哥哦哦首藏)