程序员-C++程序设计(一)
(总分:23.00,做题时间:90分钟)
一、试题一(总题数:3,分数:5.00)
请补齐上述代码中的空缺(1)和(2)。
(分数:2.00)
填空项1:__________________ (正确答案:Stock( ):shares(1),share_val(1)或Stock( ):share_val(1),shares(1)。) 解析:
填空项1:__________________ (正确答案:cout) 解析:
类Stock的定义中有两处错误,请指出错误所在行号并给出该行修改后的完整结果。
(分数:2.00)
填空项1:__________________ (正确答案:第4行,修改为:public:) 解析:
填空项1:__________________ (正确答案:第9行,修改为:~Stock( ){}) 解析:
1.指出该代码是否存在内存泄漏。
(分数:1.00)
填空项1:__________________ (正确答案:不存在内存泄漏) 解析:[解析]
由题中程序可知类Stock有默认的构造函数,且该构造函数将初始化类中一些成员变量,所以(1)处应该为Stock的构造函数。成员函数output用于输出成员变量的值,所以(2)处应为cout。对于[问题2]由于类至少有一个公共的构造函数,所以第4行的protect应该改为public,而析构函数不能有返回值,所以第9行应该去掉void。对于[问题3]main函数中类的使用没有通过new操作符生成Stock类的对象,所以不存在内存泄漏。
二、试题二(总题数:1,分数:5.00)
[说明]
C++标准模板库中提供了vector模板类,可作为动态数组使用,并可容纳任意数据类型,其所属的命名空问为std。vector模板类的部分方法说明如表12-3所示。
表12-3 vector模板类的部分方法
方法 push_back(k) begin() end() empty() erase(ptr) [C++代码] #include<iostream> #include<vector> using namespace (1) ;
含义 向vector对象的尾部添加一个元素k 返回一个迭代器对象,该对象指向vector中的第一个元素 返回一个迭代器对象,该对象指向vector中的最后一个元素 测试vector对象是否为空 删除vector中ptr指向的元素 typedef vector< (2) >INTZECTOR; const int ARRAY_SIZE=6;
void ShowVector(INTVECTOR & theVector); int main( )
INTVECTOR theVector;
//初始化theVector,将theVector的元素依次设置为0至5 for (int cEachItem=0; cEachItem<ARRAY_SIZE; cEachItem++) theVector. push_back( (3) );
ShowVector(theVector); //依次输出theVector中的元素 theVector. erase(theVector. begin( )+3); ShowVector(theVector);
void ShowVector(INTVECTOR & theVector) if(theVector. empty( ))
cout<<\<<endl; return;
INTVECTOR::iterator (4) ;
for(theIterator = theVector.begin( ); theIterator != theVector.end( ); theIterator++)
cout<< *theIterator;
if(theIterator ! =thevector. end( )-1)cout<<\
cout<<endl;
该程序运行后的输出结果为: 0, 1 , 2, 3, 4, 5 (5)
(分数:5.00)
填空项1:__________________ (正确答案:std) 解析:
填空项1:__________________ (正确答案:int) 解析:
填空项1:__________________ (正确答案:cEachItem) 解析:
填空项1:__________________ (正确答案:theIterator) 解析:
填空项1:__________________ (正确答案:0,1,2,4,5)
解析:[解析] 本题考查的是C++语言的基本应用。在使用C++标准库中的对象时,要引入标准的命名空间,空(1)处应为std,空(2)处是用来指定vector对象的类型,此处应为int,空(3)处是将循环变量的值存入theVector中,所以应为cEachItem,空(4)处代码主要是循环输出theVector对象的内容,因此应为定义迭代器变量theIterator。程序开始会输出0,1,2,3,4,5,再次输出时则为0,1,2,4,5。
三、试题三(总题数:1,分数:5.00)
[说明]
已知对某载客车辆(Car)进行类建模,如图12-2所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。 const int (1) =7; //定义最多载客数
const int MAX_WHEELS=5; //定义最多轮胎数 class Body //此处代码省略 ); //车身类 class Passenger //此处代码省略; //乘客类 Class Wheel //此处代码省略; //车轮类 Class Driver //司机类 public:
string name; //表示第几路公交车司机
Driver(string driverName):marne( (2) ); //构造函数 ;
class Engine //引擎类 public:
string engineNo; //引擎编号
Engine(string engineNo) (3) ->engineNo=engineNo; //构造函数 ;
Class Car //汽车类 protected:
Engine *engine; Driver *driver; Body body;
Wheel *wheels[MAX_WHEELS]; Passenger *passengers[MAX_PASSENGERS]; public:
Car(Driver *driver)( //构造函数 this->driver=driver;
engine=new Engine(\型号引擎\for(int index=0; index<MAX_WHEELS; index++) wheels[index]=new Wheel( );
for(int index=0; index passengers[index]=NULL;
virtual -Car( ) //析构函数
for (int index=0; index<MAX_WHEELS; index++) delete wheels[index]; delete (4) ;
int getPassengerNumber( ) //获取车上乘客数量 //此处代码省略
void getonpassenger(Passenger *apassenger ) //乘客上车 //此处代码省略
void run( ) //开车
if(driver==NULL)cout<< \司机尚未上车!\//此处代码省略 ;
void main( )
Driver driver(\第五路公交车司机\
Car car( (5) );
Passenger passengers[MAX_PASSENGERS];
for(int index=0; index<MAX_PASSENGERS; index++) //乘客上车处理
car. getOnPasSenger(&passengers[index]); car. run( );
(分数:5.00)
填空项1:__________________ (正确答案:MAX_PASSENGERS) 解析:
填空项1:__________________ (正确答案:driverName) 解析:
填空项1:__________________ (正确答案:this) 解析:
填空项1:__________________ (正确答案:engine) 解析:
填空项1:__________________ (正确答案:&driver)
解析:[解析] 根据类图描述,分析可得:一辆汽车可以载0~7名乘客,一辆汽车可以被一个或者多个司机驾驶,并且一辆汽车有4~5个轮胎,一个引擎和一个车框架。程序代码中空(1)处表示一辆汽车最多载客数目,从后面的程序代码分析可得,应该填写MAX_PASSENGERS。空(2)处用于构造一个司机对象,需要司机名称driverName作为参数。空(3)处主要设置车的假设司机,由于参数的名称与成员变量的名称相同,因此需要加上this以示区别。空(4)处所对应代码段是汽车car的析构函数,与car的构造函数相对应,需要将构造函数中创建的引擎和车轮删除,所以空(4)处应为删除引擎。空(5)处用于产生一个汽车对象,所以,需要给汽车对象传递合适的参数,构造方法中需要传递一个司机对象,因此应该将driver对象传递到汽车对象中。
四、试题四(总题数:3,分数:8.00)
2.关于上述C++代码中sh和tr的以下叙述中,哪两个是正确的(写出编号)? ①sh和tr分别引用同一个对象;
②sh和tr分别引用同一类型的不同的对象; ③sh和tr分别引用不同类型的不同对象; ④sh和tr分别引用同一个对象的不同复制; ⑤sh和tr所引用的内存空间是相同的。
(分数:1.00)
填空项1:__________________ (正确答案:①⑤) 解析:
写出下面消息对应的方法编号(如果该消息错误或者没有对应的方法调用,请填写“无”)。
(分数:6.00)
(1).tr->height( )(分数:1.00)
填空项1:__________________ (正确答案:3) 解析:
(2).sh->perimeter( )(分数:1.00)
填空项1:__________________ (正确答案:5) 解析:
(3).sq->height( )(分数:1.00)
填空项1:__________________ (正确答案:无)
解析:
(4).sq->perimeter( )(分数:1.00)
填空项1:__________________ (正确答案:4) 解析:
(5).sh->height( )(分数:1.00)
填空项1:__________________ (正确答案:无) 解析:
(6).tr->perimeter( )(分数:1.00)
填空项1:__________________ (正确答案:5) 解析:
3.不考虑内存释放问题,下列赋值语句中哪两个是合法的(写出合法赋值语句的编号) ①sq=sh;②sh=tr;③tr=sq;④sq=tr;⑤sh=sq。
(分数:1.00)
填空项1:__________________ (正确答案:②⑤) 解析:[解析]
根据题中代码可知,仃指向一个Triangle对象,sq指向一个Square对象,sh和tr指向同一个Triangle对象。所以问题1中①⑤正确,由于sh和tr指向同一个对象,其引用的内存空间也必然相同,②③④错误。对于问题2中的消息,tr指向Triangle对象,所以tr->heighl:( )调用Triangle类的height方法;sq指向Sqtlare对象,但Square没有height方法,所以sq->height( )没有对应任何方法调用,但Square类有perimeter方法,所以sq->perimeter( )调用Sqtlare类的perimeter方法,其他几项同上。问题3中,赋值运算的左边应该是右边的父类或同一类型才可以正确赋值。所以正确的是②⑤。
相关推荐: