整理版北邮面向对象C试题房鸣.docx
《整理版北邮面向对象C试题房鸣.docx》由会员分享,可在线阅读,更多相关《整理版北邮面向对象C试题房鸣.docx(25页珍藏版)》请在冰豆网上搜索。
![整理版北邮面向对象C试题房鸣.docx](https://file1.bdocx.com/fileroot1/2023-6/9/230fc7f8-bac3-4b7a-b532-d1bc799b1a4d/230fc7f8-bac3-4b7a-b532-d1bc799b1a4d1.gif)
整理版北邮面向对象C试题房鸣
一、填空题
1. 软件工程是指导(计算机软件)开发和维护的(工程学科)。
2. 应用软件工程方法开发软件系统的根本目的是为了改善以下四项软件品质因素:
提高所开发的软件系统的(效率);降低所开发的软件系统的(成本);改善所开发的软件系统的(性能);缩短所开发的软件系统的(周期)。
3. 抽象的对象模型由(属性)和(方法)两个部分构成。
4. 一个消息必须具备的两个要素是(接收消息的对象标识)和(接收消息的对象的方法标识)。
5. 一个对象拥有另一个对象的(部分)或(全部)的属性和方法的关系则称为(继承)关系。
6. 失去(制造对象)能力的类成为抽象类。
7. 一个类的属性不能出现对象拷贝则成为(类属性)。
8. 面向对象技术的三大特征是(继承)、(封装)、(多态)。
9. 共生包容关系中的被包容类对象与包容类对象是(同时连带)生成的。
10. 同时出现在两个具有关联关系的对象内的相同属性被称为(连接属性)。
11. 一个用例模型的设计要有三类人参与,他们分别是(主要参与者)、(次要参与者)和()
12. 边界类中涉及到的三个接口是(用户接口)、(设备接口)和(系统接口)。
13. 一个用例中的各个类之间存在的最普遍的关系是(关联)关系。
14. 在面向对象技术中,使用多态技术手段大大(延长)了软件的使用寿命、降低了软件产品的开发(成本),其中的泛化技术手段还可以极大的提高软件产品的(可移植)性。
15. 试选择以下词组代号填入恰当的括号内:
类属性和类方法对应于面向对象语言中的(①)和(④)
①静态成员函数 ②成员数据 ③成员函数 ④静态成员函数
16. 对象间存在聚合(包容)、继承(派生)和关联三种关系。
17. 一个用例内至少要有一个(①)和一个(④) ①边界类 ②抽象类 ③实体类 ④控制类
18. 一个继承了抽象类且可以制造对象的派生类所生成的对象内存在一个其继承得到的抽象类对象的(③)
①属性函数 ②作用域 ③方法成员 ④声明 19. 软件的生存周期是一个软件产品从(定义)、(开发)、(使用)到(废弃)的时间的总合。
20. C++语言中的静态成员函数是(类方法)的具体实现。
21. 连接属性是(关联/连接)关系的两个对象内的属性。
22.边界类与(Actor(角色))对呈一一对应关系。
23.复合聚合关系中的(聚合)类对象极其依赖(被聚合)类对象,在实现上往往具有被同时(构造)的特征,因而具有极高的(耦合度)。
二、是非判断题
C++/RUP/UML
1.使用C++语言只能编写面向对象的程序(×)
2.UML中的活动图可以描绘面向对象分析和设计的全过程的工作流程(√)
3.使用C++语言不能同时编写出面向过程和面向对象的程序(√)
4.RUP的开发周期由三个阶段所构成。
(×)(四个阶段初始阶段-细化-构造-交付)
5.RUP中的系统行为是对其全部的外来激励进行作用和反作用。
(√)
6.RUP中的系统行为可以从对象模型中获得。
(×)
类
1.一个类必然具有生成对象的能力(×)
2.一个类也可以接收消息(√)
3.调用类方法必须向该类的对象发消息(×)
4.抽象类是不包含任何属性的类(×)
5.当使用一个类方法时,消息是传向一个类的。
(√)
6.只有属性的类也具有封装性。
(×)
7.含有定性的属性的类就是抽象类。
(×)
关系
1.在包容关系中的被包容类也具有封装性(√)
2.关联关系只是一个动作的抽象(×)
3.关联关系中的作用名标识了该关联关系的终点对象的恰当地位(√)
4.候选键是具有关联关系的两个类中属性的一部分(×)
5.多重继承必然存在不确定问题(×)
6.继承关系中的成员覆盖就是重载的一种形式(×)(重构就是√)
7.继承关系中也存在有关联关系(√)
8.复合包容关系中的被包容对象必须在包容对象被击活的同时构造(√)
9.在关联关系的两端插入角色描述有助于对该关联关系的可读性(√)
10.确定候选键是对关联关系模型优化的一种手段(√)
对象
1.面向对象设计方法的一个重要目的便是实现“可重用软件的设计”(√)
2.一个派生类对象的方法不能访问其继承的基类对象的某些成员是由于这些基类对象的成员不存在于派生类对象中(×)
3.一个派生类对象也可以向其继承的基类对象发消息(√)
4.面向对象的分析方法中存在自顶向下,逐步求精的过程(×)
5.一个对象的方法只能改变本对象的属性值。
(×)
6.一个对象内存在另一个对象的关系称为包容关系。
(×)(原因:
有可能是派生)
7.一个对象所呈现的不同状态称为多态。
(×)
8.静态链接是在面向对象技术语言编译时建立的对象关系。
(√)
9.在面向对象技术系统分析中,问题陈述是获取对象的重要来源。
(√)
10.在面向对象技术系统分析中不使用数据流图。
(×)
11.一个以限制性继承的派生类对象访问其继承的基类对象时必须通过消息手段。
(√)
状态
1.状态图是反映了整个系统动态运行时状态变化的图像工具(√)
2.状态的自动变迁是由于一个内部的事件所引发的(×)
消息必须含有返回信息(×)
三、选择题
对象
1.面向对象技术是(A)
A.指导构建软件的系列法则B.一种探索可被认同的新理论
C.由GradyBooch提出的一种动态的语言D.基于抽象与模块化原理的新技术
2.一个对象的状态(A)
A.是一个被称为状态的属性或属性集B.始终不发生常规的变化
C.被描述成对象的属性和关系(个体)D.仅是一个对象可能存在的条件
3.一个可见的对象行为可以被模型化为该对象的(C)
A.属性B.责任C.操作D.方法
4.在一个对象系统内两个彼此间具有(C)结构的对象间的访问必须依赖消息手段
A.同类对象B.完备的聚合关系C.拓展继承关系D.友元
5.一个可见的对象行为可以被模型化为该对象的(D)
A.属性B.责任C.操作D.方法
模型/建模
6.(B)项目对建模的要求度最小
A.立交桥B.沙发C.列车D.光盘
7.一个模型(C)
A.对于十分理解其工作内容的团队成员可以不使用B.必须是有结构的和动作的体系
C.是一个实例化的简化D.一个构建精确计划的原由
8.最好的模型将与(B)联系在一起
A.Java-Script代码B.实体C.C++D.与面向对象开发者联系在一起的命题
9.建模的根本目的是(D)
A.有助于与一个系统的可视化B.获得一个准备构建系统的模版C.见证设计成果D.上述三条的总和
UML/RUP
10.使用UML建模时(C)的处理不是其最基本特征
A.迭代与增量B.用例驱动C.弹性设计D.以架构为核心
11.在UML中,使用(A)词汇表示可以将具有共同用途的模型元素组成多个组
A.PackageB.ClassC.EncapsulationD.Generalization
12.以下RUP中的(D)视聚焦在结构问题上
A.用例B.处理C.实现D.逻辑
13.Rational推出的RUP方法中所倡导的迭代式开发模式的最根本目的是为了(B)
A.降低开发成本B.降低开发风险C.减少开发时间D.节省开发的人力资源
14.短语(B)可以最好的体现泛化关系
A.ispartofB.isakindofC.isareplicaofD.isaninheritanceof
类
15.一个类(D)
A.是一个对象的封装B.表现为一个对象的分层结构C.是一个对象的实例D.是一个对象的抽象定义
封装
16.封装(B)
A.允许对处于封装状态的内容进行直接处理B.涉及到信息的隐藏
C.会导致维护成本的提高D.在实现时所引用的改变会影响到客户端
17.封装(A)
A.是指一种对象组成结构的存在形式B.是指只有属性的对象组成结构的存在形式
C.是指只有方法的对象组成结构的存在形式D.是指外界可以任意访问对象内成员的对象组成结构的存在形式
多态
18.多态可以被描绘成(A)
A.在一个接口上隐藏多个不同实现的形态B.继承C.信息放置形态D.泛化
19.多态是(A)
A.系统面对一个服务请求而设置了多个不同接口的形态B.继承C.信息放置形态D.泛化
关系
20.利用继承派生关系中的重构手段获得的新系统是为了(C)
A.仅仅延长该系统的寿命B.修正原系统内的缺陷
C.允许多个不同版本的功能可以同时使用D.掩盖原系统内的缺陷
21.将模块与计划合并为一体化的目的是(A)
A.在可管理的单元上降低一些复杂程度B.构建的模块便于交流
C.创建巨大且难于理解的系统D.系统的局部不能独立开发
四、分析题
1.指出下列对象之间的关系
✧软件工程与面向对象的分析与设计方法(包容关系)
✧矛与盾(关联关系)
✧数字交换系统与通信系统(继承关系)
✧人与心脏(包容关系)
✧Pentium芯片与PentiumIV芯片(继承关系)
✧计算机与磁带机(关联?
关系)
✧多媒体与三维图形设备(继承关系)
✧石油与汽油(关联?
关系)
✧道路与车辆(关联关系)
✧煤炭与碳元素(继承关系)--抽象类->继承
✧地球与太阳(关联关系)
✧家庭影院与音箱(包容关系)
✧信息与印刷品(继承关系)
✧钥匙与锁(关联关系)
✧灯泡与灯丝(包容关系)
✧计算机与打印机(关联关系)
✧公司与雇员(包容关系)
✧建筑体与墙(继承关系)
2.试在下图给定的括号内写出已知关联联系得作用名(RoleName)。
张三(通知人)(被通知人)李四
人(老板)(雇员)
3.阅读下述C++程序后试在其右侧对应的对象图中填充描述其关系的对象模型符号
4.阅读下述C++程序后试在其右侧对应的对象图中填充描述其关系的对象模型符号,并试在题目的下方写出执行本程序的输出结果。
还是
执行本程序的输出结果是:
1B继承A&B包含A?
?
?
A*p1=newB
(1);→p1→p=NULLA*p2=newB(2,(A*)p1);→p2→p→p1
5.某大学推行完全学分制的学籍管理方式,其规定如下:
学生在入学后的第一个学年内必须完成学绩分超过23分才能被允许(收到确认通知)进入第二学年的学习,否则将被按照肄业处理,进入第二学年后可以被允许(收到确认通知)进入下一个学年学习的最低学绩分数分别为27、30和30分(含对应分数者)。
完成第四个学年的学绩分30分(含30)以上者可以准许毕业(获得毕业证书)。
若在后三学年中的某一年中没有完成该学年规定的学绩分者,则可以在对应学年中重新学习一年,若仍不能达到规定学绩分者的学籍将被自动按肄业处理。
试据上述脚本绘制出对应的状态图。
(9分)
解:
本题的状态图如下:
课程复习--补充题:
一盏信号灯在三种不同的外电压作用下可呈现出不同的颜色:
外电压为0V时信号灯不亮;外电压为50V时信号灯呈红色;外电压为100V时信号灯呈黄色;外电压为150V时信号灯呈绿色。
在不改变外电压的条件下,该信号灯在呈现黄色或绿色20秒后会分别自动变回红色或黄色。
若此时改变其外电压则信号灯的颜色仍会呈现为对应电压的颜色(如100V外电压的作用下变为黄色;在150V外电压的作用下会变为绿色)。
试绘出该信号灯颜色变化的状态图。
解:
(设时间条件为Time)本题的状态图如下:
6.已知下图所示的某系统中关于A和B的顺序图,图中给出了关于classA的3个不同状态,试绘制与该类对应的状态图,设没有明示的状态迁移视为可通达。
解:
经过对图中已知的消息逻辑,绘制出如下图所示的状态图:
五、改写、补做与纠错题
1.下述C++程序结构为类B继承类A的派生结构,以不改变对象关系结构为前提,试在源程序的右侧写出只将基类变为类模板结构的全部C++代码,并修改程序内与其相关的其他部分的配套语句。
课程复习--补充题:
设下述C++程序运行于字长为32位的硬件环境中,请在以下C++程序的右侧写出将该源程序变为类模板的对应程序代码。
10-11考试题
#include
usingnamespacestd;
template
classA
{
T1flag;
public:
A(){}
A(T1n){flag=n;}
voidoperator=(T1x){flag=x;}
};
template
classB
{
T2*p;
staticintsum;
public:
B(intn){p=newT2[n];sum=n;}
T2&operator[](intm){returnp[m];}
staticintcount(){returnsum;}
};
intB>:
:
sum=0;
voidmain()
{
intx;
cin>>x;
B>b(x);
for(inti=0;i{
b[x]=i;
}
cout<>:
:
count()<}
2.下述C++程序存在若干处错误,以不改变程序结构为前提,请在出错的行首做一标记(如*),并将改动最少的正确语句写在所在行下方或出错部位的右侧。
更正错误如下:
No.1$:
No.2$:
在标志处下一行添加如下语句
No.3$:
No.4$:
No.5$:
课程复习--补充题:
1.+程序存在若干处错误,以不改变程序结构为前提,请在出错的行首做一标记(如*),并将改动最少的正确语句写在所在行或出错部位的右侧。
例1:
#include
usingnamespacestd;
classA
{
protected:
inti;
public:
A(intx):
i(x){}
virtualintoperator!
()=0;
virtualintoperator~()=0;
//补充定义虚基函数,使基类能访问派生类同名成员函数
};
classB:
publicA
{
inti;
public:
B(intx,inty):
i(x),A(y){}
intoperator!
(){returni;}
intoperator~(){returnA:
:
i;}
};
voidmain()
{
A*p=newB(2,1);
cout<<"I="<
(*p)<I=1
cout<<"I="<<~(*p)<I=1
//由newB(2,1)知,只有B的基类A中i为1,因此需要调用成员函数operator~()访问基类A中i。
原代码中调用operator!
(),返回值是2,不合要求。
此处~(*p)等价于(*p).operator~()
}
例2:
#include
usingnamespacestd;
classA
{
protected:
inti;
public:
A(intx):
i(x){}
virtualintoperator~()=0;
virtualintoperator!
()=0;
//补充定义虚基函数,使基类能访问派生类同名成员函数
};
classB:
publicA
{
protected:
inti;
A*p;
public:
B(intx,inty):
i(x),A(y){p=(A*)this;}
intoperator!
(){returni;}
intoperator~(){returnp->i;}//标准规则限制必须用基类强制
intoperator~(){returnA:
:
i;}//强制使用基类中i
};
voidmain()
{
A*p=newB(1,2);
cout<
*p<1
cout<<~*p;//Displaay:
2
}
2.下述C++程序尚未完成,试根据已知条件补上类A中欠缺的成员函数。
例1:
#include
usingnamespacestd;
classA
{
inti;
A*p;
public:
A():
p(NULL){}
A(intx):
i(x){p=newA[x];}
A&operator[](intx){returnp[x];}//补充定义operator[](int)
voidoperator=(intx){i=x;}//补充定义operator=(int)
intoperator!
(){returni;}//补充定义operator!
()
~A(){if(p)delete[]p;}//因有动态内存分配,补充定义析构函数,释放内存
};
voidmain()
{
Aa(5);
for(inti=0;i<5;i++)
{
a[i]=i;//此处等价于a.operator[](i).operator=(i);
cout<
a[i];//displayresult:
01234
//此处等价于a.operator[](i).operator!
();
}
cin.get();
}
例2:
#include
usingnamespacestd;
classA
{
protected:
inti;
public:
A(){cout<<"Pleaseinputthevalue:
";cin>>i;}
booloperator==(constA&rhs)const{returni==rhs.i;}
//补充定义相等运算符,比较两个A对象
};
voidmain()
{
Aa,b;
if(a==b)cout<<"Thecomparedresultistrue."<elsecout<<"Thecomparedresultisfalse."<}
另一种方法不知道对不对
补充:
2011.01.13考试题
下面的程序中有一些错误,请对程序进行修改,使其能最好地完成预期功能。
#include
usingnamespacestd;
classA
{
inti;
public:
A(intx=0):
i(x){}
intget(){returni;}
};
classB:
publicA
{
public:
B(intx=1):
A(x){}
voidoperator!
(){cout<<"i="<};
classC:
publicB
{
inti;
public:
C(intx=2,inty):
B(x),i(y){}
intoperator+=(A&x){returni+=x.get();}
intget(){returni;}
};
voidmain()
{
A&p1=*(A*)newB();
A&p2=*(A*)newC(10);
!
*p1;//结果:
i=1
cout<<"p2{i}="<p2{i}=11
cout<<"p2{i}="<p2{i}=11
}
改过之后:
//main.cpp
#include
usingnamespacestd;
classA
{
inti;
public:
A(intx=0):
i(x){}
//intget(){returni;}
virtualintget(){returni;}
virtualvoidoperator!
()=0;
virtualintoperator+=(A&x){return0;}
virtual~A(){}
};
classB:
publicA
{
public:
B(intx=1):
A(x){}
//voidoperator!
(){cout<<"i="<voidoperator!
(){cout<<"i="<:
get()<};
classC:
publicB
{
inti;
public:
//C(intx=2,inty):
B(x),i(y){}
C(inty,intx=2):
B(x),i(y){}
//intoperator+=(A&x){returni+=x.get();}
intoperator+=(A&x){returni+=x.A:
:
get();}
intget(){returni;}
};
voidmain()
{
A&p1=*(A*)newB();
A&p2=*(A*)newC(10);
//!
*p1;//结果:
i=1
!
p1;//结果:
i=1
//cout<<"p2{i}="<p2{i}=11
cout<<"p2{i}="<<(p2+=p1)<p2{i}=11
cout<<"p2{i}="<p2{i}=11
//insert
delete&p1;
delete&p2;
}