软工复习题
简答题
第 1-5 章
- 什么是软件,请简述软件的基本概念?
- 软件是由程序、数据及其相关文档构成的完整集合。它通过执行一系列指令来控制计算机硬件,从而完成特定的任务。 软件不仅包含计算机程序代码,还包括运行所需的数据和相关的文档,是计算机系统不可或缺的一部分。
- 什么是软件危机,为什么会产生软件危机?
- 软件危机是指在软件开发和维护过程中出现的一系列问题,例如成本超支、进度延误、质量低下等。这些问题的主要原因是软件需求的快速增长、软件规模的日益庞大、以及开发技术和管理方法相对落后。同时,软件维护费用急剧上升,也加剧了软件危机。
- 什么是软件生存周期,软件生存周期的主要活动是哪些?
- 软件生存周期是指软件产品从概念形成到最终淘汰的整个生命过程。它包括软件定义、软件开发和软件维护三个时期,以及问题定义、可行性研究、需求分析、概要设计、详细设计、编码和单元测试、综合测试、运行维护八个阶段。每个阶段都包含一系列特定的活动。
- 可行性研究包含哪些内容?
- 可行性研究主要评估软件项目在技术、经济、法律和操作等方面的可行性,以判断项目是否值得开展。 它是软件开发过程中的一个重要早期阶段,用于降低项目风险。
- 需求分析的任务是什么?
- 需求分析的任务是从用户视角理解并定义软件的功能和性能需求,然后将这些需求转化为开发团队可以理解和执行的规格说明。
- 需求分析要经过哪些步骤?
- 需求分析的步骤包括:需求获取、需求建模、需求描述(编写需求规格说明书)和需求验证。这是一个迭代过程,需要不断与用户进行沟通和确认。
- 需求规格书由哪些部分组成?各部分的主要内容是什么?
- 需求规格说明书(SRS)通常包含:引言、总体描述、功能需求、非功能需求、接口需求等部分。其中,引言描述项目背景,总体描述系统概述,功能需求定义系统需要实现的功能,非功能需求定义性能、安全等质量要求,接口需求定义系统与其他系统的交互方式。
- 简述SC图的作用
- SC图(结构图)是一种用于描述软件系统模块结构的工具,它显示了模块之间的层次关系、调用关系和数据传递路径。SC图是结构化设计中重要的可视化工具。
- 简述模块详细说明书的主要内容。
- 模块详细说明书详细描述了软件模块的功能、输入输出、算法、数据结构、接口、和调用关系等,它是详细设计的重要产出,为编码和测试提供了具体的指导。
- 简单比较第3章讲解的几种模块设计表达工具的优缺点。
- 数据流图(DFD)侧重于数据流和加工过程,结构图(SC图)侧重于模块结构,而加工规格说明 (PSPEC) 和数据字典(DD) 则用于描述具体的数据处理过程和数据定义。不同的工具适用于描述系统的不同方面。
- 简述事务性结构。
- 事务性结构描述系统如何处理事务,包括接收输入数据、执行事务、和输出结果。 这种结构强调的是数据处理的流程。
- 简述变换型结构。
- 变换型结构描述数据如何在不同形式之间转换, 包括输入、变换过程、和输出。这种结构强调的是数据的转换逻辑。
- 面向对象有哪些基本特征?简单描述各个特征。
- 面向对象的基本特征包括:抽象(关注本质特征,忽略无关细节),封装(将数据和操作组合为一个整体),继承(子类继承父类),多态(相同的操作可以应用于不同类型的对象)。这些特性使得软件系统具有更好的可复用性、可扩展性和可维护性。
- 软件需求的定义是什么?软件需求包含哪几个特性?
- 软件需求定义了软件系统必须满足的条件或具备的能力。 好的需求应具备功能性,可用性,可靠性,性能,可支持性,和设计约束等特性。
- 需求规格说明书一般包含哪些内容?
- 需求规格说明书通常包含:引言、总体描述、功能需求、非功能需求、接口需求、数据需求、约束条件等。它是软件开发过程中的重要参考文档,确保开发团队和用户对需求达成一致。
第 6-7 章
- 软件分析的目标是什么?包含哪些任务?
- 软件分析的目标是理解用户需求,并将其转化为可实现的设计模型。 主要任务包括:识别和确定分析类,建立对象-行为模型,和建立对象-关系模型。
- 软件需求和软件分析有哪些异同点?
- 软件需求侧重于描述用户希望软件“做什么”,而软件分析侧重于描述软件“怎么做”,也就是对需求进行建模和分析,为后续设计提供依据。
- 软件分析模型包含哪些内容?他们之间的联系是什么?
- 面向对象分析模型主要包含用例模型、对象-行为模型(如时序图/协作图)和对象-关系模型(如类图)。用例模型是基础,对象-行为模型描述系统行为,而对象-关系模型描述系统的结构。
- 什么是面向对象分析?其主要思想是什么?
- 面向对象分析(OOA)是一种以对象为中心来理解和描述系统的方法。它的主要思想是:抽象、封装、继承、和多态, 通过识别对象及其交互来实现对系统需求的理解。
- 如何将需求模型转化为软件分析模型?
- 需求模型可以通过识别用例中的参与者、功能和数据,映射到分析类(边界类、控制类和实体类),然后利用时序图或协作图来描述用例行为,最终建立类之间的关系模型,从而将需求模型转化为分析模型。
- 分析模型中静态模型和动态行为模型之间有哪些联系?
- 静态模型(如类图)描述系统的结构,而动态模型(如时序图、状态图)描述系统的行为。静态模型是动态模型的基础,而动态模型验证静态模型的正确性,二者相辅相成。
- 软件设计的概念是什么?
- 软件设计是将分析模型转化为可执行代码和系统的过程,目的是提供一个清晰、详细的解决方案蓝图,为后续编码提供指导。
- 面向对象设计的任务是什么?
- 面向对象设计(OOD) 的任务是将分析模型转换为详细的设计模型,包括定义类和对象、确定类之间的关系、选择合适的设计模式、以及设计系统的体系结构等。
- 解释下列名词:模块、模块化、模块化设计?
- 模块是软件系统中具有特定功能的可独立程序单元。模块化是将复杂系统分解为多个独立模块的过程。模块化设计是一种利用模块化思想来设计软件的方法,旨在提高软件的可维护性、可复用性和可扩展性。
- 模式的定义是什么?软件模式的分类是什么?请具体说明
- 模式是解决特定问题的通用解决方案,是软件设计中的一种最佳实践。软件模式可以分为:架构模式(描述系统的高层组织结构)、设计模式(提供具体设计问题的解决方案)、和习惯用法(指特定编程语言的常见使用模式)。
- 面向对象软件设计中,系统架构设计工作主要包含哪些活动?
- 系统架构设计主要包括:系统的高层结构设计、确定设计元素(如识别类和子系统)、确定任务管理策略、实现分布式机制、设计数据存储方案,以及人机界面设计。
- 利用JDBC,如何实现数据的持久性存储?
- 使用JDBC,可以通过加载数据库驱动、建立数据库连接、执行SQL语句、以及处理结果集等步骤来实现数据的持久性存储。
软件工程期末考试
总分:100分
一、选择题(每题1分,共20分)
软件危机是指( ) A. 软件开发人员短缺 B. 软件开发成本太高 C. 落后的软件生产方式无法满足迅速增长的软件需求 D. 计算机硬件发展缓慢
软件的定义是( ) A. 程序 B. 文档 C. 程序+文档 D. 数据+算法
软件工程的中心思想是( ) A. 把软件当作一种商品 B. 把软件当作一种艺术品 C. 把软件当作一种工业产品,要求采用工程化的原理与方法进行计划、开发和维护 D. 把软件当作一种科学研究
下列哪种编程范型遵循“程序=数据结构+算法”的思路?( ) A. 面向对象编程范型 B. 基于构件技术的编程范型 C. 过程式编程范型 D. 敏捷编程范型
面向对象编程范型中,数据及其操作被封装在( )中。 A. 模块 B. 组件 C. 对象 D. 接口
软件生存周期分为三个时期,以下哪个不属于这三个时期?( ) A. 软件定义 B. 软件开发 C. 软件维护 D. 软件测试
瀑布模型的特点不包括( ) A. 阶段间的顺序性和依赖性 B. 推迟实现的观点 C. 保证质量 D. 允许需求频繁更改
快速原型模型的中心思想是( ) A. 先编码,后测试 B. 先建立一个能反映用户主要需求的原型,反复改进 C. 将软件划分为多个模块,并行开发 D. 严格按照计划进行开发
以下哪种模型属于演化模型?( ) A. 瀑布模型 B. 快速原型模型 C. 增量模型 D. 形式化方法模型
螺旋模型最突出的特点是( ) A. 快速建立原型 B. 在项目各阶段都考虑风险 C. 严格划分阶段 D. 强调线性开发
在结构化分析中,用于描述数据流向的是( ) A. 圆框 B. 箭头 C. 方框 D. 双杠
SA模型的组成中,处于核心地位的是( ) A. DFD图 B. E-R图 C. 数据字典 D. STD图
结构化设计中,将DFD图转化为SC图,完成了( ) A. 详细设计 B. 编码 C. 总体设计 D. 测试
UML中,表示“一般与特殊”关系的是( ) A. 关联 B. 依赖 C. 泛化 D. 实现
UML中,表示“整体与部分”的强拥有关系的是( ) A. 关联 B. 聚集 C. 组合 D. 依赖
在UML动态图中,用于描述对象之间消息传递的时间顺序的是( ) A. 状态图 B. 时序图 C. 协作图 D. 活动图
软件需求一般包括三个层次,以下哪个不属于这三个层次? A. 业务需求 B. 用户需求 C. 功能需求 D. 技术需求
面向对象分析中,用于对参与者或外部交互协议的接口进行建模的是( ) A. 实体类 B. 控制类 C. 边界类 D. 抽象类
关于软件模块,以下说法错误的是? A. 模块是一个拥有明确定义的输入、输出和特性的程序实体 B. 对象不是一种模块 C. 模块化设计强调高内聚,低耦合 D. 模块是可复用软件组件
在软件测试中,等价类划分法属于( ) A. 白盒测试 B. 黑盒测试 C. 逻辑覆盖测试 D. 路径测试
二、判断题(每题1分,共10分)
- 软件工程就是软件开发过程。 ( F )
- 软件危机是由软件维护费用过高引起的。 ( T )
- 基于构件的开发技术与面向对象技术是完全不同的。 ( F )
- 增量模型中,每个增量的开发流程均可按瀑布模型或快速原型法完成。 ( T )
- 在UML中,依赖关系是永久性的。 ( F )
- 用例图描述软件系统内部的逻辑结构。 ( F )
- 时序图和协作图侧重于不同方面,但可以互相转换。 ( T )
- 软件需求分析的第一步是编写SRS。 ( F )
- 内聚性是从功能的角度对模块内部聚合能力的量度。 ( T )
- 黑盒测试是根据程序的内部结构进行测试。 ( F )
三、简答题(每题5分,共20分)
- 简述软件危机产生的原因。
- 软件维护费用急剧上升,直接威胁计算机应用的扩大
- 软件生产技术进步缓慢,是加剧软件危机的重要原因–许多人都意识到必须把软件生产从个人化的方法改变为工程化的方法
- 简述面向对象编程的四大基本特性。
- 抽象 忽略不重要的细节 关注本质特征
- 封装 将数据和操作隐藏起来 通过接口访问
- 继承 子类继承父类属性和方法 实现代码复用
- 多态 同一操作作用于不同对象 可以有不同的行为
- 简述瀑布模型的特点及优缺点。 按照时间线顺序实现软件开发各个阶段,在完成下一个阶段之前必须完成前一个阶段
优点是线性的 而且开发比较简单 易于理解和管理 适合中小型软件的开发
缺点是灵活性差 风险性高 难以适应需求变化
- 简述软件测试的目的、任务和特性。
软件测试的目的是为了发现程序的错误
其任务是在计算机上执行任务暴露程序中潜在的错误
特性:挑剔性 复杂性 不彻底性 经济性
四、画图问答题(共50分)
- (10分)请绘制一个简单的图书馆借阅系统的用例图,包含至少两个参与者和三个用例。并简述用例图的意义。
- 用例图示例:
graph LR A[读者] --> B[借阅图书] A --> C[归还图书] D[管理员] --> E[添加图书] D --> C
- 用例图的意义: 用例图主要用于描述软件系统的功能,展示系统与外部参与者之间的交互。它从用户视角出发,帮助理解系统的功能需求。
- (10分) 请根据下列文字描述,画出对应的类图: 一个学生可以选修多门课程,每门课程可以被多个学生选修。老师可以教授多门课程。每门课程由一个老师教授。
classDiagram class Student{ +studentID: String +name: String +enrollCourse() } class Course { +courseID : String +name: String +setTeacher() } class Teacher { +teacherID : String +name: String +teachCourse() } Student -- "*" Course : enroll Course -- "1" Teacher : teach
- (10分)请根据下列文字描述,画出对应的时序图:用户登录系统,输入用户名密码,系统验证后,返回登录成功信息。
sequenceDiagram participant 用户 participant 系统界面 participant 系统验证模块 用户->>系统界面: 输入用户名和密码 activate 系统界面 系统界面->>系统验证模块: 验证用户名和密码 activate 系统验证模块 系统验证模块-->>系统界面: 返回验证结果 deactivate 系统验证模块 系统界面-->>用户: 返回登录成功信息 deactivate 系统界面
(20分)给定一个简单的程序流程:如果 a > 0 并且 b > 0,则执行 c = a + b;否则,执行 c = a - b。
(1) 流程图:
graph LR A[开始] --> B{a > 0 且 b > 0?}; B -- 是 --> C[c = a + b]; B -- 否 --> D[c = a - b]; C --> E[结束]; D --> E[结束];
(2) 程序图:
graph LR A(开始) --> B{a > 0 且 b > 0}; B -- 是 --> C[c = a + b]; B -- 否 --> D[c = a - b]; C --> E(结束); D --> E(结束);
(3) 测试用例:
1 2 3 4 5 6 7 8 9 10 11 12 13
点覆盖: * 测试用例 1:a = 1, b = 1,预期结果:c = 2 * 测试用例 2:a = -1, b = 1,预期结果:c = -2 边覆盖: * 测试用例 1:a = 1, b = 1,预期结果:c = 2 * 测试用例 2:a = -1, b = 1,预期结果:c = -2 路径覆盖: * 测试用例 1:a = 1, b = 1,预期结果:c = 2 * 测试用例 2:a = -1, b = 1,预期结果:c = -2 * 测试用例 3:a = 1, b = -1,预期结果:c = 2 * 测试用例 4:a = -1, b = -1,预期结果:c = 0