软件工程知识技能水平:
1.基本数据结构与算法知识,有基本的代码分析能力;
2.面向对象程序设计,并且掌握一门具体的编程语言,有基本的编码能力;
3.掌握设计模式、UML图,加深对于面向对象的理解,有基本的设计能力;
一、 选择题(30分)
1. 需求分析最终结果是产生( B )。
A. 项目开发计划 B. 需求规格说明书
C. 设计说明书 D. 可行性分析报告
[答案与解析]本题摘自百度文库,主要考查对于需求分析的理解。
2.为了提高软件的可维护性,在编码阶段应注意( D )
A.保存测试用例和数据 B.提高模块的独立性
C.文档的副作用 D.养成好的程序设计风格
[答案与解析]本题摘自百度文库,主要考查对于编码规范的理解。
3.Kristie想获得能支持她的决定的证据。她目前打算重新安排办公室的空间,以使得她组内成员的工作环境更加舒适。她认为除了应该仔细考虑改变的客观方面以外,为她工作的人的想法也很重要。Kristie组里的员工认为她是一个好的倾听者,当他们有问题的时候,他们经常会询问她的意见。Kristie的工作方式属于 (D)
A.理性的外向的
B.理性的内向的
C.感性的外向的
D.感性的内向的
[答案与解析]本题摘自课堂习题,先做决定再找证据,所以是感性的。
4.设n是描述问题规模的非负整数,下列程序段的时间复杂度是(B)
x=0;
While(n>=(x+1)*(x+1))
x=x+1;
A.O(logn) B.O(n1/2 ) C. O(n ) O( n2)
[答案与解析]本题摘自408真题。
5.选择一个排序算法时,除算法 的时空效率之外,还需要考虑(C)
(1)数据的规模(2)数据的存储方式(3)算法的稳定性(4)数据的初始状态
A.(3) B.(1)(2) C.(2)(3)(4) D.以上全部
[答案与解析]本题摘自408真题。
6. 软件项目规划的第一步是(D)
A.确定项目预算 B.选择团队的组织模型 C.确定项目的约束 D.建立项目的目标和范围
[答案与解析]本题摘自清华06年期末考试。
7.下列关于设计模式的说法错误的是(A)
A.适配器模式⽤我们需要的接口对可以修改的类进⾏包装。
B.策略模式将算法的选择和算法的实现分离
C.桥接模式将抽象部分和实现部分分离,使它们都可以独⽴地变化
D. 模板⽅法和⼯⼚⽅法都是将业务划分抽象层和具体层
[答案与解析]本题为原创,主要考查设计模式的理解。
8.下列哪个阶段不属于软件生存周期的三大阶段(C )。
A、计划阶段 B、开发阶段
C、编码阶段 D、维护阶段
[答案与解析]本题摘自百度文库,主要考查软件生存周期。
9、瀑布模型把软件生命周期划分为八个阶段:问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段:计划阶段、开发阶段和( C)。
A、详细计划 B、可行性分析
C、 运行阶段 D、 测试与排错
[答案与解析]本题摘自百度文库,主要考查对于瀑布模型的理解。
10、软件工程方法学的目的是:使软件生产规范化和工程化,而软件工程方法得以实施的主要保证是(C )
A、 硬件环境 B、软件开发的环境
C、软件开发工具和软件开发的环境 D、 开发人员的素质
[答案与解析]本题摘自百度文库,主要考查对于软件工程的理解。
二、 简答题(25分)
1.名词解释(15分)
(1) 多态:
(2) 重构:
(3) 模块化:
(4) 可修改性:
(5) 实现视图:
[答案与解析]
本题主要考查对于软件工程重要概念的理解与掌握。
多态:在面向对象语言中,接口的多种不同的实现方式即为多态;
重构:通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性;
模块化:是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性;
可修改性:可修改性描述了程序能够被正确修改的难易程度;
实现视图:也称开发视图,它描述了在开发环境中软件的静态结构。
2.一个系统能完全做到内部无耦合吗?请回答并给出你的理由。(5分)
[答案与解析]
本题主要考查对于耦合性的理解。
在软件工程中,模块之间是存在依赖关系就必然存在耦合,理论上说绝对的零耦合是做不到的,但可以通过一些现有的方法将耦合降至最低
3.面向对象的方法可以适用开发任何系统么?面向对象方法的优势是什么? (5分)
[答案与解析]
本题主要考查对于面向对象方法的理解。
不适用大系统的开发;适用于事物多,业务逻辑复杂,数据量大的应用系统和网站
优势:a、分析、设计中的对象和软件中的对象的一致性
b、实现软件复用,简化程序设计
c、系统易于维护
d、缩短开发周期
三、 设计分析题(45分)
1. 以下语句描述某个程序中的模块。对于每个模块,请确定该模块是否有高内聚特性,并简要给出理由。(10分)
a. 模块”InventorySearchByID”搜索库存中的记录,以查看是否与指定范围的ID号匹配,返回包含任何匹配记录的数据结构。
b. 模块“ ProcessPurchase”从库存中删除购买的产品,为客户打印收据并更新日志。
c. 模块“ FindSet”处理用户的请求,从清单中确定与请求匹配的项目集,并将项目格式化为可显示给客户的列表。
[答案与解析]
本题主要考查对于耦合性的理解。本题选自《软件工程理论与实践》课后习题
a. 模块”InventorySearchByID”具有很高的内聚性;它仅执行一种功能(搜索)。
b. 可以预期模块“ ProcessPurchase”具有相对较低的内聚性,因为它涉及非常不同的功能:打印收据供用户使用在逻辑上与更新数据存储完全不同。
c. 可以期望模块“ FindSet”具有相对较低的内聚性,因为它调用了非常不同的功能:解析输入,对数据进行搜索以及输出格式化。
2. 假设有一个“加油站控制系统”(GSCS),该系统将用于帮助管理美式汽油或加油站。我们假设加油站主要提供两种服务:
•有一家小商店可存放汽车零件。商店内至少有一个收银机,该收银机由加油站的一名出纳员操作。
•有许多加油站,客户可以在这些处停放汽车,与系统交互以通过信用卡付款,然后再抽加油。或者,客户可以进入商店并直接向收银员付款,以现金或信用卡方式支付其汽油费。
因此,GSCS有两个主要的用户类别。第一类是收银员,他使用GSCS记录客户购买汽车零件的情况。 GSCS必须允许收银员输入所购买零件的类型和数量,然后计算总购买价格并处理付款。第二类是购买汽油的客户。这些客户指定购买的天然气的数量和类型,在加油处支付或向收银员付款,然后自行加油。
该系统还必须与其他自动化系统进行交互以执行其任务。例如,为了接受信用卡付款,GSCS必须与信用卡公司维护的系统对接。信用卡系统负责检查客户的帐户是否信誉良好并可以容纳购买金额,并负责从客户的帐户中扣款并最终向加油站付款。这些外部系统的操作超出了GSCS的范围,但GSCS需要知道外部系统将如何传达其任务是否操作完成。
(1)请画出加油站控制系统的用例图。(10分)
[答案与解析]
本题主要考查对于UML图的理解与掌握。本题选自《软件工程理论与实践》课后习题
(2)请画出加油站控制系统的类图。(10分)
(3)在以下来自GSCS的程序片段中,使用以下选择,标识出与good programming style 不一致的冲突。 (8分)
(a)普遍适用性
(b)高效率
(c)格式化
(d)文档说明
(e)没有违反
片段1:
void PrintPartFile(){
/* Open the parts.dat file. Print each line to standard output. */
/* Close the file. */
ifstream PartFile (“parts.dat”);
char line[100];
while (PartFile.getline(line,100))
cout << line << “\n”;
PartFile.close();
}
(a),使用此函数只能读取和打印一个文件。 它可以更有普适性。
片段2:
int ValidateParts (PartList &parts, PartList &master){
/* Validate and count the parts in the part list (parts). */
/* If a part in the list (parts) does not exist in the master list, */
/* return -1. */
/* If all parts in the list (parts) exist in the master list, */
/* return the sum of the quantities of each part in the list (parts). */
int total = 0;
for (int i=0; i < parts.getcount(); i++)
if (!master.Exists(parts[i])) return -1;
for (int j=0; j < parts.getcount(); j++)
total += parts[i].getquantity();
return total;
}
(b)可以将两个循环组合在一起以使此代码更高效。
(4)请用你熟悉的语言编写通用的打印函数,所编写的函数应满足上述good programming style .(7分)
void Print(istream &is, ostream &os){
……
}
[答案与解析]
本题主要考查对于编程规范的掌握。
void Print(istream &is, ostream &os){
/* Print each line of the input stream (is) to the output stream (os). */
char line[MAXLINE];
while (is.getline(line,MAXLINE))
os << line << “\n”;
}