第 1 章 软件与软件工程
1、软件及软件工程定义
答:软件是能够完成预定功能和性能,并对相应数据进行加工的程序和描述程序
及其操作的文档。
软件 = 程序+数据+文档
程序 = 算法+数据结构
软件工程:为了克服软件危机,在软降的开发生产过程中采用工程化的方法,采
用一系列科学的,现代化的方法和技术开发软件,将工程化的思想贯穿到软件开
发和维护的全过程。
2、软件危机的原因
答:软件危机答:软件开发和维护过程中遇到的一系列严重问题。导致软件危机
的原因:
1)软件的规模加大、复杂性提高、性能增强
2)软件是逻辑产品, 尚未完全认识其本质和特点
3)缺乏有效的、系统的开发、维护大型软件项目的技术手段和管理方法
4)用户对软件需求的描述和软件开发人员对需求的理解往往存在差异,用
户经常要求修改需求,开发人员很难适应
5)软件开发的技术人员和管理人员缺乏软件工程化的素质和要求,对工程
化的开销认识不足
3、简述瀑布模型及其特点
1. 试简述瀑布模型软件开发方法的基本过程。
计 划 时
期
开发
时期
运行
时期
问题定义
问题定义
(目标与范围说明书)
可行性研究
可行性研究
(可行性论证论告)
需求分析
需求分析
(需求说明书)
软件设计
软件设计
(设计文档)
编码编码
(程序)
测试测试
(测试报告)
运行与维护
运行与维护
(维护报告)
答:1)软件开发过程与软件生命周期是一致的;2)相邻二阶段之间存在因果关系;3)
需对阶段性产品进行评审
4、简述一下螺旋模型及其特点
答:螺旋模型沿着螺线进行若干次迭
代,图中的四个象限代表了以下活动:
(1)制定计划:确定软件目标,选定
实施方案,弄清项目开发的限制条件;
(2)风险分析:分析评估所选方案,
考虑如何识别和消除风险;
(3)实施工程:实施软件开发和验证;
(4)客户评估:评价开发工作,提出
修正建议,制定下一步计划
5、简述一下原型模型及其特点
答:原型模型的优点是:
(1)可及早为用户提供有用的产品。
(2)可及早发现问题,随时纠正错误。
(3)减少技术、应用风险,缩短开发时间,减少费用、提高生产率。
(4)通过实际运行原型,提供直接评价系统的方法,促使用户主动参与开发活动,
加强了信息反馈,促进各类人员的协调,减少误解,适应需求变化,能有效提高
系统质量。
原型模型的缺点是:
(1)缺乏丰富而强有力的软件工具和开发环境。
(2)缺乏有效的管理机制,还未建立起自己的开发标准。
(3)对设计开发环境要求较高。
(4)在多次重复改变原型的过程中,程序员会感到厌倦。
(5)系统的易变性对测试有一定影响,难于做到彻底测试,更新文档较为困难。
适用范围:软件需求不明确、设计方案有一定风险的软件项目。
第 2 章 软件项目管理
1、自底向上的成本估算法的特点。
答:精度高,但缺少子任务(模块)间的联系
2、某项目总的功能点(FP)估算值是 310,基于过去项目的人均月生产率是 5.5FP,
该项目总成本的估算值为 560,000 元,试估算月均人力成本。
答:560000 /(310 / 5.5) 9935.48( 10000)(
)
元
3、CMM
答 :即 软件 能力 成 熟度 模型 , 是 由美 国 卡内 基- 梅 隆大 学软 件工 程 研究 所
(CMU/SEI)推出的评估软件能力与成熟度的一套标准,该标准基于众多软件专家
的实践经验。CMM 侧重于软件开发过程的管理及工程能力的提高与评估,是国
际上流行的软件生产过程标准和软件企业成熟度等级认证标准,它更代表了一种
管理哲学在软件企业中的应用。
4、下面是某个程序的流程图,画出程序图并计算它的 McCabe 复杂性度量。
答:程序图如下:
结点数 n=6,弧数 m=7,p=2,则有
V(G)=m-n+p=7-6+2=3.
第 3 章 需求分析基础
1、请解释自顶向下,逐步求精。
答:将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层
细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。
2、某银行的计算机储蓄系统功能是:将储户填写的存款单或取款单输入系统,
如果是存款,系统记录存款人姓名﹑住址﹑存款类型﹑存款日期﹑利率等信息,
并打印出存款单给储户;如果是取款,系统计算清单给储户。请用 DFD 描绘该
功能的需求,并建立相应的数据字典。
数据流名称:取款单、存款单
别名:无
简述:顾客存/取款时填写的单据
来源:顾客
去向:核查
数据流量:200 份/天
组成:日期+[取|存款金额]+姓名+地址+[存/取款类型]+密码+{账号}
数据流名称:存款凭证
别名:无
简述:顾客存款后得到的凭据
来源:银行存款系统
去向:顾客
数据流量:200 份/天
组成:日期+存款金额+储户姓名+储户地址+存款类型+账号+利率+操作员
数据流名称:结算单
别名:无
简述:顾客取款时得到的利率清单
来源:银行储蓄系统
去向:顾客
数据流量:200 份/天
组成:取款日期+取款金额+储户姓名+储户地址+存款类型+利息+总金额+
操作员
数据流名称:存/取款信息
别名:无
简述:系统检查确认后得到的存/取信息
数据流名称:存/取款信息
别名:无
简述:系统检查确认后得到的存/取信息
来源:银行储蓄系统
去向:登录
数据流量:200 份/天
组成:日期+[存|取款金额]+储户姓名+储户地址+存款类型+账号+利率+密
码+操作员
数据流名称:付款信息
别名:无
简述:存储系统处理的取款信息
来源:银行储蓄系统
去向:付款处理
数据流量:200 份/天
组成:日期+取款金额+储户姓名+储户地址+存款类型+账号+利息+总金额
+操作员
数据存储名称:账卡
别名:无
简述:存放用户信息及存取款情况
组成:储户姓名+储户地址+账号+|日期|+[存/取款金额]+存款类型+利率+密
码+操作员
组织方式:数据文件,以储户姓名或账号为关键字进行索引
查询要求:要求能立即查询并修改
数据项名称:存款类型
别名:无
简述:国家规定的几类存款方式
类型:字符串
长度:2 位
取值范围及含义:00:定期; 01:零存整取;10:活期;11:定/活两便
加工名:核查
编号:
激发条件:接受存款单或取款单
输入:存款单或取款单
输出:认定的合格的村/取款信息
加工逻辑:根据账卡及用户存/取款单据
if 单据=存款单 then
存款单据是否填写规范,是否与现金一致
else
审核是否为有效取款单,取款金额不得超出存款金额,密码是否正确
3、(15 分)某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生
的平时成绩和考试成绩,其主要功能描述如下:
1. 每门课程都有 3 到 6 个单元构成,每个单元结束后会进行一次测试,其成
绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课程的
考试成绩。
2. 学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系
统。
3. 在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生
信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如
果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时
成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否
则无效。
4. 对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会
单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给
出具体处理意见之前,系统不会处理这些成绩。
5. 若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会
发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,
请求系统生成相应的成绩列表,用来提交考试委员会审查。
6. 在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是
否存在错误。主讲教师须将核对之后的成绩报告返还系统。
7. 根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试
委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于
所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。
请采用结构化方法对这个系统进行分析与设计,试画出顶层数据流图和分层数据
流图,并给出说明。
参考答案
图 1 顶层数据流图
图 2 分层数据流图
第 4 章 软件设计基础
1、什么是软件体系结构?你能说出几种典型的软件体系结构?
软件体系结构确定了系统的组织结构和拓扑结构,显示了系统需求和构成系
统的元素之间的对应关系,提供了一些设计决策的基本原理。
• 仓库模型
• 客户机/服务器模型
• 分布式对象结构
• 抽象机模型
2、简述“高内聚低耦合”的含义,并举例说明在软件设计中如何实现“高内聚低耦
合”。
答:答:内聚:又称为块内联系,指模块内部各成分之间相互关联的程度,以高
内聚为设计目标。
耦合:也称块间联系,模块之间相互联系程度的度量,联系越紧密,耦合性越强,
独立性越差,以低耦合为设计目标。
高内聚,低耦合在软件工程的基本要求,主要是说模快之间和模块内部之间的关系
紧密程度,高内聚就是提高模快内部的关联程度,低耦合当然就是降低模快之间的
关联程度
举例:(合理即可)
3、下面给出一个求实函数方程 F(x)在自变量区间 [a, b] 中的全部实根的算法。
首先阅读此程序,然后 (1) 画出消去全部 goto 语句的结构化程序流程图。
(2) 将它改成 N_S 图和和 PAD 图。
(3) 计算该程序的 McCabe 复杂性度量。
在算法中,a 与 b 是区间[a, b]的两端点值;eps1 与 eps2 是用户要求的求解精
度。如果区间中点的函数值的绝对值小于 eps1 或新的小区间的长度小于 eps2,
就认为这个中点为根。
float BinRoot ( float a, float b, float eps1, float eps2 ) {
float low= a,
high = b, mid,
fmid;
float flow = Func(low),
fhigh := Func(high);
label L1, L2, L3;
if ( flow * fhigh > 0.0 ) { BinRoot = 0;
mid = (low + high) / 2;
if ( abs ( fmid ) <= eps1 ) {
fmid = Func(mid);
BinRoot = mid; goto L3;
}
else if ( high - mid <= eps2 ) goto L2;
//标号说明,给定某些程序地址
//无实根
goto L3; }
else if ( flow * fmid > 0.0 ) { low = mid;
flow = fmid; goto L1; }
else { high = mid; goto L1 };
}
:
(
1
)
程
序
流
程
图
L1:
L2:
L3:
答
(2) N-S 图: