二级C语言题目答案

更新时间:2023-12-21 07:24:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、选择题(每小题1分,共40分)

1下列有关内联函数的叙述中,正确的是( )。 A.内联函数在调用时发生控制转移 B.内联函数必须通过关键字inline来定义 C.内联函数是通过编译器来实现的

D.内联函数函数体的最后一条语句必须是return语句 参考答案:C

参考解析:一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,所以在调用时不发生控制转移。在类内部实现的函数都是内联函数,可以不用inline定义;只有函数外部定义的内联函数才必须加关键字inline。编译系统并非对内联函数必须使用内联,而且根据具体情况决定。内联函数不是必须要有返回值的。

2语句int*P=&k;定义了指针P,与这个语句等效的语句序列是( )。 A.int* p;P=&k;B.int * P;P=k;C.int * p;* P=&k;D.int * p;* P=k; 参考答案:A

参考解析:本题考查指针和地址,题目中定义了一个指向变量k的一个指针p,那么与题目中等效的表达式A选项,即先定义一个指向整型的指针,然后指向k的地址。 3有如下程序: #include

using namespace std; class A { public:

A(){cout<<”A”;} -A(){cout<<”-A”;} };

class B:public A { A*P; public:

B(){cout<<”B”;P=new A();} -B(){cout<<”~B”;delete p;} }; int main() { B obj; return 0; }

执行这个程序的输出结果是( )。

A.BAA~A~B~AB.ABA~B~A~AC.BAA~B~A~AD.ABA~A~B~A 参考答案:B

参考解析:本题考查派生类的构造函数和析构函数,在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数。对象释放时,先执行派生类的析构函数,再执行基类的析构函数。所以本题答案为B。 4有如下类定义:

class AA { im a: public:

int getRef()const{return&a;}//① int getValue()const{return a;}//② void set(int n)const{a=n;}//③ friend void show(AA aA.const{cout< };

其中四个函数的定义中正确的是( )。 A.①B.②C.③D.④ 参考答案:B

参考解析:本题考查常成员函数,常成员函数只能引用本类中的数据成员,而不能修改它。所以本题答案为B。

5若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。 A.Data+(DatA.;B.Data

operator+(DatA.;C.Data+operator(DatA.;D.operator+(Data,DatA.; 参考答案:B

参考解析:根据重载加法运算符的格式,只有B选项正确。 6有如下数组声明:int num[10];,下标值引用错误的是( )。 A.num[10]B.num[5]C.num[3]D.hum[o] 参考答案:A

参考解析:数组定义中的数字指的是数组的大小,而下标是从0开始的,所以本题中数组的最后一个元素是num[9]。

7将前缀运算符“--”重载为非成员函数,下列原型中能正确用于类中说明的是( )。 A.DeCr&operator--(int);B.DeCr operator--(DeCr&,int);C.friend DeCr&operator--(DeCr&);D.friend DeCr operator--(DeCr&,int); 参考答案:C

参考解析:把“--”运算符重载为非成员(友元)函数格式:friend<返回类型>operator--()是前缀的格式;friend<返回类型>operator--(int)是后缀的格式。当然也可以有参数如题中C选项所示。

8如果派生类以proteCted方式继承基类,则原基类的proteCted成员和publiC成员在派生类中的访问属性分别是( )。

A.publiC和publiCB.publiC和proteCtedC.proteCted和publiCD.proteCted和proteCted 参考答案:D

参考解析:本题考查保护继承中派生类对基类的访问属性,在受保护继承中,基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有,所以本题答案为D。 9在函数中,可以用aut0、extem、register和static这四个关键字中的一个来说明变量的存储类型,如果不说明存储类型,则默认的存储类型是( )。 A.autoB.externC.registerD.static 参考答案:A

参考解析:变量的存储方法分为静态存储和动态存储两大类,包含4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extem)。变量如果没有说明存储类型,那么默认就是aut0。

10下列程序的输出结果是( )。 #include

int rain(iltl a,int B) { if(a

else retum b; retum 0; }

void main() { eout< }

A.0B.1C.2D.3 参考答案:B

参考解析:本题考查的是函数的调用,第一次调用min(2,3),因为2<3,所以返回值为2,第二次调用min(1,2),因为l<2,所以返回1。 11在黑盒测试方法中,设计测试用例的主要根据是( )。 A.程序内部逻辑B.程序外部功能C.程序数据结构D.程序流程图 参考答案:B

参考解析:黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证,黑盒测试完全不考虑程序内部的逻辑结构和内部特性,只根据程序的需求和功能规格说明,检查程序的功能是否符合它的功能说明,所以本题选择B。

12在面向对象方法中,不属于“对象”基本特点的是( )。 A.一致性B.分类性C.多态性D.标识唯一性

r=j;//② int*P=&i;//⑧ *P=&r;//④

其中会产生编译错误的语句是( )。 A.④B.③C.②D.① 参考答案:A

参考解析:本题考查指针和引用。①为引用,使用正确;④中&r表示一一个地址,而* P已经是一个值了,不能将一个指针赋值给一个值,所以编译错误。 23有如下程序: #include

using namespace std; class Obj{ static int i; public: Obj(){i++;} 一Obj(){i一一;}

static int getVal(){return i;} };

int Obj::i=0: void f(){Obj ob2;cout< int main(){ Obj obl;

f();

Obj}ob3=new Obj;cout< p=\ delete ob3;cout< return 0; }

执行这个程序的输出结果是( )。 A.232B.231C.222D.221 参考答案:D

参考解析:本题考查构造函数和析构函数的调用顺序,调用顺序为先构造的后析构,后构造的先析构。本题中先定义了一个对象ob1,会执行构造函数,那么i就变为了l;再执行函数f后,由于又定义了一个对象ob2,所以再次执行构造函数,i就变为了2,输出了2。函数执行完后执行析构函数,i变为了1,然后又定义了对象指针,i变为了2。释放ob3后,i变为了1,所以答案为D。 24有如下类定义: class MyBase{ int k; public:

MyBase(int n=O):k(n)}} int value()eonst{return k;} };

class MyDerived:MyBase{ intj; public:

MyDerived(int i):j(i)}} int getK()const{return k;} int getJ()const{return j;} };

编译时发现有一处语法错误,对这个错误最准确的描述是( )。 A.函数9etK试图访问基类的私有成员变量k

B.在类MyDerived的定义中,基类名MyBase前缺少关键字public、protected或private C.类MyDerived缺少一个无参的构造函数

D.类MyDerived的构造函数没有对基类数据成员k进行初始化 参考答案:A

参考解析:默认继承方式为私有继承,私有继承将基类的公用成员和保护成员都变为r私有成员,基类的私有成员依然属于基类私有,派生类不能访问基类的私有成员。所以A选项正确。

25下列关于虚基类的描述,错误的是( )。 A.设置虚基类的目的是为了消除二义性 B.虚基类的构造函数在非虚基类之后调用

C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用 D.若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数

参考答案:B

参考解析:虚基类的引入就是为j-消除。二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。

26在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。 A.O(n)B.O(n2)C.O(1092n)D.0(n1092n) 参考答案:C

参考解析:当有序线性表为顺序存储时才能用:二分法查找。可以证明的是对于长度为n的有序线性表,在最坏情况下,二分法查找只需要比较l092n次,而顺序查找需要比较n次。

27在软件开发中,需求分析阶段可以使用的工具是( )。 A.N—s图B.DFD图C.PAD图D.程序流程图 参考答案:B

参考解析:在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B。 28有如下类声明: class Base{ protected: int amount; public:

Base(int n=0):amount(n){}

int getAmount()const{retum amount;} };

class Derived:public Base{ protected: int value;

public:

Derived(int m,int n):value(m),Base(n){} int getData()const{return value+amount;} }:

已知x是一个Derived对象,则下列表达式中正确的是( )。

A.x.value+X.getAmount()B.x.getData()一x.getAmount()C.x.getData()一x.amountD.x.value+X.amount 参考答案:B

参考解析:本题考查公有继承中派生类对象对基类的访问属性。在公有继承中,派生类对象只能访问基类的公有成员,而不能}方问基类的保护成员和私有成员。题中x是派生类的对象,只能访问基类中公有的Base()和getAmount()成员,而不能访问保护类型的amount成员,故选项C、D错误。而类对象对类成员的访问也存在类似的情况,即类对象只能访问类的公有成员,而value是Derived的保护成员,所以A选项也错误。故答案为B。 29有三个关系R、S和T如下:

则由关系R和s得到关系T的操作是( )。 A.自然连接B.交C.除D.并 参考答案:C

参考解析:如果S=T/R,则S称为T除以R的商在除运算中s的域由T中那些不出现在R中的域所组成,对于s中的任一序组,由它与关系R中每个有序组所构成的有序组均出现在关系T中。所以本题选择C。

30下面描述中,不属于软件危机表现的是( )。

int CourseNum; float Record; public:

Studentlnfo(char*name,int Age,int ID,int coumeNum,float record); //ERROR ********************found******************** void~Studentlnfo(){} float AverageRecord(){ return Record/CourseNum; }

void show()const{ cout<<”Name:”< <<”CourseNum:”< } };

//ERROR ******************found**************

StudentInfo StudentInfo(char*Name,int Age,int ID,int CourseNum,float Record) {

Name=name; Age=age; this一>ID=ID: CourseNum=courseNum:

Record=record; }

int main() {

Studentlnfo st(’’Smith”,21,99999,12,970); st.show(); return 0; }

参考解析: (1)char*Name; (2)~Studentlnfo(){}

(3)Studentlnf0::Studentlnfo(char*name,int age,,int ID,int eourseNum,float record)

