《计算机科学导论》第十章课后作业解答(个人版)
复习题
-
定义"软件生命周期":
软件生命周期是指软件从概念形成、开发、维护直至淘汰和废弃的全过程。它涵盖了软件的规划、开发、测试、部署、运行、维护和升级等不同阶段,每个阶段都有明确的任务和目标,形成一个完整的生命周期过程。 -
区分瀑布模型和增量开发模型:
瀑布模型是一种线性的软件开发模型,按照顺序依次执行需求分析、设计、编码、测试和维护等阶段。每个阶段的输出作为下个阶段的输入,严格按照阶段进行开发,一旦进入下一阶段,难以回到前一个阶段。
增量开发模型是一种迭代的软件开发模型,将软件划分为多个增量或版本,每个版本增加新功能或修复问题。每个增量都是经过完整的软件开发生命周期,可以进行部署和运行。增量开发可以快速交付部分功能,逐步完善软件。 -
软件开发的4个阶段是什么:
a. 需求分析阶段:明确软件系统的功能和性能需求,收集用户需求,定义软件规格。
b. 设计阶段:设计软件的整体架构和模块,将需求转化为软件设计方案。
c. 实现阶段:进行编码和测试,将设计转化为实际的可执行代码。
d. 测试阶段:对软件进行全面测试,验证软件的功能和性能是否符合需求和设计。 -
说明分析阶段的目标,描述此阶段中的两种趋势:
分析阶段的目标是明确软件系统的需求,包括功能需求、性能需求、非功能需求等,理解用户需求和问题域,形成软件规格和需求文档。
两种趋势:
- 可变性增加:在分析阶段,需求可能会发生变化,因为可能在此阶段发现新的需求或用户需求进一步明确。因此,分析阶段需要具备灵活性,能够适应需求变更。
- 归纳与总结:分析阶段需要对用户需求进行归纳和总结,将用户的各种需求整理为具体的功能和性能规格,为后续的设计和开发提供明确的依据。
- 说明设计阶段的目标,描述此阶段中的两种趋势:
设计阶段的目标是根据需求规格,设计出系统的整体架构和各个模块的详细设计,确定模块之间的接口和交互方式。
两种趋势:
- 模块化:设计阶段要将软件拆分为模块,每个模块独立完成特定功能,模块之间高内聚、低耦合,便于开发和维护。
- 抽象与概括:设计阶段要进行抽象,将具体的功能转化为抽象的设计,使得设计更具通用性和可复用性。
- 描述模块化,说出与模块化有关的两个问题:
模块化是将软件系统拆分为多个模块,每个模块独立完成一个功能,通过模块之间的接口进行交互,便于开发和维护。
与模块化有关的两个问题:
- 内聚性:模块内部的元素之间的相关性度量。高内聚表示模块内部元素紧密相关,完成相同任务或功能;低内聚表示模块内部元素关联性较弱,完成多个不同的任务。
- 耦合性:模块之间的依赖程度度量。低耦合表示模块之间独立性高,修改一个模块不会影响其他模块;高耦合表示模块之间依赖性强,修改一个模块可能导致其他模块出现问题。
- 描述耦合和内聚之间的区别:
耦合和内聚都是用来度量模块之间的关系和交互程度:
- 耦合:衡量模块之间的依赖程度。高耦合意味着模块之间相互依赖程度高,修改一个模块可能会影响其他模块的功能或导致故障。低耦合意味着模块之间独立性高,修改一个模块不会对其他模块产生太多影响。
- 内聚:衡量模块内部元素之间的相关性程度。高内聚表示模块内部元素紧密相关,完成相同任务或功能,模块的功能单一。低内聚表示模块内部元素关联性较弱,完成多个不同的任务,模块的功能复杂多样。
- 说明实现阶段的目标,描述此阶段中的质量问题:
实现阶段的目标是将设计文档转化为实际的可执行代码,完成编码和测试。
质量问题:
- 可读性:代码应该易于阅读和理解,采用良好的命名规范和注释,方便其他人阅读和维护。
- 可维护性:代码应该易于维护和修改,避免复杂嵌套和冗余代码,采用模块化设计,使得修改一个模块不会影响其他模块。
- 说明测试阶段的目标,列出两类测试:
测试阶段的目标是对软件进行全面的测试,验证软件的功能和性能是否符合需求和设计。
两类测试:
- 静态测试:在测试过程中,不运行实际的软件代码,而是检查源代码或设计文档的正确性。静态测试包括代码审查、需求分析和设计评审等。
- 动态测试:在测试过程中,运行实际的软件代码,检查其运行结果是否正确。动态测试包括单元测试、集成测试、系统测试、性能测试等。
- 描述白盒测试和黑盒测试之间的区别:
白盒测试和黑盒测试都是动态测试的方法,但它们的侧重点不同:
- 白盒测试:也称为结构测试或透明盒测试,测试人员了解软件的内部结构和代码逻辑,根据代码的执行路径来设计测试用例,覆盖代码的每个分支和路径。白盒测试适用于单元测试和集成测试。
- 黑盒测试:也称为功能测试或不透明盒测试,测试人员不需要了解软件的内部结构和代码实现,只关注软件的功能和对输入输出的响应。黑盒测试通过测试用例检查软件是否按照需求规格进行工作,覆盖功能的各种情况。黑盒测试适用于系统测试和验收测试。
练习题
- 在第9章中,我们解释了常量的使用比字面值更受欢迎。这种偏好对软件生命周期的影响是什么?
常量的使用比字面值更受欢迎的做法在软件生命周期中可以带来以下几个影响:
- 维护性提高:使用常量可以将特定的数值或字符串集中管理,方便后续修改和维护。当需要修改某个数值或字符串时,只需要修改常量定义处,而不用在代码中逐个查找并修改。
- 可读性增强:通过使用常量,可以为数值或字符串赋予有意义的名称,提高代码的可读性和可理解性。这有助于开发人员更好地理解代码意图和功能。
- 代码重用:常量的使用可以促进代码的重用。多个地方使用相同的数值或字符串时,如果将其定义为常量,可以在多个模块中重复使用,减少代码冗余。
- 可维护性和可读性对于软件生命周期中的需求分析、设计、编码、测试和维护等阶段都非常重要,因为这些阶段需要开发人员理解、修改和扩展代码,合理使用常量可以提升整个软件系统的质量和可维护性。
-
在第9章中,我们说明了模块间的通信可以通过传值或传引用来进行。哪一种提供了模块间更少的耦合?
传值提供了模块间更少的耦合。当模块之间通过传值进行通信时,数据从一个模块传递到另一个模块时,实际上是创建了一个副本,而不是直接共享原始数据。这样可以保持模块之间的独立性,一个模块的修改不会直接影响到其他模块。 -
在第9章中,我们说明了模块间的通信可以通过传值或传引用来进行。哪一种提供了模块间更多的内聚?
传引用提供了模块间更多的内聚。通过传引用,模块之间可以直接共享相同的数据,而不是创建数据的副本。这样,多个模块共享同一份数据,有助于实现数据的一致性,提高了模块之间的联系和内聚性。 -
画出一个简单图书馆的用例图。
用例图:
- 用户登陆
- 查询图书
- 借阅图书
- 归还图书
- 增加新图书
- 画出一个小杂货店的用例图。
用例图:
- 用户登陆
- 浏览商品
- 添加商品到购物车
- 下订单
- 支付订单
- 显示简单数学公式 x + y 的数据流图。
数据流图:
- 输入数据流:x, y
- 处理:加法运算
- 输出数据流:结果
- 显示简单数学公式 x * y + z * x1 的数据流图。
数据流图:
- 输入数据流:x, y, z, x1
- 处理:乘法运算、加法运算
- 输出数据流:结果
- 显示图书馆的数据流图。
数据流图:
- 输入数据流:用户输入的图书查询信息
- 处理:图书查询处理
- 输出数据流:查询结果
- 显示小杂货店的数据流图。
数据流图:
- 输入数据流:用户选择的商品和购买信息
- 处理:生成订单和支付处理
- 输出数据流:订单和支付结果
- 创建练习题8的结构图。
结构图:
- 主模块:图书馆系统
- 子模块:图书查询处理
- 子模块:查询结果输出
- 创建练习题9的结构图。
结构图:
- 主模块:小杂货店系统
- 子模块:订单生成
- 子模块:支付处理
- 显示固定容量的堆栈(参见第12章)的状态图。
状态图:
- 状态:空
- 状态:有数据
- 事件:入栈
- 事件:出栈
- 显示固定容量的队列(参见第12章)的状态图。
状态图:
- 状态:空
- 状态:有数据
- 事件:入队列
- 事件:出队列
- 创建图书馆的类图。
类图:
- 类:图书馆
- 属性:图书列表
- 方法:查询图书
- 方法:借阅图书
- 方法:归还图书
- 方法:增加新图书
- 创建小杂货店的类图。
类图:
- 类:小杂货店
- 属性:商品列表
- 方法:浏览商品
- 方法:添加商品到购物车
- 方法:下订单
- 方法:支付订单
- 显示练习题14中类的细节。
类图细节:
- 类:图书馆
- 属性:图书列表:数组类型
- 方法:查询图书():返回图书信息列表
- 方法:借阅图书():借出图书并更新图书列表
- 方法:归还图书():归还图书并更新图书列表
- 方法:增加新图书():添加新图书并更新图书列表
- 显示练习题15中类的细节。
类图细节:
- 类:小杂货店
- 属性:商品列表:数组类型
- 方法:浏览商品():返回商品信息列表
- 方法:添加商品到购物车():添加商品到购物车列表
- 方法:下订单():生成订单并返回订单信息
- 方法:支付订单():支付订单并更新订单状态
-
一个程序的输入由1000到1999范围(包含)中的三个整数构成。求出测试这些数字的所有组合的穷尽测试的数目。
共有 (1999-1000+1) * (1999-1000+1) * (1999-1000+1) = 1000 * 1000 * 1000 = 1,000,000,000 组测试。 -
列出练习题18中所需要的边界值测试。
边界值测试需要考虑最小值、最大值以及最小值和最大值之间的一些特殊值,对于练习题18,边界值测试应包含以下测试组合:
- (1000, 1000, 1000)
- (1000, 1000, 1001)
- (1000, 1000, 1999)
- (1000, 1001, 1000)
- (1000, 1001, 1001)
- (1000, 1001, 1999)
- ...
- (1999, 1999, 1999)
- 一个随机数生成器能生成0到0.999间的一个数。该随机数生成器是如何用来做练习题18中所描述的系统的随机测试的?
对于练习题18中的系统随机测试,我们可以利用随机数生成器生成1000到1999范围内的三个随机整数作为输入数据。通过多次运行随机测试,可以覆盖更多的输入组合,验证系统在不同输入下的表现。这样可以帮助我们发现一些可能在常规测试中遗漏的错误和边界情况。但需要注意的是,随机测试并不保证能覆盖所有可能的输入组合,因此还需要结合边界值测试等其他测试方法来进行全面的测试。