软件工程-2
《软件工程》试卷2

《软件工程》试卷2一、选择题:(每题1分,共20分)(将答案写在题号前的()中)( C )1. 软件是()。
A. 处理对象和处理规则的描述B. 程序C. 程序及其文档D. 计算机系统( B )2. 软件需求规格说明的内容不应包括()。
A. 主要功能B. 算法的详细描述C. 用户界面及运行环境D. 软件的性能( B )3. 程序的三种基本控制结构是()。
A. 过程、子程序和分程序B. 顺序、选择和重复C. 递归、迭代和回溯D. 调用、返回和转移( D) 4. 面向对象的分析方法主要是建立三类模型,即( )。
A) 系统模型、ER模型、应用模型B) 对象模型、动态模型、应用模型C) E-R模型、对象模型、功能模型D) 对象模型、动态模型、功能模型( C ) 5. 在E-R模型中,包含以下基本成分( )。
A) 数据、对象、实体B) 控制、联系、对象C) 实体、联系、属性D) 实体、属性、操作( A) 6. 各种软件维护的类型中最重要的是( )。
A) 完善性维护B) 纠错性维护C) 适应性维护D) 预防性维护( B ) 7.软件测试的目标是()。
A. 证明软件是正确的B. 发现错误、降低错误带来的风险C. 排除软件中所有的错误D. 与软件调试相同( D )8.软件生命周期中所花费用最多的阶段是()A.详细设计 B.软件编码 C.软件测试 D.软件维护( C )9.若有一个计算类型的程序,它的输入量只有一个X,其范围是[-1.0, 1.0],现从输入的角度考虑一组测试用例:-1.001, -1.0, 1.0, 1.001.设计这组测试用例的方法是()A.条件覆盖法 B.等价分类法 C.边界值分析法 D.错误推测法( D )10、详细设计的基本任务是确定每个模块的( )设计A.功能 B.调用关系 C.输入输出数据 D.算法( A )11.设函数C(X)定义问题X的复杂程序,函数E(X)确定解决问题X需要的工作量(时间)。
软件工程第二次作业软件案例分析(二)2024

软件工程第二次作业软件案例分析(二)引言概述:本文旨在对软件案例进行分析,总结出其中的关键点,从而提供给读者对软件工程的实践经验。
本文分为五个大点进行阐述,包括需求分析、设计和实现、测试和验证、维护和部署以及总结。
需求分析:1. 理解案例需求:仔细研读软件案例的背景和目标,明确软件所要解决的问题。
2. 分析用户需求:采取访谈、调查问卷等方法,了解目标用户的实际需求和期望。
3. 提取功能需求:将用户需求转化为具体的功能需求,并进行优先级排序。
4. 确定非功能需求:除了功能需求,还需要考虑性能、安全、可靠性等非功能需求。
5. 确定需求文档:撰写详细的需求规格说明书,以便于后续的设计和开发工作。
设计和实现:1. 架构设计:根据需求分析结果,确定合适的软件架构模式,并进行系统分解和模块划分。
2. 模块设计:根据架构设计,进一步细化模块的功能和接口,确定模块之间的通信方式。
3. 编码实现:根据设计文档,采用适当的编程语言和开发工具,完成软件的编码工作。
4. 代码测试:编写和执行单元测试用例,检验代码的正确性和健壮性。
5. 集成测试:将各个模块进行集成,并进行系统级别的测试,确保系统的功能和性能要求。
测试和验证:1. 测试计划:制定详细的测试计划,明确测试目标、策略和方法。
2. 单元测试:针对每个模块编写测试用例,并进行单元测试,确保模块的功能正确。
3. 集成测试:将各个模块进行集成测试,测试系统的功能和接口是否正常。
4. 系统测试:对整个系统进行全面测试,包括功能、性能、安全等各个方面。
5. 验证与确认:通过测试结果验证系统是否满足需求,并进行用户确认,是否满足用户期望。
维护和部署:1. 软件交付:将软件部署到生产环境中,并进行系统的安装和配置。
2. 问题修复:及时响应用户的问题反馈,进行故障排查和修复。
3. 功能扩展:根据用户需求和市场变化,对软件进行功能的增加和改进。
4. 性能优化:监控系统性能,进行性能优化,提升软件的响应速度和稳定性。
软件工程第2讲 软件生命周期模型

