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

第26次(已经修改)



一、选择题

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

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

1.软件是指()

A)程序B)程序和文档

C)算法加数据结构D)程序、数据与相关文档的完整集合



D

[解析]本题考查软件的定义。软件是计算机系统中与硬件相互依存得另一部分,它包括程序、相关数据及其说明文档得总和。因此,本题得正确答案是选项D。



2.软件调试的目的是()

A)发现错误B)改正错误C)改善软件的性能D)验证软件的正确性



B

[解析]本题考查软件工程调试。调试与测试是两个不同的过程,有着根本的区别:调试是一个随机的、不可重复的过程,它用于隔离和确认问题发生的原因,然后修改软件来纠正问题;测试是一个有计划的,可以重复的过程,它的目的是为了发现软件中的问题。因此,软件调试的目的是为了改正软什中的错误。本题的正确答案是选项B。



3.在面向对象方法中,实现信息隐蔽是依靠()

A)对象的继承B)对象的多态C)对象的封装D)对象的分类



C

[解析]通常认为,面向对象方法具有封装性、继承性、多态性几大特点。就是这几大特点,为软件开发提供了一种新的方法学。

封装性:所谓封装就是将相关的信息、操作与处理融合在一个内含的部件中(对象中)。简单地说,封装就是隐藏信息。这是面向对象方法的中心,也是面向对象程序设计的基础。

继承性:子类具有派生它的类的全部属性(数据)和方法,而根据某一类建立的对象也都具有该类的全部,这就是继承性。继承性自动在类勺子类间共享功能与数据,当某个类作了某项修改,其子类会自动改变,子类会继承其父类所有特性与行为模式。继承有利于提高软件开发效率,容易达到一致性。

多态性:多态性就是多种形式。不同的对象在接收到相同的消息时,采用不同的动作。例如,一个应用程序包括许多对象,这些对象也许具有同一类犁的工作,但是却以不同的做法来实现。不必为每个对象的过程取一过程名,造成复杂化,可以使过程名复用。同一类型的工作有相同的过程名,这种技术称为多态性。

经过上述分析可知,在面向对象方法中,实现信息隐蔽是依靠对象的封装。正确答案是选项C。



4.下列叙述中,不符合良好程序设计风格要求的是()

A)程序的效率第一,清晰第二B)程序的可读性好

C)程序中要有必要的注释。D)输入数据前要有提示信息



A

[解析]本题考查软件工程的程序设计风格。软件在编码阶段,力求程序语句简单、直接,不能只为了追求效率而使语句复杂化。除非对效率有特殊的要求,程序编写要做到清晰第一、效率第二。

人们在软件生存期要经常阅读程序,特别是在软什测试和维护阶段,编写程序的人和参与测试、维护的人都要阅读程序,因此要求程序的可读性要好。

正确的注释能够帮助读者理解程序,可为后续阶段进行测试和维护提供明确的指导。所以注释不是可有可无的,而是必须的,它对于理解程序具有重要的作用。I/0信息是与用户的使用直接相关的,因此它的格式应当尽可能方便用户的使用。在以交互式进行输入/输出时,要在屏幕上使用提示符明确提示输入的请求,指明可使用选项的种类和取值范围。

经过上述分析可知,选项A是不符合良好程序设计风格要求的。



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

A)程序执行的效率与数据的存储结构密切相关

B)程序执行的效率只取决于程序的控制结构

C)程序执行的效率只取决于所处理的数据量

D)以上三种说法都不对



A

[解析]本题考查程序效率。程序效率是指程序运行速度和程序占用的存储空间。影响程序效率的因素是多方面的,包括程序的设计、使用的算法、数据的存储结构等。在确定数据逻辑结构的基础上,选择一种合适的存储结构,可以使得数据操作所花费的时间少,占用的存储空间少,即提高程序的效率。因此,本题选项A的说法是正确的。



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

A)数据的逻辑结构与存储结构必定是一一对应的

B)由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构

C)程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构

D)以上三种说法都不对



D

[解析]本题考查数据结构的基本知识。

数据之间的相互关系称为逻辑结构。通常分为四类基本逻辑结构,即集合、线性结构、树型结构、图状结构或网状结构。存储结构是逻辑结构在存储器中的映象,它包含数据元素的映象和关系的映象。存储结构在计算机中有两种,即顺序存储结构和链式存储结构。顺序存储结构是把数据元素存储在一块连续地址空间的内存中:链式存储结构是使用指针把相互直接关联的节点链接起来。因此,这两种存储结构都是线性的。可见,逻辑结构和存储结构不是一一对应的。因此,选项A和选项B的说法都是错误的。

无论数据的逻辑结构是线性的还是非线性的,只能选择顺序存储结构或链式存储结构来实现存储。程序设计语言中,数组是内存中一段连续的地址空间,可看作是顺序存储结构。可以用数组来实现树型逻辑结构的存储,比如二叉树。因此,选项C的说法是错误的。



7.冒泡排序在最坏情况下的比较次数是()

A)n(n+1)/2B)nlog2nC)n(n-1)/2D)n/2



C

[解析]冒泡排序的基本思想是:将相邻的两个元素进行比较,如果反序,则交换:对于一个待排序的序列,经一趟排序后,最大值的元素移动到最后的位置,其他值较大的元素也向最终位置移动,此过程称为一趟冒泡。对于有n个数据的序列,共需n-1趟排序,第i趟对从1到n-i个数据进行比较、交换。冒泡排序的最坏情况是待排序序列逆序,第1趟比较n-1次,第2趟比较n-2次,依此类推,最后一趟比较1次,一共进行n-1趟排序。因此,冒泡排序在最坏情况下的比较次数是(n-1)+(n-2)+…+1,结果为n(n-1)/2。本题的正确答案是选项C。



8.一棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为()A)219B)221C)229D)231



A

[解析]本题考查数据结构中二叉树的性质。二叉树满足如下一条性质,即:对任意一棵二叉树,若终端结点(即叶子结点)数为n0,而其度数为2的结点数为n2,则n0=n2+1。

根据这条性质可知,若二叉树中有70个叶子结点,则其度为2的结点数为70-1,即69个。二叉树的总结点数是度为2、度为1和叶子结点的总和,因此,题目中的二叉树总结点数为69+80+70,即219。因此,本题的正确答案是选项A。



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

A)数据库系统是一个独立的系统,不需要操作系统的支持

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

C)数据库管理系统就是数据库系统

D)以上三种说法都不对



B

[解析]本题考查数据库系统的基本概念和知识。

数据库系统除了数据库管理软件之外,还心须有其他相关软件的支持。这些软件包括操作系统、编译系统、应用软件开发工具等。对于大型的多用户数据库系统和网络数据库系统,还需要多用户系统软件和网络系统软件的支持。因此,选项A的说法是错误的。

数据库可以看成是长期存储在计算机内的、大量的、有结构的和可共享的数据集合。因此,数据库具有为各种用户所共享的特点。不同的用户可以使用同一个数据库,可以取出它们所需要的子集,而且容许子集任意重叠。数据库的根本目标是要解决数据的共享问题。因此,选项B的说法是正确的。

通常将引入数据库技术的计算机系统称为数据库系统。一个数据库系统通常由五个部分组成,包括相关计算机的硬件、数据库集合、数据库管理系统、相关软件和人员。

因此,选项C的说法是错误的。

因此,本题的正确答案是选项B。



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

A)为了建立一个关系,首先要构造数据的逻辑关系

B)表示关系的二维表中各元组的每一个分量还可以分成若干数据项

C)一个关系的属性名表称为关系模式

D)一个关系可以包括多个二维表



C

[解析]题考查数据库的关系模犁。关系模型的数据结构是一个“二维表”,每个二维表可称为一个关系,每个关系有一个关系名。表中的一行称为一个元组:表中的列称为属性,每一列有一个属性名。表中的每一个元组是属性值的集合,属性是关系二维表中最小的单位,它不能再被划分。关系模式是指一个关系的属性名表,即二维表的表框架。因此,选项C的说法是正确的。

(1-10基础单向选择题)

1.C语言源程序名的后缀是()

A).exeB).CC).objD).cp



B

[解析]本题考查的知识点是:C语言的基本概念。

C浯言源程序的后缀为.c;经过编译得到的目标程序文件的后缀为.obj:再将目标程序文件链接后得到可执行文件的后缀为.exe。故本题应该选择B。



2.可在C程序中用作用户标识符的一组标识符是()

A)and_2007B)Datey-m-dC)HiDf.TomD)caseBig1



A

[解析]本题考查的知识点是:标识符。

用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符。C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。另外,标识符不能是C语言关键字。选项B中,y-m-d用了“-”所以不是标识符;选项C,Dr.Tom用了“.”也不是标识符;选项D中,case是C语言关键字,所以不能用作标识符。故本题应该选择A。



3.以下选项中,合法的—组C语言数值常量是()

A)028.5e-3-OxfB)120Xa234.5e0

C)1774e1.50abcD)0x8A10,0003.e5



B

[解析]本题考查的知识点是:数值常量。

数值常量分为整型和实型两类。其中,整型有—卜进制、八进制和十六进制三种表示法;实型有小数形式和指数形式两种表示法。十进制和书面使用的数据表示一样;八进制是以数字0开头,后面跟由0~7组成的八进制数组成:十六进制是以0x(或OX)开头,后面跟由0~9与A~F(或a~f)组成的十六进制数组成:小数形式由数字和小数点组成,其整数部分或小数部分如果为0可省略,但不能同时省略。指数形式由小数形式或十进制形式开头,后面跟e(或E),再跟一个十进制整数组成。选项A中,028是八进制形式,但后面跟的8不在0~7之内,所以非法;选项C中,4e1.5是指数形式,但e后面所跟的不是整数,所以非法;选项D中,10,000中不能有“,”,所以非法。故本题应该选择B。



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

A)C语言程序将从源程序中第一个函数开始执行

B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束

D)main可作为用户标识符,用以命名任意一个函数作为主函数



C

[解析]本题考查的知识点是:C语言的基本概念。

C语言程序将从主函数main()开始执行,故选项A不正确;主函数必须是main(),故选项B不正确;主函数的返回类型必须为int或void,形参可以没有也可以为int,char[]。所以不是任意函数都能作为主函数,故选项D不正确。本题应该选择C。



5.若在定义语句:inta,b,c,p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是()

A)scanf("%d",a,b,c);B)scanf("%d%d%d",a,b,c);

C)scanf("%d",p);D)scanf("%d",&p);



C

[解析]本题考查的知识点是:标准输入函数scanf()。

scanf()函数要求,除了第1个参数为格式化字符串以外,其余参数均为相应变量的地址值。本题中,只有p是地址值,故应该选择C。



6.以下关于long、int和short类型数据占用内存大小的叙述中正确的是()

A)均占4个字节

B)根据数据的大小来决定所占内存的字节数

C)由用户自己定义

D)由C语言编译系统决定



D

[解析]在C语言的标准中,short占2个字节、long占4个字节,但int的大小和编译系统相关。例如在TurboC2.0中,int占2个字节,但在VisualC++6.0(VC6可以用做C语言编译器)中占4个字节。故本题应该选择D。



7.若变量均已正确定义并赋值,以下合法的C语言赋值语句是()

A)x=y==5;B)x=n%2.5;C)x+n=i;D)x=5=4+1;



A

[解析]本题考查的知识点是:赋值语句、“%”运算符。

赋值语句由两个运算分量和一个赋值运算符组成。赋值运算符包括“二”、“+=”、“=”……等。其中,赋值运算符左侧的运算分量称为左值,右侧的叫右值。任何合法表达式都可用做右值,但临时值、常量不能用做左值。“%”运算符的作用是求模,意思是做除法求余,这就要求两个运算分量均为整数。选项B中,2.5不是整数,故非法:选项C中,表达式x+n计算后得到的是一临时值,临时值不能做左值,故非法;选项D中,由于“=”运算符的结合性是“从右到左”,故先计算5=4+1,5是常量不能做左值,故选项D也非法。选项A,y=5是一个逻辑表达式,其值为真或假,可以用做右值,所以是合法的。故本题应该选择A。



8.有以下程序段

intj;

floaty;

charname[50];

scanf("%2d%f%s",&j,&y,name);

当执行上述程序段,从键盘上输入555667777abc后,y的值为()

A)55566.0B)566.0C)7777.0D)566777.0



B

[解析]本题考查的知识点是:输入格式化控制串。

本题scanf()函数的格式化控制串中,"%2d"表示输入一个2位的整数:"%f"表示输入一个浮点数;"%s"表示输入一个字符串。因此,从键盘上输入"555667777abc"后,前两位"55"被当作2位整数输入给j;"566"被当作浮点数输入给y;跳过空格后,剩下的字符串"7777abc"全部输入给name;故本题应该选择B。



9.若变量已正确定义,有以下程序段

i=0;

do

printf("%d,",i);

while(i++);

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

其输出结果是()

A)0,0B)0,1C)1,1D)程序进入无限循环



B

[解析]本题考查的知识点是:do…while循环。

do...while循环会首先执行循环体1遍,然后再判断while后的逻辑表达式是否为真来决定是否进行下一次循环。所以,do...while循环的循环体至少会被执行1遍。本题中,首先令i为0,然后进入do...while循环,执行1遍循环体输出i的值0。然后,因为表达式i++的值为0(执行后i的值被增1),所以do...while循环结束,接下来再输出i的值1。故本题应该选择B。



10.有以下计算公式若程序前面已在命令行中包含math.h文件,不能够正确计算上述公式的程序段是()

A)if(x>=0y=sqrt(x);elsey=sqrt(-x);

B)y=sqrt(x)if(x<0)y=sqrt(-x);

C)if(x>=0)y=sqrt(x);if(x<0)y=sqrt(-x);

D)y=sqrt(x>=0?x:-x);



B

[解析]本题考查的知识点是:sqrt()函数。sqrt()函数的作用是计算,要求输出的参数x必须大于等于0。选项B一开始就调用了sqrt(x)而没有判断x的正负,所以是错误的。故应该选B。



11.设有条件表达式:(EXP)?i++:j--,则以下表达式中与(E)(P)完全等价的是()

A)(EXP==0)B)(EXP!=0)C)(EXP=-1)D)(EXP!=1)



B

[解析]本题考查的知识点是:逻辑表达式。

在C语言中,逻辑表达式的结果只有两种情况“tree”和“false”。如果要把一个逻辑值看成一个整数的话,true等于1;false等于0。如果要把一个整数看成一个逻辑值的话,非0等于true:0等于false。由此可见,如果EXP表达式的结果为0的话;(EXP)为假:(EXP==0)为真;(EXP!=O)为假;(EXP==1)为假;(EXP!=1)为真。如果EXP表达式的结果为非0的话:(EXP)为真:(EXP=0)为假;(EXP!=0)为真;(EXP=1)结果不定;(EXP!=1)结果不定。综上所述,只有(EXP!=0)完全等价于表达式(EXP)。故应该选择B。



12.有以下程序

#include

main()

{

inty=9;

for(;y>0;y--)

if(y%3==0)printf("%d",--y);

}

程序的运行结果是()

A)741B)963C)852D)875421



C

[解析]本题考查的知识点是:for循环、%运算符。

本题首先令y为9,然后通过一个for循环,当y还大于0则循环,每次循环让y递减1。循环体中是一条if语句,通过%运算符计算每当y能被3整除的时候,输出--y的值,即先将y减1,然后输出y的值。故当y等于9、6、3时会输出,输出值分别为8、5、2。所以应该选择C。



13.已有定义:charc;,程序前面已在命令行中包含ctype.h文件。不能用于判断c中的字符是否为大写字母的表达式是()

A)isupper(c)B)''A''<=c<=''Z''

C)''A''<=c&&c<=''Z''D)c<=(''z''-32)&&(''a''-32)<=c



B

[解析]本题考查的知识点是:大写字母的判断。

大写字母从''A''~''Z''的ASCII码是连续的,所以如果当一个字符大于等于''A''31小于等于''Z''时,那这个字符就一定是一个大写字母,故选项C正确。C语言中的库函数isupper()的作用也正是判断一个字符是否为大写字母的,故选项A正确。在ASCII码中,小写字母的编码也是连续的,对应的小写字符比大写字符的ASCII码值大32,所以选项D经过小写字符-32后,换算成了对应的大写字母''z''和''A'',所得到结果和选项C是一致的,故也是正确的。选项B中,C语言的逻辑表达式不能直接连写,而应该写成选项C那样,故是错误的,应该选择B。



14.有以下程序

#include

main()

{

inti,j,m=55;

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

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

m=m%j;

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

}

程序的运行结果是()

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



B

[解析]本题考查的知识点是;for循环的嵌套、%运算符。本题程序中,关键部分是一个for循环的嵌套。外循环将执行3遍,循环变量i的值依次为1~3。内循环每次将从3循环递增到外循环变量i的值。所以,前两次循环i的值都小于3,故内循环没有被执行,第3次,内循环将执行1次,执行时i等于3。%运算符的作用是整除求余,55除以3等于18余1,所以整个循环结束后,m的值为1。故应该选择B。



15.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是()

A)函数的实参和其对应的形参共占同一存储单元

B)形参只是形式上的存在,不占用具体存储单元

C)同名的实参和形参占同一存储单元

D)函数的形参和实参分别占用不同的存储单元



D

[解析]本题考查的知识点是:函数的形参和实参。

在定义函数时函数名后面括弧中的变量名称为“形式参数”(简称形参),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称实参)。C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。故本题应该选择D。



16.已知字符''A''的ASCII代码值是65,字符变量c1的值是''A'',c2的值是''D''。执行语句printf("%d,%d",c1,c2-2);后,输出结果是()

A)A,BB)A,68C)65,66D)65,68



C

[解析]本题考查的知识点是:字符变量。

字符变量其实就是整型变量。只不过它只占1个字节,所以表示范围是-128~127。它所储存的值为它所代表字符的ASCII码值。“己知字符,A,的ASCII代码值是65,字符变量c1的值是''A''”这句话告诉我们,c1中存储的值就是65;c2的值为''D'',但在输出时减了2,所以输出的值为''B'',也就是66。故本题应该选择C。



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

A)改变函数形参的值,不会改变对应实参的值

B)函数可以返回地址值

C)可以给指针变量赋一个整数作为地址值

D)当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL



C

[解析]本题考查的知识点是:函数、指针。

在C语言中,指针变量是不能直接赋给一个整数作为地址值的。因此选项C是错误的。其余选项的说法正确。故应该选择C。



18.以下正确的字符串常量是()

A)"\\\"B)''abc''C)OlympicGamesD)""



D

[解析]本题考查的知识点是:字符串常量。

在C语言中,字符串常量是以双引号括起来的字符序列。故选项B和C不正确。字符序列中可包含一些转义字符,转义字符都是以“\”开头的。选项A中包含了三个“\”,前两个(\\)代表了—个”\”字符,后面一个和“"”一起(\")被看作一个“"”,所以该字符串缺少一个结束的“"”,故不正确。选项D的两个“"”之间没有任何字符,代表的是一个空串,是合法的字符串常量,故应该选择D。



