简介:面向软件工程课程学习者,这份课后习题参考答案与《软件工程教程》(第2版)同步配套,主编为吴迪、马宏茹、丁万宁,适合计算机相关专业学生期末复习、考研备考或自学自测,也可供教师出题与备课参考。压缩包内为1个doc文档,大小约1.1MB,按章节顺序整理全书习题解答。从内容预览看,覆盖软件危机成因与表现、软件工程目标及质量权衡、软件生存周期与常见过程模型、SWEBOK知识体系,以及可行性研究中的成本效益分析、投资回收期计算等核心考点;选择题、填空题、简答题和计算分析题均有对应答案,便于读者逐章对照教材夯实基础。该资源已有3266人学习下载,适合需要系统梳理软件工程知识点、考前查漏补缺的读者。
1. 为什么《软件工程教程》的课后参考答案值得单独拆一份
《软件工程教程》第2版这套课后答案,我前后用了将近一年,带过两批备考的人,最大的感受是:它不是考试重点的搬运工,而是理解软件工程主线的一条捷径。软件危机、软件生存周期、SWEBOK知识域、瀑布模型与敏捷过程的差异,这些概念散落在不同章节,答案却把它们串成了一条完整的线:先搞清楚问题,再定过程模型,然后沿着需求分析、设计、测试的节奏往下走。适合正在准备期末考、考研复试,或者刚转行补理论基础的人。这篇把其中含金量最高的四块内容——可行性计算、DFD画法、结构映射、详细设计工具——展开讲透,顺便把答案里几处印刷错误标出来,免得你对着答案背了半天才发现数字对不上。
2. 可行性研究里的硬计算:折现、KLOC和数据字典
2.1 经济可行性不是拿收益减成本那么简单
教材里软件危机的第一条表现是“软件开发费用和进度失控”,而可行性研究的任务就是决定项目做还是不做。这个决定不能只看账面上的收入与支出,因为钱有时间价值。年利率10%的情况下,明年的1万块放到现在只值9091元左右,后年的1万块更不值钱。所以参考答案里所有经济计算题的第一步都是折现:把未来每年的收益分别除以(1+利率)^n,再求和,最后减去初始投资,得到纯收入。可行性研究要考察的四个维度——技术可行性、经济可行性、社会可行性、操作可行性,在这道题里主要落在经济维度上。货币时间价值、投资回收期、纯收入这三个填空考点,全部集中在同一道计算题里。
2.2 三道计算题的推演:先手算再复算,别直接背答案
我拿到这类参考资料的习惯是:先把每个计算题重新算一遍,再写几行脚本复核,防止自己抄错或答案印错。三个题数字不同,套路完全一致:纯收入 = Σ(第n年收益 / (1+利率)^n) - 初始投资。
以第2题为例,开发成本5万,未来三年收益分别为22000元、24000元、26620元,年利率10%。代入计算过程是:
第一年现值 = 22000 / 1.1 = 20000
第二年现值 = 24000 / 1.21 ≈ 19834.71
第三年现值 = 26620 / 1.331 = 20000
纯收入 = 20000 + 19834.71 + 20000 - 50000 = 9834.71 元
参考答案的结果是9834.71元,和我的复算一致。用Python验证更稳:
def npv_period(amounts, rate, investment): # amounts: 从第1年开始的逐年收益列表 # rate: 年利率(10%传0.1) # investment: 初始投资额 pv_sum = 0.0 for i, amount in enumerate(amounts, start=1): pv_sum += amount / ((1 + rate) ** i) return round(pv_sum - investment, 2) print(npv_period([22000, 24000, 26620], 0.1, 50000)) # 9834.71 print(npv_period([96000] * 5, 0.05, 200000)) # 215630.0第一个print对应教材第2题,第二个print对应CAD系统题:投资20万,每年节省9.6万,生存期5年,年利率5%,净收入算出来是215630元,也就是答案里的21.5630万元。这里参数要注意:amounts列表的顺序就是收益发生的年份,不能把列表长度当成年数;CAD题写了[96000] * 5,表示五年每年都是96000,如果写成[96000],结果会差出一个数量级。
第4题的投资回收期更有意思。题干写系统投资额为50000元,但后面表格和答案用的都是55000元。按答案的55000为准:前3年累计当前值54464元,还差55000 - 54464 = 536元;第4年当年当前值16454元,回收期 = 3 + 536 / 16454 ≈ 3.03年。如果你拿50000去算,纯收入和回收期全部对不上。这种“题干一个数、答案另一个数”的排版问题,全书里不止一处,遇到数字对不上先别怀疑自己,把公式重新代入验一遍。
2.3 工作量估算:3.75M源文件是怎么变成240人月的
第2章还有一道规模估算题,很多初学者在这里翻车。题干说“每一万行C语言源代码形成的源文件约250K”,某项目源文件大小3.75M。计算分三步:
第一步,算出项目源文件是250K的多少倍:3.75M / 250K = 15。
第二步,因为250K对应1万行,15倍就是15万行,也就是150KLOC。
第三步,用生产率0.625KLOC/人月,工作量 = 150 / 0.625 = 240人月;人工价1万/人月,总成本240万元;每行代码价值 = 240万 / 15万行 = 16元/行。
这里的单位转换要盯死:KLOC是“千行”,150KLOC等于15万行;人月是“一个人干一个月”,240人月不是240个月工期,而是表示总投入。如果把3.75M直接当3750K,再除以250K得到15,也要记住这个15对应的是“万行”,不是“15行”。答案里写的“3.75M/250K=15万行”,这个“万”字是承前省略,抄答案的人经常把这个单位漏掉,导致后面每行代码价值算成0.16元,血泪教训。
2.4 数据字典条目:电话号码的BNF式写法
应用题里有一道电话号码定义题,考的其实是数据字典的表示法。参考答案给的写法要拆开看:
电话号码 = 分机号 | 外线号码 分机号 = 7201…7299 外线号码 = 9 + [市话号码 | 长话号码] 长话号码 = 区号 + 市话号码 区号 = 100…300 市话号码 = 局号 + 分局号 局号 = [455 | 466 | 888 | 552] 分局号 = 4{数字}4这套记法的规则是:|表示“或”,+表示“连接”,[ ]表示“任选其一”,花括号表示重复次数。4{数字}4的意思是“恰好4位数字”,不是“4到4位”。考试丢分点有两个:一是把局号和区号的顺序写反,二是漏掉分局号的定义,只写“数字串”。数据字典存在的意义是给DFD里的每个数据流和存储做精确解释,这道题本质上是在考“如何把自然语言描述翻译成无歧义的结构化定义”。
3. 数据流图与数据字典:订货系统和图书馆系统的分层画法
3.1 画DFD之前,先把四类元素列成表
DFD的基本元素只有四类:源点/终点、处理、数据存储、数据流。很多人一上来就画箭头,结果画完发现源点直接连到数据存储,中间跳过了处理。参考答案对订货系统那题的处理方式是先列元素清单再画图:源点是仓库管理员,终点是采购员,处理是“事务处理”和“产生报表”,存储是“库存清单”和“订货信息”,数据流是“事务”和“订货报表”。把这张表列出来,图的骨架就出来了。源点/终点是系统之外的实体,数据流必须通过处理和存储发生关系,这条纪律一定不能破。
3.2 三层分解:顶层、0层、1层分别画到什么程度
DFD要分层画,答案给的是“顶层→0层→1层”逐步细化的路线。顶层图只有一个处理框“订货系统”,外面挂源点和终点,文字化表达就是:
仓库管理员(源点) → 事务 → 订货系统 订货系统 → 订货报表 → 采购员(终点)0层图把系统拆成“处理日常事务”和“产生报表”两个处理,同时引入“库存清单”和“订货信息”两个存储。1层图再把“产生报表”继续细化成查库存、比较临界值、生成报表等动作。
一个常见错误是:在顶层图就把两个存储画出来。顶层图是系统级,只允许出现处理框与外部实体的数据交换;内部存储要到0层图才出现。参考答案里顶层图叫“基本系统模型+源点+终点”,0层和1层才出现存储,这个分层纪律要记住。分层不是画得越细越好,每一层都要对上一层进行“合理的扩展”,而不是推翻重画。
3.3 订货报表的触发条件:库存量小于临界值
这道题的核心业务规则是:“当零件库存量少于库存量临界值,决定再次订货。”这条规则在DFD里怎么体现?答案的处理方式是:事务处理负责更新库存清单;“产生报表”这个处理读库存清单,判断哪些零件低于临界值,然后生成订货报表,写入订货信息存储。
如果只画两个处理框而不把“比较临界值”这个动作放进去,处理功能就不完整。数据流的命名也要带上业务含义,比如“库存查询结果”“临界值比较结果”,而不是笼统写“数据”。订货报表的数据内容要按题目列全:零件编号、零件名称、订货数量、目前价格、主要供应者、次要供应者,少一个都会被判漏数据流。
3.4 图书馆系统的三条分支:借书、还书、查询各画一张子图
图书馆系统这道应用题和订货系统不同,它的处理不是一条主链,而是借书、还书、查询三个分支。参考答案分别画出了三条分支的DFD。借书分支涉及“登记借书文件”和“修改库存”两个处理;还书分支涉及“更新借书文件”和“更新库存”;查询分支涉及“借阅查询”“库存查询”“打印统计表”。数据流分别对应借阅日期、读者信息、库存信息、统计表。
答案里特别强调了一句话:“登记借书文件”和“修改库存”谁先谁后影响不大。这是DFD的一个重要特性:数据流图只描述数据流动,不描述时间顺序。如果你在图上加一条表示先后顺序的箭头,或者用序号标出执行顺序,就偏离了DFD的语义。顺序问题属于控制流,该画在流程图里,不该画在DFD里。
3.5 从输出端回溯:做DFD题目的通用检查法
第3章简答题里把结构化分析方法讲得很明白:沿着数据流图从输出端往输入端回溯,确定每个数据元素的来源。这个方法不仅用于需求分析,也适合检查自己画的DFD。
拿到一道DFD题,按三步走:先看输出是什么,往左找是哪个处理产生的;再看这个处理需要哪些输入,这些输入来自哪个存储或源点;最后检查每个存储是否都至少被一个处理读过、被一个处理写过。如果某个存储只被读不被写,说明少了更新它的处理;只被写不被读,说明它没有参与数据处理流程。第3章应用题第一题还要求同时画DFD和E-R图,DFD管功能模型,E-R图管数据模型,两者不能混着画:DFD里的存储对应E-R图里的实体,但E-R图里的联系在DFD里体现为处理之间的数据流关系。
4. 从DFD到软件结构:总体设计映射的套路与边界
4.1 先判断变换型还是事务型,再定边界
第4章简答题给的总体设计步骤是:复查基本系统模型→复查并精化DFD→确定数据流图类型→确定数据流边界→完成第一级分解→第二级分解→优化。这里最关键的是“确定类型”和“确定边界”。
判断类型很简单:数据流从输入到输出基本是一条直线,中间有一个明显的变换中心,就是变换型;数据流进来后先到一个事务中心,再由它分派给多条动作路径,就是事务型。订货系统、工资管理系统偏变换型;图书馆系统借书、还书、查询三条路径是典型的事务型。边界找的是“输入流结束、变换中心开始”的位置,通常找最后一个读入数据的处理和第一个写出数据的处理,两者之间就是变换中心。机械地按教科书步骤分解,容易产生一些没用的控制模块,所以第4章特意强调“优化不能违背设计原理、不能违背问题域常识”。
4.2 工资管理子系统:把DFD变层次图的文字版
参考答案给工资管理子系统的层次图,用文字拆出来是这样:
工资管理系统 ├─ 录入数据 │ ├─ 录入水电费 │ ├─ 录入扣除信息 │ └─ 录入考勤 ├─ 计算工资总额 │ ├─ 计算水电费应扣除 │ ├─ 计算奖金 │ └─ 计算应扣税金 ├─ 生成工资表 └─ 输出工资表这个结构对应DFD里的“计算应扣税金、计算水电费应扣除、计算奖金、生成工资表”等处理。顶层控制模块负责调度,下层模块一一对应DFD中的处理。考试画层次图时,最容易漏的是“录入考勤”这一项:DFD里出勤天数数据流从职工直接进计算奖金处理,但在层次图里它必须归属到录入数据模块下面。层次图和DFD不是一一对应的复制,而是对处理进行分类归并。
4.3 图书管理系统的事务中心:接收事务之后分三条路
图书管理系统层次图和工资系统不一样,顶层不是一条线,而是“图书管理系统”直接分“业务办理”“日常管理”“用户查询”三个模块。业务办理里放借书证录入、证件检验、借书手续、还书手续;日常管理里放借阅查询、库存查询、打印统计表。
在DFD中,“接收事务”就是事务中心,它把事务分给借书、还书、查询三条分支。设计软件结构时,事务中心必须放在“接收事务”这个模块里,而不是把三个分支直接挂到顶层模块下。如果并列模块超过三个,一般要加中间层,保证顶层控制模块的扇出保持在7左右以内。图书管理系统这道题的主要考点就是:识别事务中心、确定每条分支的叶子模块、把输入输出分类整理。
4.4 模块化启发式规则的边界:扇入扇出不是越大越好
第4章简答题里的启发式规则,“扇入扇出适中”最容易理解偏。理论上扇入大说明复用程度高,扇出大说明控制能力强,但都不是越大越好。比如“打印统计表”模块被借书、还书、查询三个分支调用,扇入是3,合理;被十几个模块调用,打印格式一改,十几个调用点全要跟着改,维护成本爆炸。
扇出超过十个子模块,说明抽象层次有问题。经验范围是扇出3到7,扇入看实际复用需求,同时警惕“万能模块”。作用域落在控制域内这条规则也常考:一个模块判断图书是否超期,这个判断结果只能影响它自己控制范围内的模块,不能跨到兄弟模块去改变行为。还有一条容易忽略的是“功能分级”,第4章简答题把功能分级列为总体设计任务之一,意思是把系统功能按核心、重要、辅助分级排队,资源有限时先保核心功能,这条在画层次图阶段就要体现。
5. 详细设计工具避坑记录:流程图、盒图、PAD和判定树的五个坑
5.1 四种工具一句话选型表
第5章详细设计的基础任务包括:为每个模块确定算法、确定内部数据结构和数据库物理结构、确定模块接口细节、设计测试用例、编写文档。描述算法有图形、表格、语言三类工具,图形里有结构化程序流程图、N-S图(盒图)、PAD,语言里最典型的是PDL。选型前先看对比表:
| 工具 | 核心优点 | 主要缺点 | 适合场景 |
|---|---|---|---|
| 流程图 | 直观、容易被非技术人员接受 | 容易画出带箭头的非结构化流程 | 评审讲解、跨角色沟通 |
| N-S图(盒图) | 只能表达结构化逻辑 | 嵌套多时内层方框越来越小 | 强制结构化设计的练习 |
| PAD | 支持逐步求精,可自动生成程序 | 需要配合专用工具 | 教学演示和代码自动生成 |
| PDL | 能直接插入代码当注释 | 不如图形直观,复杂逻辑难读 | 详细设计文档、与编码衔接 |
结构化程序设计的三个要点是:自顶向下逐步求精、只用顺序选择循环三种控制结构、每个模块单入口单出口。这三句话几乎每年都在简答题里出现,但出题方式经常变成“给你一段程序设计,让你判断它是否符合结构化原则”。
5.2 坑1:把N-S图画成了流程图
现象:要求用盒图描述某个判断逻辑,交上来的图里出现了流程线和箭头,或者把选择结构画成从条件框两边拉出两条线再合并成一条。
原因:N-S图的设计初衷就是消除流程线。它的选择结构是把条件写在一个框的上部,下面并列两个子框,分别代表真分支和假分支;循环结构是把循环条件写在上边,执行体框在下面。只要脑子里还带着“箭头指引流程”的习惯,这套结构就画不出来。
解决:画盒图之前,先对着源逻辑问三个问题:这是顺序、选择还是循环?顺序就上下竖着排;选择就看条件框下放几个并列子框;循环就用“循环条件+执行体”框住。画完自我检查:整个图里不允许出现一条带箭头的线,出现就是翻车。
5.3 坑2:Halstead公式把操作数和运算符的位置代反
现象:第5章应用题第一题,程序对75个数据库项共访问1300次,对150个运算符共使用1200次,有人直接算成E = (150+75) × log2(1200+1300) / 3000,结果和标准答案差很多。
原因:Halstead错误预测公式是E = N × log2(n) / 3000,其中N是总出现次数,n是不同种类数。题目里“对75个数据库项共访问1300次”,75是数据库项的种类,1300是总访问次数;“150个运算符共使用1200次”,150是运算符种类数,1200是总使用次数。所以N = 1300 + 1200 = 2500,n = 75 + 150 = 225。
一个更稳的验算方式:
import math total_operators = 1200 # 运算符出现次数 total_operands = 1300 # 操作数出现次数 unique_operators = 150 # 运算符种类数 unique_operands = 75 # 操作数种类数(数据库项) N = total_operators + total_operands n = unique_operators + unique_operands E = N * math.log2(n) / 3000 print(round(E, 2)) # 6.5输出6.5,标准答案说预测包含6到7个错误。这里的3000是经验常数,不是可选项。代入公式前先把N和n各自的等式写出来,再按计算器,能避免把题干的四个数字全部塞错位置。
5.4 坑3:判定树漏掉“残疾乘客”这一层
现象:航空公司行李费那题,判定了国内/国外、头等舱/其他舱,画完才发现“残疾乘客”没地方放,或者把残疾乘客和国外乘客画成并列分支,最终价格全错。
原因:这个题有多个属性维度,判定树属于“先分大类再分小类”的结构。参考答案给的处理逻辑是:先判断超重,30kg为界;超重后第一层分“正常乘客/残疾乘客”,因为残疾乘客费率是正常的一半;在正常乘客下再分“国内/国外”,国外按国内两倍收费;最后在国内下分“头等舱/其他舱”,对应4元和6元。
解决:画判定树前先列出所有条件维度,再排优先级。行李费的优先级是:是否超重 > 是否残疾 > 国内/国外 > 舱位。按这个顺序逐层展开,分支才完整。组合收费值也可以先列表:头等舱国内4元、其他舱国内6元、头等舱国外8元、其他舱国外12元、残疾乘客在此基础上减半。表列完再画树,分支不会漏。
5.5 坑4:参考答案本身也会打错数字,别直接背
现象:题干写“2200元”,答案解析里代入的却是22000;题干写投资额50000,答案表格里又变成55000。照答案直接背,考试碰到原题数字改对时会直接懵。
原因:教材第2版的答案由多人分章撰写,计算题是后期校对最容易漏的地方。同一道题出现两套数字,不是理论问题,是排版问题。
解决:所有计算题全部重算一遍再决定背什么。算的时候别看答案,先自己列公式代入,算完再核对。第2章那道题,我复算时发现2200除以1.1等于2000,和答案里的20000对不上,反推就知道第一年收益应该是22000。这种“反推修正”是处理带印错的参考答案最实用的方法。这份答案里还有几处类似问题,都在第2章和第5章的计算应用题里,使用前值得专门花半小时统一核对。
6. 把参考答案转成自己的复习弹药:两遍法加费曼卡壳检测
6.1 两遍法:先独立做,再按知识点归错
第一遍,不翻答案,把课后题全部做一遍。做错的题按知识点分类:经济计算归一组,DFD归一组,结构设计归一组,详细设计工具归一组。第二遍,只重做错题,做完再对答案。如果第二遍仍然错,说明不是记不住,而是某个概念没理解。软件工程简答题的题干变化很多,死背只能对付原题,用两遍法把错题压缩到一个小范围里,重复刷小范围错题,效率比整本重背高一截。
6.2 费曼卡壳检测:把简答题当成面试题讲一遍
对每道简答题,不看答案,用自己的话口头讲一遍。比如“为什么要先做可行性研究”,如果你能讲出“技术能不能落地、钱划不划算、法规允不允许、维护跑不跑得动”这四点,说明真理解了;如果只能憋出一句“避免软件危机”,那就是卡壳,回到答案里重新看。这个方法尤其适合工具对比:四种详细设计工具的差别,不是靠背优点表,而是能讲出“为什么N-S图不可能出现交叉箭头”,整个逻辑就通了。
6.3 给计算题参数做一张小抄
成本效益分析、KLOC估算、Halstead错误预测,这三类计算题是容易稳定拿分的部分,值得单独整理。我的习惯是做一张小卡片:左边写公式,右边写单位。折现公式写“现值=未来值/(1+利率)^年数”,KLOC写“千行=万行×10”,Halstead写“N=总出现次数,n=种类数”。考前扫一遍,考时先代入单位再按公式。这套小抄用熟之后,再看参考答案,你关注的不再是数字本身,而是数字背后的推导路径。从那以后我每次给新人推资料,都会强制在开头写清楚哪几页有坑、哪几道题必须重算,踩坑清单比答案本身值钱。希望帮到你。
本文还有配套的精品资源,点击获取