敏捷开发4软件生命周期模型1瀑布模型及几个衍生模型2迭代和递增3其他生命周期模型及模型比较5敏捷开发4软件生命周期模型1瀑布模型及几个衍生模型2迭代和递增3其他生命周期模型及模型比较57P32: 2.9.2P23: 2.2 P25: 2.3P34: 2.9.3模型构造多使用脚本语言、基于现有基础代码库、UI工具制作,制作过程一般不会考虑性能、稳定敏捷开发4软件生命周期模型1瀑布模型及几个衍生模型2迭代和递增3其他生命周期模型及模型比较5迭代-递增生命周期模型递增也是软件工程的一个固有特性P27P26: 2.5P28P29P30 2.7敏捷开发4软件生命周期模型1瀑布模型及几个衍生模型2迭代和递增3其他生命周期模型及模型比较58个体和交互胜过过程和工具以人为本我相信没有比面对面交流更高效的沟通渠道了•尊重和信任激发个人内心的责任感和使命感,激发了个体的潜能。
•基于互相信任的前提,敏捷提倡自治的全功能团队。
在工作形式上,整个团队平时坐在一起工作,从物理空间上创造了更加便捷面对面的沟通机会。
•要摒弃这种重流程和重工具,提倡轻量级流程和轻量级工具,而这些流程和工具又在促进个体交互。
比如,我们在日常工作中会使用Trello、Jira、Keynote等工具。
可以工作的软件胜过面面俱到的文档价值导向为客户交付可工作的软件是我们的核心目标•我们应该尽早交付可进行端到端测试的代码,该目标决定了我们不应该花过多精力在面面俱到的文档上。
•但这不代表我们要抵制任何文档。
实践证明,轻量级的文档策略有助于团队高质量交付可工作的软件。
•在开发过程中,交互设计原型也是一种轻量级文档,交互设计师交付可以尽早地跟团队和客户进行确认验收的核心业务场景的原型,快速收集反馈。
客户合作胜过合同谈判客户团队帮助客户实现他们真正想要的价值•让客户也作为团队的一分子,跟客户建立信任的合作关系取代敌对的谈判关系。
•需求的变化往往来自客户,让客户参与进来可以在开发的过程中尽早的发现变化,从而尽早采取解决方案。
软件工程 软件设计方法(二)2024

软件工程软件设计方法(二)引言概述:软件设计方法是软件工程领域中至关重要的一部分,它涉及到软件系统架构、模块设计、接口设计等多个方面。
本文将着重介绍软件设计方法的五个主要方面,包括需求分析、系统架构设计、模块划分、接口设计和可重用性。
正文:1. 需求分析- 确定用户需求:通过与用户沟通,明确软件系统的功能需求和性能需求。
- 业务流程分析:了解用户的业务流程,以便设计出符合实际业务需求的软件。
- 数据模型设计:根据需求对数据进行建模,定义数据实体、属性和关系。
2. 系统架构设计- 划分子系统:将整个软件系统分解为多个相对独立的子系统,每个子系统负责特定的功能。
- 确定系统层次:定义子系统之间的层次结构和依赖关系,保证系统的稳定性和可扩展性。
- 选择适当的架构风格:根据软件系统的特点和需求,选择适合的架构风格,如客户端-服务器、分层或微服务等。
3. 模块划分- 确定模块功能:根据系统需求和架构设计,将系统功能划分为不同的模块。
- 设计模块接口:定义模块之间的接口规范,确保模块之间的协同工作和信息交互。
- 模块详细设计:对每个模块进行详细设计,包括内部数据结构和算法的设计。
4. 接口设计- 定义接口规范:确定模块之间的接口规范,包括输入输出参数、数据格式等。
- 接口协议设计:设计合适的接口协议,包括数据传输格式、访问控制等。
- 接口测试和验证:进行接口测试,确保接口的正确性和稳定性。
5. 可重用性- 模块复用:设计和实现可重用的模块,以提高软件的开发效率和质量。
- 组件库开发:建立组件库,将常用的功能模块抽象为可重用的组件,方便后续开发过程中的重用。
- 框架设计:设计通用的框架,提供开发的基础设施和通用功能。
总结:通过本文对软件设计方法的介绍,我们可以看到,在软件工程中,软件设计方法的重要性不可忽视。
通过需求分析、系统架构设计、模块划分、接口设计和可重用性等方面的综合考虑,可以设计出高效、可靠、可维护的软件系统。
软件工程第二章软件过程

第二章:软件过程目标:软件工程和软件过程模型的概念;了解3个一般的软件过程模型及何时使用它们;了解软件需求工程,软件开发,测试和进化中所涉及的基本过程活动;理解为什么软件过程要有效地组织以应对软件需求和设计上的变更;了解Rational统一过程是如何集成好的软件过程实践来产生一个可适应的软件过程。
所有的软件过程都必须具有4种对软件工程来说是基本的活动。
它们是:1.软件描述:必须定义软件的功能以及软件操作上的约束。
2.软件设计和实现:必须生产符合描述的软件。
3.软件有效性验证:软件必须得到有效性验证,即确保软件是客户所想要的。
4.软件进化:软件必须进化以满足不断变化的客户需要。
2.1软件过程模型一软件过程模型一般有1.瀑布模型:该模型将基本的过程活动,描述,开发,有效性验证和进化,看成是一些界限分明的独立的过程阶段,例如,需求描述阶段,软件设计阶段,实现阶段,测试阶段,等等。
2.增量式开发:该方法使得描述活动,开发活动和有效性验证活动交织在一起。
系统的开发是建立一系列的版本(增量),每个版本添加部分功能到先前的版本中。
3.面向复用的软件工程:该方法使得描述活动,开发活动和有效性验证活动交织在一起。
系统开发过程着重于集成这些组件到新系统中,而非从头开发。
2.1.1瀑布模型一瀑布模型中的主要阶段直接映射基本的开发活动:1.需求分析和定义2.系统和软件设计3.实现和单元测试4.集成和系统测试5.运行和维护二适合采用瀑布模型的时候瀑布模型是与其他工程过程模型相一致的,在它的每个阶段都要生成文档。
这使得过程是可见的,项目经理能够根据项目计划监控项目的过程。
它的主要问题在于它将项目生硬地分解成这些清晰的阶段。
关于需求的责任和义务一定要在过程的早期阶段清晰界定,而这又意味它对用户需求变更的响应较困难。
所以只有在对需求了解的好,而且在系统开发过程中不太可能发生重大改变的时候,适合采用瀑布模型。
瀑布模型的一个重要变形是形式化系统开发。
软件工程第2章-系统工程

软件工程第2章-系统工程软件工程第2章-系统工程2.1 系统工程概述系统工程是一种系统性和综合性的工程方法,旨在设计、开发和维护复杂的软件系统。
系统工程的主要目标是满足用户需求,并确保系统的有效性、可靠性和可维护性。
2.1.1 系统工程定义系统工程是一个跨学科的领域,涉及到多个专业领域的知识和技术。
它集成了工程学、计算机科学、信息技术等多个学科的理论与实践,以解决大规模软件系统开发和维护过程中的各种问题。
2.1.2 系统工程过程系统工程的过程涵盖了软件系统的整个生命周期,包括需求分析、设计、开发、测试、部署和维护等阶段。
每个阶段都有特定的任务和活动,并且需要进行严格的管理和控制。
2.1.2.1 需求分析阶段需求分析阶段是系统工程的起点,通过与用户沟通和交流,收集和整理用户需求,并将其转化为系统的功能和性能要求。
2.1.2.2 设计阶段在设计阶段,系统工程师会根据需求分析阶段的成果,设计整个系统的结构和组件之间的关系。
这包括系统架构设计、模块设计和接口设计等。
2.1.2.3 开发阶段开发阶段是系统工程中最为关键的阶段,主要是根据设计阶段的成果,进行软件编码、集成和测试。
开发人员需要按照设计规范和编码标准进行开发工作,并保证代码的质量和可维护性。
2.1.2.4 测试阶段测试阶段是为了验证系统是否满足用户需求,并发现和修复潜在的缺陷和问题。
测试人员会执行各种测试活动,包括单元测试、集成测试和系统测试等。
2.1.2.5 部署阶段在部署阶段,系统工程师会将已经通过测试的系统部署到目标环境中,并进行安装、配置和调优等工作,确保系统能够正常运行。
2.1.2.6 维护阶段维护阶段是系统工程的最后一个阶段,主要是为了确保系统能够持续地运行和满足用户的需求。
维护人员会定期检查系统的性能和可靠性,并进行必要的修复和优化等工作。
2.2 系统工程的关键技术2.2.1 需求工程需求工程是系统工程中非常重要的一环,它主要涉及到需求获取、需求分析、需求验证和需求管理等方面的内容。
国家开放大学软件工程形考2-满分题目和答案
试题1正确得分 1.00/1.00 分标记试题试题正文面向对象设计强调定义(),并且使它们相互协作来满足用户需求。
选择一项:A.软件对象B.物理模型C.E-R模型D.接口反馈你的回答正确试题2正确得分 1.00/1.00 分标记试题试题正文()是从用户的观点描述系统功能,它由一组用例、参与者以及它们之间关系所组成。
选择一项:A.用例图B.顺序图C.对象图D.类图反馈你的回答正确试题3正确得分 1.00/1.00 分标记试题试题正文()用于描述系统的功能集。
选择一项:A.组件视图B.用例视图C.对象视图D.逻辑视图反馈你的回答正确试题4正确得分 1.00/1.00 分标记试题试题正文UML 语言支持的建模方式不包括有()。
选择一项:A.功能建模B.动态建模C.模块化建模D.静态建模反馈你的回答正确试题5正确得分 1.00/1.00 分标记试题试题正文UML 中,包图是一种()。
选择一项:A.数据结构B.集合C.分组机制D.对系统的动态描述反馈你的回答正确试题6正确得分 1.00/1.00 分标记试题试题正文UML是一种()。
选择一项:A.过程B.可视化的建模语言C.可视化的程序设计语言D.建模工具反馈你的回答正确试题7正确得分 1.00/1.00 分标记试题试题正文UML是一种()语言。
选择一项:A.面向对象B.交互式建模C.过程描述D.程序设计反馈你的回答正确试题8正确得分 1.00/1.00 分标记试题试题正文类的属性结构要坚持简单的原则,尽可能不使用复杂的()。
选择一项:A.参数B.方法C.数据结构D.处理反馈你的回答正确试题9正确得分 1.00/1.00 分标记试题试题正文继承耦合是()之间的一种关联形式,设计时应该适当使用这种耦合。
A.虚类与实体类B.一般化类与特殊化类C.数据类与处理类D.控制类与界面类反馈你的回答正确试题10正确得分 1.00/1.00 分标记试题试题正文包含关系用于构造多个用例()。
软件工程课后习题答案2-12章
书状态为S2&终端 输入“H=”加书名 管理员设置状 态 管理员删除 管理员添加
预约
书出库(删除) 书入库
图4.4.2
(三)图书馆终端用户模式的有穷状态机描述 • 状态机J:{读者查询状态,查询结果} • 输入集K:{终端输入用户查询命令,书的各种 状态(S1,S2,S3)} • 转换函数T:如图4.4.3所示 • 初始态S:{读者查询状态} • 终态集F:{查询结果}
取票通知 账单 机票 账单
P3.1 核对取票凭证 顾客 取票通知 P3.2 交款 机票 P3.3 打印机票
机票预定系 统
信 息 通 知 单 机 票
账
单
信息
机票
通
预定信息处 理
信息
知
账
通
单
有
单
取票凭证处 理
通知 账单 单
账单
信 息 定 预 航班信
息
机票预定子 系统
单 知
机票发放子 系统
效 通 知
机
票
取款单
P3.1输入取款 信息
取款信息 E1储 户 密码 P3.2 密码校验
P4 计算利息
利息 利息 P5 打印利息 清单
密码正确信息
E2业 务员
利率
P6设置利 率
利率
不能是两个分开的子系统,是相同的前台单个处理
银行储蓄系 统
存 款 单 款
率 利
利 存单 息清单
密 码
业务单据录 入
利 率
存款单
取
单
储蓄业务处理
(一)图书状态的有穷状态机描述 • 状态机J:{书在图书馆S1,书被借出S2, 书被预约S3} • 输入集K:{书上条形码,借阅卡条形码, 终端输入各种命令} • 转换函数T:如图4.4.1所示 • 初始态S:{书在图书馆S1,书被借出S2} • 终态集F:{书被借出S2,书被预约S3}
软件工程实训项目案例IIAndroid移动应用开发篇课程设计
软件工程实训项目案例II-Android移动应用开发篇课程设计一、项目背景及目的随着手机硬件的不断升级,移动应用的市场需求也越来越高,特别是Android平台的应用开发,已成为最热门的开发领域之一。
为提高学生的实践能力,本课程设计要求学生通过团队协作,完成一款功能完整,操作便捷,具备商用价值的Android移动应用程序。
二、项目要求1.应用主题及功能设计本项目要求团队选择一款具有实际商业价值的应用主题,该主题需至少包含以下功能:•一个完整的应用程序组织框架;•至少2种不同类型的用户可注册并登录系统;•至少3个数据表及其UI的设计和交互;•至少实现一个数据存储的基础操作,例如数据添加、数据查询、数据修改、数据删除等;•至少实现一项数据清理、数据导出、导入等操作;•至少实现一个离线本地存储,在离线情况下缓存待上传数据;•一个较为完整的商业化UI设计,包括各类控件,布局,配色、动画等。
2.技术要求•使用Android Studio进行开发,界面布局采用XML;•使用SQLite实现数据存储;•对网络请求,可以使用操作系统提供的HttpURLConnection或第三方库;•在代码注释、文档等方面需高度重视软件工程规范;•注重代码可读性及可维护性;3.团队协作•团队成员之间需要高度配合,互相支持;•每位团队成员都要积极参与项目的讨论、设计以及代码编写;•团队需定期进行进度汇报,及时解决问题和调整方向;4.文档要求•每位团队成员需提交一份个人贡献报告,说明个人所负责的部分,以及解决问题和收获的过程;•团队需提交项目开发文档、技术文档以及用户手册等相关文档;•所有文档需要输出为Markdown文本格式;三、项目计划1.项目周期本项目约定为3个月内完成,其中前2个月主要为需求分析与设计,最后1个月为开发和测试。
2.里程碑•第1周:确定团队合作方式和主题;•第2周:需求分析,确定主要功能需求;•第3周:UI设计、确定技术选型;•第4周-第5周:进行详细需求说明书的编写,包括数据表设计、业务流程图、系统用例等;•第6周-第7周:根据详细说明书进行逐一实现;•第8周:完成全部功能和测试;•第9周:优化及完善,准备项目答辩。
软件工程第1-2章课后习题参考答案
第一章课后参考答案1.什么是软件危机?它们有哪些典型表现?为什么会出现软件危机?“软件危机”是指计算机软件的“开发”和“维护”过程中所遇到的一系列“严重问题”。
这些问题决不仅仅是不能正常运行的软件才具有的,实际上,几乎“所有软件”都不同程度地存在这些问题。
“软件危机”包含两方面的问题:(1)如何开发软件,以满足对软件日益增长的需求;(2)如何维护数量不断膨胀的已有软件。
它们有以下表现:(1)对软件开发成本和进度的估计常常很不准确;(2)用户对“已完成的”软件系统不满意的现象经常发生;(3)软件产品的质量往往靠不住;(4)软件常常是不可维护的;(5)软件通常没有适当的文档资料;(6)软件成本在计算机系统总成本中所占的比例逐年上升;(7)软件开发生产率提高的速度,远远跟不上计算机应用普及深入的趋势。
出现软件危机的原因(1)开发人员与客户认识之间的矛盾(2)开发人员能力与开发目标之间的矛盾(3)预估与实际工作量之间的矛盾(4)客户认识的提高与软件维护之间的矛盾(5)遗产系统与实施软件之间的矛盾2.假设自己是一家软件公司的总工程师,当把图1.1给手下的软件工程师们观看,告诉他们及时发现并改正错误的重要性时,有人不同意这个观点,认为要求在错误进入软件之前就清楚它们是不现实的,并举例说:“如果一个故障是编码错误造成的,那么,一个人怎么能在设计阶段清除它呢?”应该怎么反驳他?答:在软件开发的不同阶段进行修改付出的代价是很不相同的,在早期引入变动,涉及的面较少,因而代价也比较低;在开发的中期,软件配置的许多成分已经完成,引入一个变动要对所有已完成的配置成分都做相应的修改,不仅工作量大,而且逻辑上也更复杂,因此付出的代价剧增;在软件“已经完成”是在引入变动,当然付出的代价更高。
一个故障是代码错误造成的,有时这种错误是不可避免的,但要修改的成本是很小的,因为这不是整体构架的错误。
3.什么是软件工程?它有哪些本质特征?怎么用软件工程消除软件危机?软件工程是知道计算机软件开发和维护的一门工程学科。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序编码习题【4-1】从下列关于模块化程序设计的叙述中选出5条正确的叙述。
①程序设计比较方便,但比较难以维护。
②便于由多个人分工编制大型程序。
③软件的功能便于扩充。
④程序易于理解,也便于排错。
⑤在主存储器能够容纳得下的前提下,应使模块尽可能大,以便减少模块的个数。
⑥模块之间的接口叫做数据文件。
⑦只要模块之间的接口关系不变,各模块内部实现细节的修改将不会影响别的模块。
⑧模块间的单向调用关系叫做模块的层次结构。
⑨模块越小,模块化的优点越明显。
一般来说,模块的大小都在10行以下。
【4-2】结构化程序设计有时被错误地称为“无GOTO语句”的程序设计。
请说明为什么会出现这样的说法,并讨论环绕着这个问题的一些争论。
【4-3】从下面关于程序编制的叙述中,选出三条正确的叙述。
①在编制程序之前,首先必须仔细阅读给定的程序说明书。
然后,必须如实地依照说明书编写程序。
说明书中常会有含糊不清或难以理解的地方。
程序员在作业时应该对这些地方作出适当的解释。
②在着手编制程序时,重要的是采用既能使程序正确地按设计说明书进行处理,又易于出错的编写方法。
③在编制程序时,首先应该对程序的结构充分考虑,不要急于开始编码,而要象写软件文档那样,很好地琢磨程序具有什么样的功能,这些功能如何安排等等。
④考虑到以后的程序变更,为程序编写完整的说明书是一项很重要的工作。
只要有了完整的程序说明书,即使程序的编写形式难以让他人看懂也没有什么关系。
⑤编制程序时不可缺少的条件是,程序的输入和输出数据的格式都应确定。
其他各项规定都是附带的,无足轻重。
⑥作为一个好的程序,不仅处理速度要快,而且易读易修改等等也都是重要的条件。
为了能得到这样的程序,不仅要熟悉程序设计语言的语法,还要注意采用适当的规程和单纯的表现方法,注意使整个程序的结构简洁。
【4-7】下面给出一个求实函数方程F(x)在自变量区间[a, b] 中的全部实根的算法。
首先阅读此程序,然后画出消去全部goto语句的结构化程序流程图。
在算法中,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; goto L3; } //无实根 L1: mid = (low + high ) / 2; fmid = Func (mid );if ( abs ( fmid ) <= eps 1 ) { L2:BinRoot = mid ; goto L3;}else if ( high - mid <= eps 2 ) goto L2;else if ( flow * fmid > 0.0 ) { low = mid ; flow = fmid ; goto L1; } else { high = mid ; goto L1 }; L3:}习题解答【4-1】正确的叙述有②、③、④、⑦、⑧。
如果程序结构的模块化满足评价的标准(高内聚,低耦合),这样的结构是容易编码,容易测试,容易理解,容易修改,容易维护的。
程序的功能也容易扩充。
特别适合于大型程序编制时,多人分工合作,协同完成任务的情形。
因为是采用自顶向下,逐层分解来划分模块结构的,所以模块之间的调用关系是分层次的模块结构,就叫做模块的层次结构。
模块之间的信息传递叫做模块的接口,模块之间传递信息可以通过参数表、全局变量或全局数据结构、数据文件、专门的通信模块,不是专指数据文件。
划分模块时,模块大小要适中。
模块太大,控制路径数目多、涉及的范围广、变量的数目多、总体复杂性高,可理解性、可修改性、可靠性就会变差。
模块太小,模块个数增大,调用的系统开销就会增大。
所以要有一个权衡。
【4-2】早在1963年,针对当时流行的ALGOL 语言,Peter Naur 指出,在程序中大量地,没有节制地使用GOTO 语句,会使程序结构变得非常混乱。
但是很多人还不太注意这一问题。
以致许多人写出来的程序仍然是纷乱如麻的。
1965年,E.W.Dijkstra 在一次会议上提出,应当把GOTO 语句从高级语言中取消。
并指出,程序的质量与程序中包含的GOTO 语句的数量成反比。
在这种思想的影响下,当时新开发的几种高级程序设计语言,例如LISP 、ISWIM 、BLISS 等,都把GOTO 语句取消了。
1966年,Bohm 与Jacopini 证明了任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。
这三种基本控制结构就是“顺序结构”、“选择IF -THEN-ELSE 结构”、“重复DO -WHILE 或DO -UNTIL 结构”。
1968年,Dijkstra 在写给<ACM>(美国计算机协会通讯)杂志编辑部的信中再次建议从一切高级语言中取消GOTO 语句,只使用三种基本控制结构编写程序。
他的建议引起了激烈的争论。
争论集中在如何看待GOTO 语句的问题上。
赞成取消 GOTO 语句的一方认为,GOTO 语句对程序清晰性有很大破坏作用,凡是使用GOTO 语句多的程序,其控制流时而GOTO 向前,时而GOTO 向后,常使程序变得很难理解,从而增加查错和维护的困难,降低程序的可维护性。
但以D.E.Knuth 为代表的另一方认为,GOTO 语句虽然存在着破坏程序清晰性的问题,但不应完全禁止。
因为GOTO 语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,并且GOTO语句可直接得到硬件指令的支持。
经过争论,人们认识到,不是简单地去掉GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,以显著提高软件生产率和软件质量,降低软件维护的成本。
70年代初N.Wirth在设计Pascal语言时对GOTO语句的处理可被当做对GOTO 语句争论的结论。
在Pascal语言中设置了支持上述三种基本控制结构的语句;另一方面,GOTO 语句仍然保留在该语言中。
不过,N.Wirth解释说,通常使用所提供的几种基本控制结构已经足够,习惯于这样做的人不会感到GOTO语句的必要。
也就是说,在一般情况下,可以完全不使用GOTO语句。
如果在特殊情况下,由于特定的要求,偶然使用GOTO语句能解决问题,那也未尝不可,只是不应大量使用罢了。
事实上,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,从而使程序变得不易阅读,给程序的测试和维护造成困难,还会增加出错的机会,降低程序的可靠性。
因此要控制GOTO语句的使用。
但有时完全不用GOTO语句进行程序编码,比用GOTO语句编出的程序可读性差。
例如,在查找结束时,文件访问结束时,出现错误情况要从循环中转出时,使用布尔变量和条件结构来实现就不如用GOTO语句来得简洁易懂。
【4-3】①、④、⑥。
编制程序的过程实际上是根据设计的结果,用某种机器能够识别的程序设计语言,将设计翻译成机器代码的过程。
因此,必须如实地按照设计说明书编写程序。
至于设计说明书中含糊不清的地方,应当在编程时与分析人员或设计人员协商,对这些地方做出适当的解释。
另外,考虑到将来的程序修改,必须为程序编写完整的说明书,同时程序必须编写得容易让别人看得懂,这样程序才容易修改,修改时不容易出错,而且容易验证修改后得结果。
还有,编写程序的人不须重新考虑程序要完成什么功能,这些已经在软件分析与设计过程中充分考虑过了。
【4-7】结构化的程序流程图:软件测试复习要求1. 了解软件测试的目的和原则。
2. 了解软件错误的分类。
3. 了解软件测试的过程和策略。
4. 了解软件测试用例设计的方法,掌握逻辑覆盖、基本路径测试、因果图等测试用例设计方法。
5. 了解程序静态测试的方法。
习题【5-1】从供选择的答案中选出应填入下列( )中的字句。
软件测试的目的是( A )。
为了提高测试的效率,应该( B )。
使用白盒测试方法时,确定测试数据应根据( C )和指定的覆盖标准。
与设计测试数据无关的文档是( D )。
软件的集成测试工作最好由( E )承担,以提高集成测试的效果。
供选择的答案:A. ①评价软件的质量②发现软件的错误③找出软件中的所有错误④证明软件是正确的B. ①随机地选取测试数据②取一切可能的输入数据作为测试数据③在完成编码以后制定软件的测试计划④选择发现错误的可能性大的数据作为测试数据C. ①程序的内部逻辑②程序的复杂程度③使用说明书④程序的功能D. ①该软件的设计人员②程序的复杂程度③源程序④项目开发计划E. ①该软件的设计人员②该软件开发组的负责人③该软件的编程人员④不属于该软件开发组的软件设计人员【5-2】请从供选择的答案中选出应填入下列()中的字句。
程序的三种基本控制结构是( A )。
它们的共同点是( B )。
结构化程序设计的一种基本方法是( C )。
软件测试的目的是( D )。
软件调试的目的是( E )。
供选择的答案:A. ①过程,子程序,分程序②顺序,条件,循环③递归,堆栈,队列④调用,返回,转移B. ①不能嵌套使用②只能用来写简单的程序③已经用硬件实现④只有一个入口和一个出口C. ①筛选法②递归法③归纳法④逐步求精法D. ①证明程序中没有错误②发现程序中的错误③测量程序的动态特性④检查程序中的语法错误E. ①找出错误所在并改正之②排除存在错误的可能性③对错误性质进行分类④统计出错的次数【5-3】从下列关于软件测试的叙述中,选出5条正确的叙述。
(1) 用黑盒法测试时,测试用例是根据程序内部逻辑设计的。
(2) 尽量用公共过程或子程序去代替重复的代码段。
(3) 测试是为了验证该软件已正确地实现了用户的要求。
(4) 对于连锁型分支结构,若有n个判定语句,则有2n条路径。
(5) 尽量采用复合的条件测试,以避免嵌套的分支结构。
(6) GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁。
(7) 发现错误多的程序模块,残留在模块中的错误也多。
(8) 黑盒测试方法中最有效的是因果图法。
(9) 在做程序的单元测试时,桩(存根)模块比驱动模块容易编写。
(10) 程序效率的提高主要应通过选择高效的算法来实现。
【5-4】从供选择的答案中选出同下列关于软件测试的各条叙述关系最密切的字句。