19.设有定义:charp[]={''1'',''2'',''3''},q=p;,以下不能计算出一个char型数据所占字节数的表达式是()

A)sizeof(p)B)sizeof(char)C)sizeof(q)D)sizeof(p[0])



A

[解析]本题考查的知识点是:sizeof()运算符。

sizeof()运算符的作用是计算一个变量所占的内存字节数。选项A传入的是数组名p,数组p由3个字符大小,所以占3个字节。故不能计算出一个char型数据所占字符数。而选项B、C、D传入的都是字符元素或字符类型名char,这些都能计算出一个char型数据所占字符数。故本题应该选择A。



20.有以下函数

intaaa(chars)

{chart=s;

while(t++);

t--;

return(t-s);

}

以下关于aaa函数的功能的叙述正确的是()

A)求字符串s的长度B)比较两个串的大小

C)将串s复制到串tD)求字符串s所占字节数



A

[解析]本题考查的知识点是:while循环的简单应用。

aaa()函数中,首先定义了一个字符指针t指向形参s,然后通过一个while循环让指针t不断递增,直到t指向字符串结束标志处。当t指向结束标志处时,由于后缀++运算符的原因,它还会被再递增1,所以接卜来的t--;语句让它回到结束标志处。最后返回t-s,因此s还是指向字符串第1个字符处,而t指向了字符串结尾,故返回值为字符串的长度值。



21.若有定义语句:inta[3][6];,按在内存中的存放顺序,a数组的第10个元素是()

A)a[0][4]B)a[1][3]C)a[0][3]D)a[1][4]



B

[解析]本题考查的知识点是:二维数组在内存中的存放顺序。

二维数组的元素在内存中是按行列顺序连续存放的。以本题的二维数组a[3][6]为例,它的元素在内存中的存放顺序是:a[0][0]、a[0][1]、a[0][2]…a[0][5]、a[1][0]、a[1][1]…a[1][5]、a[2][0]…a[2][5]。由此可见,第10个元素就是第2行第4个元素,即a[1][3]。故应该选择B。



22.有以下程序

#include

voidfun(charp)

{++p;

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

}

main()

{chara[]={"Moming","Afternoon","Evening","Night"};

fun(a);

}

程序的运行结果是()

A)AfternoonB)fternoonC)MorningD)orning



A

[解析]本题考查的知识点是;指针数组和二级指针。

本题主函数中定义了一个指针数组a,可以将它看成一个以字符指针为元素的一维数组。和—般的一维数组名能赋给同类型指针变量一样,该字符指针数组也可以赋给指向字符指针的指针(即字符型二级指针),所以数组名a可以用作函数fun()的实参。

在fun()函数中,++p操作使形参p往后移动一个字符指针的位置,即指针a[1]的位置。故最后通过printf()函数输出的字符串为"Afternoon",应该选择A。



23.若有定义语句:inta[2][3],p[3],则以下语句中正确的是()

A)p=a;B)p[0]=a;C)p[0]=&a[1][2];D)p[1]=&a;



C

[解析]本题考查的知识点是:二维数组和指针数组。

无论一个数组有多少维或者是甭含指针类型,该数组最终都可以被看作一个比较特殊的一维数组。例如本题中的inta[2][3]可以看作元素为int[3](即包含3个int型元素的一维数组),包含2个这样元素的一维数组;而intp[3]则可以看作元素为int,包含3个这样元素的一维数组。选项A中,p为数组名,其值是不能被改变的,故非法:选项B中,p[0]的类型是int,而a是二维数组名(类犁为int[][3]),两者无法赋值,故非法;选项C中,p[0]为int型指针,&a[1][2]是int型变量的地址,可以合法赋值;选项D中,p[1]是血型指针,而&a是二维数组的地址(类型为int()[2][3]),两者无法赋值,故非法。所以本题应该选择C。



24.有以下程序

#include

voidfun(inta,intn)/fun函数的功能是将a所指数组元素从大到小排序/

{intt,i,j;

for(i=0;i
for0=i+l;j
if(a[i]
{t=a[i];a[i]=a[j];a[j]=t;}

}

main()

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

fun(c+4,6);

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

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

printf("\n");

}

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

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



D

[解析]本题考查的知识点是:for循环的简单应用。

题目中fun()函数的作用是排序,从形参指针a所指位置开始,对其后n个int型元素进行从大到小排序。主函数中,调用fun()函数传入的两个实参分别为c+4和6,即从数组c的第5个元素开始,对其后连续的6个元素进行从大到小排序。所以,最后通过for循环输出数组c的值为“1,2,3,4,9,8,7,6,5,0,”,故应该选择D。



25.有以下程序

#include

intfun(chars[])

{intn=O;

while(s<=''9''&&s>=''0'')

{n=10n+s-''0'';s++;}

return(n);

}

main()

{chars[10]={''6'',''1'','''',''4'','''',''9'','''',''0'',''''};

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

}

A)9B)61490C)61D)5



C

[解析]本题考查的知识点是:while循环的简单应用。

题目fun()函数中while循环的意思是:判断s所指内容是否为数字字符,如果是数字字符,则计算表达式11=10n+s-''0'';。其中。s-''0''的作用是将相应的数字字符转换为数值,例如字符''8''减去字符''0''后,得到的结果就是数值8了。n=10n+的作用是将累计变量n中原来内容乘以10,然后再加上刚转换的数字字符的数值,例如原来n的值为1,s现在的内容为''2'',那么执行了n=10n+s-''0,;语句后,n的值变为12,如果接下来再来一个''8''字符,执行n=10n+s-''0'';语句后,n的值就是128了。故不难看出fun()函数的作用是“将数字字符串转换为相应的十进制数值,碰到非数字字符时结束”。从主函数中定义的字符数组s的初始化内容可以看出,fun()函数返回值应该是61。故应该选择C。



26.当用户要求输入的字符串中含有空格时,应使用的输入函数是()

A)scanf()B)getchar()C)gets()D)getc()

C

[解析]本题考查的知识点是:输入函数。

C语言提供了许多输入函数,其中有:getchar(输入字符)、scanf(格式输入)和gets(输入字符串)等。题目要求输入的是字符串,所以可以排除getchar,而且要求输入的字符串中包含空格,而scanf函数默认将输入的空格字符作为分割符,所以空格不会被输入,故可排除scanf。getc的作用是从文件中输入一个字符,故也不可取。gets函数可以输入一整行作为一个字符串,其中也包括空格字符,故应该选择C。