三、简单应用题(24分)

42请使用VC6或使用【答题】菜单打开考生文件夹proj2下的工程proj2,其中定义了vehiele类,并派生出motorcar类和bicycle类。然后以motorcar和bicycle作为基类,再派生出motorcycle类。要求将Vehicle作为虚基类,避免二义性问题。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 80 150 100 1

注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。 #include class vehicle { private: int MaxSpeed; int Weight; public:

//*************found************ vehicle(int maxspeed,int weight):—— ~vehicle(){};

int getMaxSpeed(){return MaxSpeed;} int getWeight(){retum Weight;} };

//****************found************ class bicycle:——public vehicle { private: int Height; public:

bicycle(int maxspeed,int weight,int height):vehicle(maxspeed,weight),Height(height){}

int getHeight(){retum Height;}; };

//*******************found************** class motorcar:——public vehicle { private: int SeatNum; public:

motorcar(int maxspeed。int weight,int seatnum):vehicle(maxspeed,weight),SeatNum(seatnum){}

int getSeatNum(){return SeatNum;}; };

//*****************found*************** class motorcycle:—— { public:

motorcycle(int maxspeed,int weight,int height):vehicle(maxspeed,weight),bicycle(maxspeed,weight,

height),motorcar(maxspeed,weight,1){} };

void main() {

motorcycle a(80,150,100); cout< cout< cout< cout< }

参考解析:

(1)MaxSpeed(maxspeed),Weight(weight){f; (2)virtual (3)virtua1

(4)public bicycle,public motorcar 四、综合应用题(18分)

43请使用VC6或使用【答题】菜单打开考生文件夹proj3下的工程文件proj3。本题创建一个小型字符串类,字符串长度不超过l00。程序文件包括pmj3.h、proj3.cpp、writeToFile.obj。补充完成重载赋值运算符函数,完成深复制功能。 屏幕上输出的正确结果应该是: Hello!

Happy new year!

补充编制的内容写在“//**********333**********”与“//**********666**********”两行之间。

不得修改程序的其他部分。 注意:

程序最后调用writeToFil。函数,使用另一组不同的测试数据,将不同的运行结果输出到文件0ut?dat中。

输出函数writeToFile已经编译为obj文件。 //proj3.h #include #include

using namespace std; class MiniString { pubhc:

friend。8tream&operator<<(oatream&output,const MiniString&s)//重载流插入运算符

{ output<

friend istream&operator>>(istream&input,MiniString&8)//重载流提取运算符 { char temp[100];//用于输入的临时数组 temp[0]=’\\0’://初始为空字符串 input>>setw(100)>>temp;

int inLen=strlen(temp);//输入字符串长度 if(inLen!=0) }

s.1ength=inLen;//赋长度

if(s.sPtr!=0)delete[]s.sPtr;//避免内存泄漏 s.sPtr=Hew char[s.1ength+1];

strcpy(s.sPtr,temp);//如果8不是空指针,则复制内容 }

else s.sPtr[0]=’\\0’;//如果s是空指针,则为空字符串 retum input; }

void modString(const char}string2)//更改字符串内容 {

if(strin92 1=0)//如果strin92不是空指针,则复制内容 {

if(strlen(strin92)!=length) {

length=strlen(strin92); delete[]sPtr;

sPtr=new char[1ength+1];//分配内存 }

strcpy(sPtr,strin92); }

else sPtr[0]=’\\0’;//如果string2是空指针,则为空字符串

}

MiniString&operator=f const MiniString&otherString);

MiniString(corot char*s=\:lengtll((s!=0)?strlen(s):0)//构造函数 { sPtT=0: if(1ength[=0) setString(S); }

~MiniString()//析构函数 {delete[]sPtr;} private:

int length;//字符串长度 char*sPtr;//指向字符串起始位置

void setString(const char*string2)//辅助函数 {

sPtr=Dew char[str|en(string2)+1];//分配内存

if(stnIl92!=0)strcpy(sPtr,string2);//如果string2不是空指针,则复制内容 else slur[0]='\\0';//如果string2是空指针,则为空字符串 } }; //pwj3.cpp

#'include #include

using namespace std; #include”proj3.h”

MiniString&MiniStrin9::0perator=(const MiniString&otherString) {//重载赋值运算符函数。提示:可以调用辅助函数setString //*************333********** //*************666********** }

int main() {

MiniSu'ing strl(”Heuo!”),str2; void writeToFile(const char*); sir2=strl;//使用重载的赋值运算符 str2.modString(\ cout< cout<

writeToFile(\ return 0; }

参考解析:

length=otherString.1ength; //把对象字符串0therString的长度赋值给变量length setString(otherString.sPtr); //调用函数setstring,实现给类变量sptr分配空间,以及逐个把对象0therstring字符串的值复制到sptr中 return}this: //返回被赋值的对象

本文来源:https://www.bwwdw.com/article/p2a5.html

Top