27.以下关于字符串的叙述中正确的是()

A)C语言中有字符串类型的常量和变量

B)两个字符串中的字符个数相同时才能进行字符串大小的比较

C)可以用关系运算符对字符串的大小进行比较

D)空串一定比空格打头的字符串小



D

[解析]本题考查的知识点是:字符串。

C语言中只有字符串常量而没有字符串变量,故选项A不正确:字符串比较大小是以第1个不相同字符的大小为标准的,跟长度没有关系,故选项B不正确;字符串比较大小除了使用库函数strcn3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。因为字符串在表达式中相当于constchar,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。所以选项C也不正确。空串的长度为0,而以空格打头的字符串的长度至少为1,故选项D正确,本题应该选择D。



28.有以下程序

#include

voidfun(chart,chars)

{

while(t!=0)t++;

while((t++=s++)!=0);

}

main()

{charss[10]="acc",aa[10]="bbxxyy";

fun(ss,aa);

printff"%s,%s\n",ss,aa);

}

程序的运行结果是()

A)accxyy,bbxxyyB)acc,bbxxyyC)accxxyy,bbxxyyD)accbbxxyy,bbxxyy



D

[解析]本题考查的知识点是:while循环的简单应用。函数fun()中,前一个while循环的作用是:如果形参指针t所指内容不为0,则让t增1,直到它指向0。后一个while循环的作用是:将s所指内容赋给t所指地址,然后两者同时增1,直到赋给t的内容为0。由此可见,函数fun()的作用就是将形参s所指字符串连接到形参t所指字符串末尾,相当于库函数中的strcat()。主函数中使用fun()将数组aa中的字符串连接到了数组ss中原有字符串之后,所以执行完后,ss中的字符串为"accbbxxyy"。故最终输出的结果是:accbbxxyy,bbxxyy,应该选择D。



29.有以下程序

#include

#include

voidfun(chars[][10],intn)

{chart;

intij;

for(i=0;i
for0--i+l;j
if(s[i][0]>s[j][0])

{t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}

}

main()

{charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};

fun(ss,5);

printf("%s,%s\n",ss[0],ss[4]);

}

程序的运行结果是()

A)xy,aaaaccB)aaaacc,xyC)xcc,aabccD)acc,xabcc



D

[解析]本题考查的知识点是:for循环的简单应用,选择排序算法。在函数fun()中有一个两层嵌套的for循环,外循环变量i从0递增到n-2,内循环变量i从i+1循环递增到n-1,这是选择排序算法的标准结构。循环体中因为逆序条件为“s[i][0]>s[j][0]”,所以实现的是升序排序。由此可见,fun()函数实现的功能是对一个二维字符数组前n行的首字符进行升序排序。主函数中定义的二维数组初始化为{"bcc",”bbcc","xy","aaaacc","aabcc"},通过fun()函数的排序后,结果将为acc","abcc","by","baaacc","xabcc"}。故最终输出字符串ss[0]和ss[4]的结果为acc,xabcc,应该选择D。



30.在一个C源程序文件中所定义的全局变量,其作用域为()

A)所在文件的全部范围

B)所在程序的全部范围

C)所在函数的全部范围

D)由具体定义位置和extern说明来决定范围



D

[解析]本题考查的知识点是:全局变量的作用域。全局变量的有效范围是从定义变量的位置开始到本源文件结束。如果需要在其他源文件中使用该全局变量,则可以在其他源文件中使用extern关键字来声明该全局变量,这样该全局变量的作用域就被扩展到以extern声明了该全局变量的位置开始到此源文件结束。故本题的正确答案为D。



31.有以下程序

#include

inta=1;

intf(intc)

{staticinta=2;

c=c+1;

return(a++)+c;

}

main()

{inti,k=0;

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

{inta=3;

k+=f(a);

}

k+=a;

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

}

A)14B)15C)16D)17



A

[解析]本题考查的知识点是:静态局部变量。静态局部变量的作用域跟一般局部变量相同,都是从声明处开始到声明所在函数或语句块结束为止。但静态局部变量的生存周期却是从第1次执行到该静态局部变量的声明语句时起,直到程序结束。而—般局部变量的生存周期到离开它的作用域时就结束了。本题的f()函数中staticinta=2;语句就声明了一个静态局部变量a,并初始化为2。主函数中,通过一个for循环连着调用了2次f()函数。两次调用形参c都为3,f()函数中让c增1变为4,然后输出(a++)+c,第1次调用a为2,所以输出结果为3+4=6,而第2次调用a被上次调用时的++运算符增1,所以为3,输出结果为3+4=7。所以主函数for循环结束后,k的值是13,下面一条k+=a;语句中的a是全局变量a,值为1。故最终输出结果是14,应该选择A。



32.有以下程序()

#include

voidfun(intn,intp)

{intf1,t2;

if(n==1||n==2)p=1;

else

{

fun(n-1,&f1);

fun(n-2,&f2);

p=f1+f2;

}

}

main()

{ints;

fun(3,&s);

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

}

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



A

[解析]本题考查的知识点是:函数的递归调用。在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。本题中的fun()函数直接调用了自身,所以它是一个递归函数。fun()函数中,当形参n为1或2时,让形参p所指内容为1。从这里可以看出形参p的用途是输出一个整数,所以我们不妨记作fun(1)=1、fun(2)=1。如果是其他情况,那么输出结果p的内容为f(n)=f(n-1)+f(n-2)。由此可见,fun()函数的作用是求斐波纳契数列第n项的值(斐波纳契数列第1和2项的值为1,以后各项分别为前两项之和:1、1、2、3、5、8、13……)。主函数中通过fun()函数,求第3项值;所以输出结果为2,故应该选择A。



33.若程序中有宏定义行:#defineN100则以下叙述中正确的是()

A)宏定义行中定义了标识符N的值为整数100

B)在编译程序对C源程序进行预处理时用100替换标识符N

C)对C源程序进行编译时用100替换标识符N

D)在运行时用100替换标识符N





B

[解析]本题考查的知识点是:宏定义。宏定义是预处理命令,即在C源程序进行编译之前,编译程序对源程序进行编译预处理时所进行的一种替换操作。所以选项C和D可以排除。宏定义是用宏名代替一个字符串,也就是作简单的置换,不做正确性检查。所以选项A的叙述也不正确,宏替换时100被当作一个字符串来替换宏名的,而不是被看作整数值100。故本题的正确答案为B。



34.以下关于typedef的叙述错误的是()

A)用typedef可以增加新类型

B)typedef只是将已存在的类型用一个新的名字来代表

C)用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名

D)用typedef为类型说明一个新名,通常可以增加程序的可读性

A

[解析]本题考查的知识点是:typedef关键字。typedef关键字是用来给已有的类型起—个新的名字,以增加程序的可读性的。所以,通过typedef是不可能增加新的类型的,故应该选择A。



35.有以下程序

#include

structtt

{

intx;

structtty;

}p;

structtta[4]={20,a+1,15,a+2,30,a+3,17,a};

main()

{inti;

p=a;

for(i=1;i<-2;i++)

{

printf("%d,",p->x);

p=p->y;

}

}

A)20,30,B)30,17C)15,30,D)20,15,



D

[解析]本题考查的知识点是:结构体数组。题目中定义了一个全局结构体数组a,结构体中包含两个成员:一个int型变量x和一个自身类型指针y。所以,结构体数组a的初始化列表中每两个初始化一个结构体元素。主函数通过一个for循环,连续调用了两次输出函数printf(),每次输出p所指元素的x成员值。p初始化时指向数组a的首地址,即a[0]的位置,所以第1次输出的值为20。然后又将a[0]的成员y的值赋给p,y在初始化时是a+1,所以p在第2次输出时指向的元素是a[1],故第2次输出的值为15。所以本题最终输出结果是“20,15,”,应该选择D。



36.有以下程序

#include

#include

typedefstruct

{

charname[9];

charsex;

floatscore[2];

}STU;

STUf(STUa)

{

STUb={"Zhao",''m'',85.0,90.0};

inti;

strcpy(a.name,b.name);

a.sex=b.sex;

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

a.score[i]=b.score[i];

returna;

}

main()

{

STUc={"Qian",T,95.0,92.0},d;

d=f(c);

printf("%s,%c,%2.0f,%2.0f\n",d.name,&sex,&score[O],d.score[1]);

}

程序的运行结果是()

A)Qian,f,95,92B)Qian,m,85,90C)Zhao,m,85,90D)Zhao,f,95,92



C

[解析]本题考查的知识点是:结构体。本题的f()函数中,首先定义了一个STU结构体变量b并初始化为{"Zhao",''m'',85.0,90.0},然后分别通过strcpy()库函数、赋值语句和for循环,将b中所有成员分别赋给形参a的相应成员,最后返回a。所以,无论传递给函数fun()的参数是什么,结果返回的都会是函数中定义的STU结构体b的内容{"Zhao",''m'',85.0,90.0}。故最终输出结果为:Zhao,m,85,90,应该选择C。



37.设有以下定义

uniondata

{intd1;

floatd2;

}demo;

则下面叙述中错误的是()

A)变量demo与成员d2所占的内存字节数相同

B)变量demo中各成员的地址相同

C)变量demo和各成员的地址相同

D)若给demo.d1赋99后,demo.d2中的值是99.0



D

[解析]本题考查的知识点是:联合体。联合体的所有成员共占同一段内存,所以联合体变量的长度与它的最长成员所占长度…致,本题中float所占内存字节数为4,而int类型在TurboC2.0中是占2字节、在VisualC++6.0中占4字节,所以int类型所占内存字节数不会超过float,那demo就与成员d2所占字节数是相同的,选项A的说法正确。联合体的所有成员的首地址都是相同的,和联合体变量的地址一致。故选项B和C都是正确的。由于int类型数据和float类型数据在内存中的存放格式是不一样的,所以给d1赋99后,d2中不会得到99.0这个值。故选项D不正确,答案应该选择D。



38.有以下程序

#include

main()

{

inta=1,b=2,c=3,x;

x=(a^b)&c;

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

}

程序的运行结果是()

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



D

[解析]本题考查的知识点是:位运算。在C语言中,整型数据在内存中是按二进制形式存放的,位运算就是直接对这些二进制进行操作的一系列运算符。例如题目中a、b、c的值分别为1、2、3,那它们在内存中存放的样子就是:0001、0010、0011(由于数据不大,int类型本来要占4字节也就是32位二进制的,这里就省写为4位了)。

“^”运算符的作用是:按位异或。意思是:两个操作数对应的二进制位如果相异,则结果对应的二进制位为1,否则结果对应二进制位为0。所以0001^0010=0011。“&”运算符的作用是:位与。意思是:如果两个操作数对应的二进制位同时为1,则结果对应的二进制位为1,否则结果对应二进制位为0。所以0011&0011=0011,也就是十进制的3,故本题最终输出结果为3,应该选择D。



39.读取二进制文件的函数调用形式为:fread(buffer,size,count,fp);,其中buffer代表的是()

A)一个文件指针,指向待读取的文件

B)一个整型变量,代表待读取的数据的字节数

C)一个内存块的首地址,代表读入数据存放的地址

D)—个内存块的字节数



C

[解析]本题考查的知识点是:fread()函数。

fread()函数的原型是:

intfread(charpt,unsignedsize,unsignedn,FILEfp);

功能是:从中所指定的文件中读取长度为size的n个数据项,存到pt所指向的内存区。因此本题中的buffer是一个内存块的首地址,代表读入数据存放的地址。故应该选择C。



40.有以下程序

#include

main()

{

FILEfp;

inta[10]={1,2,3,0,0},i;

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

fwrite(a,sizeof(int),5,fp);

fwrite(a,sizeof(int),5,fp);

fclose(fp);

fp=fopenCd2.dat","rb");

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

fclose(fp);

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

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

}

A)1,2,3,0,0,0,0,0,0,0,B)1,2,3,1,2,3,0,0,0,0,

C)123,0,0,0,0,123,0,0,0,0,D)1,2,3,0,0,1,2,3,0,0,



D

[解析]本题考查的知识点是:文件的操作。本题首先定义了…个文件指针fp,然后通过fopen()函数打开一个名为"d2.dat"的文件,参数"wb"的意思是:为写入打开的二进制文件。然后通过fwrite()函数,将数组a的前5个元素2次写入d2.dat文件中,接下来用fclose()函数关闭此文件。然后又使用fopen()函数打开d2.dat文件,参数"rb"的意思是:为读入打开的二进制文件。接下来通过fread()函数从文件中读入10个int型数据到数组a中。然后又使用fclose()函数再次关闭此文件。最后通过for循环,输出数组a的所有10个元素。不难得知,现在a中的元素已经变为{1,2,3,0,0,1,2,3,0,0},故最终输出结果为1,2,3,0,0,1,2,3,0,0,0,。应该选择D。



二、填空题

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

1.软件需求规格说明书应具有完整性、无歧义性、正确性、可验证性、可修改性等特性,其中最重要的是【】。



正确性

[解析]本题考查软件工程中需求规格说明书的评审。衡量需求规格说明书好坏的标准按重要性次序排列为:正确性、无歧义性、完全性、可验证性、一致性、可理解性、可修改性和可追踪性。因此,划线处应填入“正确性”。



2.在两种基本测试方法中,【】测试的原则之一是保证所测模块中每一个独立路径至少要执行一次。



白盒或白箱或白盒子或WhiteBox(这个答案,问哈王磊,系统中如何处理的?)

[解析]本题考查软件工程的测试。测试一般有两种方法:黑盒测试和白盒测试。黑盒测试不考虑程序的内部逻辑结构和处理过程,只着眼于程序的外部特性。用黑盒测试来发现程序中的错误,必须用所有可能的输入数据来检查程序能否都能产生正确的输出。白盒测试是在了解程序内部结构和处理过程的基础上,对程序的所有路径进行测试,检查路径是否都能按预定要求正确工作。因此,划线处应填入“白盒(箱)”或“WhiteBox”。



3.线性表的存储结构主要分为顺序存储结构和链式存储结构。队列是一种特殊的线性表,循环队列是队列的【】存储结构。



顺序

[解析]本题考查数据结构的队列。队列是一种特殊的线性表,即限定在表的一端进行删除,在表的另一端进行插入操作的线性表。允许删除的一端叫做队头,允许插入的一端叫做队尾。线性表的存储结构主要分为顺序存储结构和链式存储结构。当队列用链式存储结构实现时,就称为链队列;当队列用顺序存储结构实现时,就称为循环表。因此,本题划线处应填入“顺序”。



4.对下列二叉树进行中序遍历的结果为【】。







ACBDFEHGP

[解析]本题考查数据结构中二叉树的遍历。根据对二叉树根的访问先后顺序不同,分别称为前序遍历、中序遍历和后序遍历。这三种遍历都是递归定义的,即在其子树中也按照同样的规律进行遍历。下面就是中序遍历方法的递归定义。当二叉树的根不为空时,依次执行如下3个操作:

(1)按中序遍历左子树。

(2)访问根结点。

(3)按中序遍历右子树。

根据如上前序遍历规则,来遍历本题中的二叉树。首先遍历F的左子树,同样按中序遍历。先遍历C的左子树,即结点A,然后访问C,接着访问C的右子树,同样按中序遍历C的右子树,先访问结点B,然后访问结点D,因为结点D没有右子树,因此遍历完C的右子树,以上就遍历完根结点F的左子树。然后访问根结点F,接下来遍历F的右子树,同样按中序遍历。首先访问E的左子树,E的左子树为空,则访问结点E,然后访问结点E的右子树,同样按中序遍历。首先访问G的左子树,即H,然后访问结点G,最后访问G的右子树P。以上就把整个二叉树遍历一遍,中序遍历的结果为ACBDFEHGP。因此,划线处应填入“ACBDFEHGP”。



5.在E-R图中,矩形表示【】。



实体或实体集或Entity(这个答案,问哈王磊,系统中如何处理的?)

[解析]本题考查数据库的E-R图。E-R模型中,有三个基本的抽象概念:实体、联系和属性。E-R图是E-R模型的图形表示法,在E-R图中,用矩形框表示实体,菱形框表示联系,椭圆形框表示属性。因此,划线处应填入“实体”或“实体集”或“Entity”。

(6-16,C综合填空题)

6.执行以下程序时输入1234567,则输出结果是【】。

#include

main()

{inta=1,b;

scanf("%2d%2d",&a,&b);prinff("%d%dhn",a,b);

}



1234

[解析]本题考查的知识点是:Scanf()函数。scanf()是标准输入函数;其第1个参数为格式控制字符串。其中“%2d”表示读入一个2个字符宽的整数。所以本题代码将连续读入2个2字符宽的整数分别存到变量a和b中。根据题目要求,输入数据1234567,则scanf()读入的两个整数分别为12和34,故输出结果为1234。





7.以下程序的功能是:输出a、b、c三个变量中的最小值。

#include

main()

{inta,b,c,t1,t2;

scanf("%d%d%d",&a,&b,&c);

t1=a
t2=c
printf("%d\n",t2);

}





a:b

[解析]本题考查的知识点是:条件表达式。

条什表达式类似于if语句,根据“?”前面子表达式的逻辑值来判断应该计算“:”前面的子表达式还是后面的作为整个条件表达式的结果。题目要求输出a、b、c三个变量中的最小值,所以当a


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

#include

main()

{intn=12345,d;

while(n!=0){

d=n%10;

printf("%d",d);

n/=10;

}

}



54321

[解析]本题考查的知识点是:%运算和/运算。%运算要求两个运算分量均为整数,该运算计算两个整数相除得到的余数,该操作也叫做求模。所以,在while循环中,d=n%10;语句每次求得的结果是n个位上的数值,例如12345÷10所得的余数就是个位上的5。接下来输出得到的个位数字d,然后执行n/=10;语句,该语句等价于n=n/10;。在C语言中,如果/运算的两个运算分量都是整数,那所得的结果也截尾取整,所以12345/10=1234,即n=n/10;语句的作用是让n截去个位上的数字。由此可知,随着while循环的继续,n依次为12345、1234、123、12、1,而每次输出n的个位数字将为5、4、3、2、1。故本题应填54321。



9.有以下程序段,且变量已正确定义和赋值

for(s=1.0,k=1;k<=n;k++)s=s+1.0/(k(k+1));

printf("s=%f\n\n",s);

请填空,使下面程序段的功能与之完全相同

s=1.0;k=1;

while(【】<=n){s=s+1.0/(k(k+1));【】;}

prinff("s=%f\n''n",s);





kk++

[解析]本题考查的知识点是:while语句和for语句。

while语句和for语句的作用都是循环控制语句的执行,两者之间是可以互相转换的。将while(EXP)转换为for语句可以写成for(;EXP;);将for(EXP1;EXP2;EXP3)转换为while语句可以写成:EXP1;while(EXP2){…EXP3;}。故本题的两个空分别应填写for语句的第2和第3个表达式。即k<=n或n>=k和k++。当然也可写成与之等价的其他形式。



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

#include

main()

{inti;

for(i=''a'';i<''f'';i++,i++)printf("%c",i-''a''+''A'');

printf("\n");

}





ACE

[解析]本题考查的知识点是:大小写字母转换。

题目中for循环的循环变量i从字符''a''变到字符''e'',但由于每次循环后都连续执行了两次i++,所以for循环将执行3次,循环变量i的值依次为''a''、''c''、''e''。循环体中是—条输出语句,按字符输出表达式i-''a''+''A''。因为大小写字母的ASCII码是连续的,例如''b''/1=''c''、''W''=1=''V'',而且小写字母的ASCII码比大写字母的大。所以;同一个字母的大小写字符之差是—个固定值。由此可见,将一个字符从小写转换为大写,只需将其减去这个固定值,而将大写转为小写可以加上这个固定值。固定值可以通过任一字符的小写减去大写来得到。所以本题的i-''a''+''A''=i-(''a''-''A''),即让i减去了此固定值,从而使整个表达式的值为i所代表的小写字母的大写形式。故本题的输出结果是ACE。



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

#include

#include

charfun(chart)

{charp=t;

return(p+strlen(t)/2);

}

main()

{charstr="abcdefgh";

str=fun(str);

puts(str);

}

efgh

[解析]本题考查的知识点是:字符指针。

题目中的fun()函数,通过strlen()库函数得到形参t所指字符串的长度。然后返回t所指字符串首地址值加上该长度值的一半。所以fun()函数的作用就是返回所给字符串的中间位置。故最后通过puts()输出的字符串为"efgh"。



12.以下程序中函数f的功能是在数组x的n个数(假定n个数互不相同)中找出最大最小数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。请填空。

#include

voidf(intx[],intn)

{intp0,p1,i,j,t,m;

i=j=x[0];

p0=p1=0;

for(m=0;m
{

if(x[m]>i)

{i=x[m];p0=m;}

elseif(x[m]
{j=x[m];p1=m;}

}

t=x[p0];x[p0]=x[n-1];x[n-1]=t;

t=x[p1];x[p1]=【14】;

【15】=t;

}

main()

{inta[10],u;

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

f(a,10);

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

printf("\n");

}



x[0]x[0]

[解析]本题考查的知识点是:交换算法。

交换两个变量的值,一般通过一个临时变量,首先将一个待交换变量的值存入临时变量,然后将另一个待交换变量的值存入前一个待交换变量中,然后将临时变量值存入后一个待交换变量中。这样,两个变量的交换就完成了。根据题意,f()函数要“将其中最小的数与第一个数对换,把最大的数与最后一个数对换”,而填空处的上一行语句正是使用交换算法,将下标为p0的元素与数组x的最后一个元素(n个元素的数组,其最后一个元素的下标为n-1)交换。所以不难得知,填空所在行的语句是要将下标为p1的元素与数组x的第1个元素交换。故两个空都应该填x[0]。



13.以下程序统计从终端输入的字符中大写字母的个数,num[0]中统计字母A的个数,num[1]中统计字母B的个数,其他依次类推。用#号结束输入,请填空。

#include

#include

main()

{intnum[26]={0},i;charc;

while((【】)!=''#'')

if(isupper(c))hum[c-''A'']+=【】;

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

printf("%c:%d\n",i+''A'',num[i]);



(16)c=getchar()(17)1

[解析]本题考查的知识点是:字符的输入和统计算法。

根据题意,程序需要不断接收从终端输入的字符,如果碰到''#''字符则结束。前一空后面正好是判断是否为''#''字符,而后面的汀语句却判断c是否为大写字母,故不难得知该处应填的表达式必须将一个字符从终端输入到变量c中,且整个表达式的值为刚输入的字符。所以应填c=getchar()。接下来的if语句首先通过库函数isupper()判断c是否为大写字母,是的话将num[c-''A'']加上一个值。根据题意,我们需要将字母A的个数统计到num[0]中、字母B的个数统计到num[1]中、……假设c中现在是字母A的话,那c-''A‘正好等于0,也就是说,只要在后一空处填入1,那就实现了当c为A时nam[0]增1的题目要求了。而且,这样的话其他字符也同样能被统计到num数组的相应元素中去。故后一空应填1。



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

#include

main()

{inti,n[4]={1};

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

{n[i]=n[i-1]2+1;

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

}

}



3715

[解析]本题考查的知识点是:for循环。本题主函数中的for循环从1递增到3,所以将循环3次。循环体中,n[i]=n[i-1]2+1;语句使数组n从第2个元素开始,后一个元素等于前一个元素的2倍加1;print("%d",n[i]);输出刚计算出的数组n的元素。故结果应该是12+1=3、32+1:7、72+1=15。即输出结果为3715。



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

#include

#defineM5

#defineNM+M

main0

{intk;

k=NN5;

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

}



55

[解析]本题考查的知识点是:宏替换。宏替换不是函数调用,所以不能因为M被定义为5,而N被定义为M+M而武断地认为N的值就是5+5=10。宏替换就是简单的字符串替换,以本题为例;因为N被定义为M+M,所以k=NN5;语句展开后为k=M+MM+M5;。又因为M被定义为5,所以再展开后为K=5+55+55;。现在不难计算出,这个表达式的结果为k=55。故最终输出结果是55。



16.函数min()的功能是:在带头结点的单链表中查找数据域中值最小的结点。请填空

#include

structnode

{intdata;

structnodenext;

};

intmin(structnodefirst)/指针first为链表头指针/

{structnodep;intm;

p=first->next;

m=p->data;

p=p->next;

for(;p!=NULL;p=【】)

if(p->datadata;

returnm;

}



p->next

[解析]本题考查的知识点是:链表的筛选。题目要求筛选出链表中最小的值,所以需要先定义一个临时变量,并将第1个值赋给该变量,就好像本题程序中定义的变量m。然后遍历整个链表,拿链表中的每一个值跟m比较,如果找到比m小的值,就让m等于该值,这样遍历结束后,m中就是该链表的最小值了。题目中的空位于for循环的第3个表达式处,这里的for循环就是用来遍历整个链表的,所以该表达式需要完成的任务是:将循环变量p指向当前结点的下一个结点。故不难得知应填p->next。





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