软件工程导论(第六版)课后习题答案

第一章

一、什么是软件危机?它有哪些典型表现?为什么会出现软件危机?

软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它包括两方面:如何开发软件,已满足对软件日益增长的需求;如何维护数量不断增长的已有软件。 软件危机的典型表现:

(1) 对软件开发成本和进度的估计常常很不准确。常常出现实际成本比估算成本高出一个数量级、实际进度比计划进度拖延几个月甚至几年的现象。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量。这些都降低了开发商的信誉,引起用户不满。

(2) 用户对已完成的软件不满意的现象时有发生。 (3) 软件产品的质量往往是靠不住的。

(4) 软件常常是不可维护的。

(5) 软件通常没有适当的文档资料。文档资料不全或不合格,必将给软件开发和维护工作带来许多难以想象的困难和难以解决的问题。 (6) 软件成本、软件维护费在计算机系统总成本中所占比例逐年上升。 (7) 开发生产率提高的速度远跟不上计算机应用普及的需求。 软件危机出现的原因:

(1) 来自软件自身的特点:是逻辑部件,缺乏可见性;规模庞大、复杂,修改、维护困难。 (2) 软件开发与维护的方法不当:忽视需求分析;认为软件开发等于程序编写;轻视软件维护。 (3) 供求矛盾将是一个永恒的主题:面对日益增长的软件需求,人们显得力不从心。

二、假设自己是一家软件公司的总工程师,当把图1.1给手下的软件工程师们观看,告诉他们及时发现并改正错误的重要性时,有人不同意这个观点,认为要求在错误进入软件之前就清楚它们是不现实的,并举例说:“如果一个故障是编码错误造成的,那么,一个人怎么能在设计阶段清除它呢?”应该怎么反驳他?

答:在软件开发的不同阶段进行修改付出的代价是很不相同的,在早期引入变动,涉及的面较少,因而代价也比较低;在开发的中期,软件配置的许多成分已经完成,引入一个变动要对所有已完成的配置成分都做相应的修改,

不仅工作量大,而且逻辑上也更复杂,因此付出的代价剧增;在软件“已经完成”是在引入变动,当然付出的代价更高。一个故障是代码错误造成的,有时这种错误是不可避免的,但要修改的成本是很小的,因为这不是 整体构架的错误。

三、什么是软件工程?它有哪些本质特征?怎样用软件工程消除软件危机?

1993年IEEE的定义:软件工程是:① 把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;② 研究①中提到的途径。 软件工程的本质特征:

(1) 软件工程关注于大型程序(软件系统)的构造

(2) 软件工程的中心课题是分解问题,控制复杂性

(3) 软件是经

常变化的,开发过程中必须考虑软件将来可能的变化

(4) 开发软件的效率非常重要,因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的方法和工具 (5) 和谐地合作是开发软件的关键

(6) 软件必须有效地支持它的用户

(7) 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人(完成一些工作)消除软件危机的途径: (1) 对计算机软件有一个正确的认识(软件≠程序)

(2) 必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目

(3) 推广使用在实践中总结出来的开发软件的成功技术和方法 (4) 开发和使用更好的软件工具

四、简述结构化范型和面向对象范型的要点,并分析他们的优缺点。

1. 传统方法学:也称为生命周期方法学或结构化范型。 优点:把软件生命周期划分成基干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协作, 从而降低了整个软件开发过程的困难程度。缺点:当软件规模庞大时,或者对软件的需求是模糊的或会承受时 间而变化的时候,开发出的软件往往不成功;而且维护起来仍然很困难。

2. 面向对象方法学:优点:降低了软件产品的复杂性;提高了软件的可理解性;简化了软件的开发和维护工作; 促进了软件重用。 五、1-5 根据历史数据可以做出如下的假设 :

对计算机存储容量的需求大致按下面公式描述的趋势逐年增加:M=4080e0.28(Y-1960) 存储器的价格按下面公式描述的趋势逐年下降:P1=0.3×0.72Y-1974(美分/位)

如果计算机字长为16位,则存储器价格下降的趋势为:P2=0.048×0.72Y-1974(美元/字) 在上列公式中Y代表年份,M是存储容量(字数),P1和P2代表价格。

基于上述假设可以比较计算机硬件和软件成本的变化趋势。要求计算:

(1) 在1985年对计算机存储容量的需求估计是多少?如果字长为16位,这个存储器的价格是多少? 存储容量需求M=4080e0.28(1985-1960)=4474263(字) 存储器价格P=0.048*0.72(1985-1974)*4474263=5789美元

(2) 假设在1985年一名程序员每天可开发出10条指令,程序员的平均工资是每月4000美元。如果一条指令为一个字长,计算使存储器装满程序所需用的成本。

需要工作量4474263/200=22371(人/月) 指令成本22371*4000=89484000美元

(3) 假设在1995年存储器字长为32位,一名程序员每天可开发出30条指令,程序员的月平均工资为6000美元,重复(1)、(2)题。 需求估计M=4080e0.28(1995-1960)=73577679字

存储器价格0.003*32*0.72(1995-1974)*73577679=7127美元 工作量73577679/600=122629(人/月) 成本122629*6000=735776790美元

六、什么是软件过程?它与软件工程方法学有何关系?

软件过程是为了开发出高质量的软件产品所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。 软件工程方法学:通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称范型。 软件过程是软件工程方法学的3个重要组成部分之一。

七、什么是软件生命周期模型?试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的使用范围。 软件生命周期模型是跨越整个生存期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。

瀑布模型 优点:它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。虽然有不少缺陷但比在软件开发中随意的状态要好得多。

缺点:(1) 实际的项目大部分情况难以按照该模型给出的顺序进行,而且这种模型的迭代是间接的,这很容易由微小的变化而造成大的混乱。

(2) 经常情况下客户难以表达真正的需求,而这种模型却要求如此,这种模型是不欢迎具有二义性问题存在的。

(3) 客户要等到开发周期的晚期才能看到程序运行的测试版本,而在这时发现大的错误时,可能引起客户的惊慌,而后果也可能是灾难性的。 快速原型模型

优点:使用户能够感受到实际的系统,使开发者能够快速地构造出系统的框架。

缺点:产品的先天性不足,因为开发者常常需要做实现上的折中,可能采用不合适的操作系统或程序设计语言,以使原型能够尽快工作。 增量模型

优点:(1) 人员分配灵活,刚开始不用投入大量人力资源,当核心产品很受欢迎时,可增加人力实现下一个增量。

(2) 当配备的人员不能在设定的期限内完成产品时,它提供了一种先推出核心产品的途径,这样就可以先发布部分功能给客户,对客户起到镇静剂的作用。

缺点:(1) 至始至终开发者和客户纠缠在一起,直到完全版本出来。 (2) 适合于软件需求不明确、设计方案有一定风险的软件项目。 该模型具有一定的市场。 螺旋模型

优点:对于大型系统及软件的开发,这种模型是一个很好的方法。开发者和客户能够较好地对待和理解每一个演化级别上的风险。 缺点:(1) 需要相当的风险分析评估的专门技术,且成功依赖于这种技术。

(2) 很明显一个大的没有被发现的风险问题,将会导致问题的发生,可能导致演化 的方法失去控制。 (3) 这种模型相对比较新,应用不广泛,其功效需要进一步的验证。 该模型适合于大型软件的开发

八、为什么说喷泉模型较好的体现了面向对象软件开发过程无缝和迭代的特性?

因为使用面向对象方法学开发软件时,各个阶段都使用统一的概念和表示符号,因此,整个开发过程都是吻合一致的,或者说是无缝连接的,这自然就很容易实现各个开发步骤的反复多次迭代,达到认识的逐步深化,而喷泉模型则很好的体现了面向对象软件开发过

程迭代和无缝的特性。

九、试讨论Rational统一过程的优缺点。

优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组建的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模版和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。

缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,他没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。 十.Rational统一过程主要适用于何种项目? 大型的需求不断变化的复杂软件系统项目 十一.说明敏捷过程的适用范围

适用于商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束 十二.说明微软过程的适用范围

适用于商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式

第二章

1.在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?

答:(1)开发一个软件时,需要判断原定的系统模型和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度,如果做不到这些,那么花费在这些工程上的任何时间、人力、软硬件资源和经费,都是无谓的浪费。可行性研究的实质是要进行一次大大压缩简化了的系统分析和设计过程,就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。 (2)一般说来,至少应该从以下三个方面研究每种解法的可行性:

a.技术可行性。对要开发项目的功能、 性能和限制条件进行分析, 确定在现有的资源条件下,技术风险有多大,项目是否能实现,这些即为技术可行性研究的内容。这里的资源包括已有的或可以搞到的硬件、软件资源,现有技术人员的技术水平和已有的工作基础。 b.经济可行性。进行开发成本的估算以及了解取得效益的评估, 确定要开发的项目是否值得投资开发,这些即为经济可行性研究的内容对于大多数系统,一般衡量经济上是否合算,应考虑一个“底线”,经济可行性研究范围较广,包括成本—效益分析, 长期公司经营策略, 开发所需的成本和资源,潜在的市场前景。

c.操作可行性。有时还要研究社会可行性问题,研究要开发的项目是否存在任何侵犯、妨碍等责任问题。社会可行性所涉及的范围也比较广,它包括合同、责任、 侵权和其他一些技术人员常常不了解的陷阱等。 必要时还应该从法律、社会效益等更广泛的方面研究每种解法的可行性。

2.为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员键入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息并印出利息清单给储户。 请写出问题定义并分析此系统的可行性。 数据流程图:

取票图:

航空订票系统技术在目前是一个技术上成熟的系统,并且在航空公司内部准备采取有力措施保证资金和人员配置等。因此,分阶段开发“航空订票系统”的构想是可行的。为了使航空公司适应现代化市场竞争的需求,促进机票预订管理信息化,不断满足旅客预订机票的要求,争取更好的经济效益,可立即着手系统的开发与完善。

3、为方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地等)输入进入该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞机起飞的前一天凭取票通知和账单交款取票,系统校对无误即印出机票给旅客。 写出问题定义并分析系统的可行性。 1> 目标:在一个月内建立一个高效率,无差错的航空公司机票预定系统 2> 存在的主要问题:人工不易管理,手续繁琐 3> 建立新系统

① 经济可行性

成本估算:打印机一台(2000元)+开发费(3500元)=5500元 可承担

效益估算:该系统有很好的社会效益,提高了航空公司售票效率,方便了旅客,售 票方便化,科学化 ② 技术可行性

经过调查分析,得到目前航空公司机票预定系统流程图如下:

4.目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时

观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,试写出问题定义,并且分析开发这个系统的可行性可行性分析--原系统分析:

可行性分析-逻辑图:

技术可行性;

虽然生理数据的采集需要涉及大量的专业精密仪器,软件工程师并不精通,但是可以在专业人士的帮助下完成。

经济可行性:

支出方面由医院方面承担,是否可行取决于医院方面是否能支付所需的费用。

操作可行性:

医生并不具有软件维护的能力,在数据库的维护上需要专业人士来进行,因为病患数目并不会太多,所以只需一个人或者几个人定期对数据库进行管理和维护就行了。

5北京某高校可用的电话号码有以下几类:校内电话号码由4位数字组成,第一位数字不是0.校外电话又分为本市电话和外地电话两类。拨校外电话需要先拨0,若是本市电话则接着拨8位数字(第一位不是0),若是外地电话则拨3位区码后再拨8位电话号码(第一位不是0)。 答:

电话号码= [校内电话号码|校外电话号码] 校内电话号码= 非零数字+ 3 位数字 校外电话号码= [本市号码|外地号码] 本市号码= 数字零+ 8 位数字

外地号码= 数字零+ 3 位数字+ 8 位数字

非零数字= [1 |2 |3 |4 |5 |6 |7 |8 |9] 数字零= 0

3位数字= 3{数字}3

8位数字= 非零数字+ 7 位数字 7位数字= 7{数字}7

数字= [0 |1 |2 |3 |4 |5 |6 |7 |8 |9]

其中,[ ]意思是或,从校内电话号码或校外电话号码中选择一个;{ }表示重复,两边的数字表示重复次数的下限和上限;=意思是定义为;+意思是和,连接两个分量。

第三章

(1).为什么要进行需求分析?通常对软件系统有哪些要求?

答: 1) 为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件,不论我们把设计和编码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望,给开发者带来烦恼。 2)确定对系统的综合要求:1、功能需求;2、性能需求;3、可靠性和可用性需求;4、出错处理需求;5、接口需求;6、约束;7、逆向需求;8、将来可以提出的要求,分析系统的数据要求。

(2)怎样与用户有效地沟通以获取用户的真实需求? 答案 :

与用户沟通获取需求的方法:访谈;面向数据流自顶向下求精;简易的应用规格说明技术;快速建立软件原型

3 银行计算机储蓄系统的工作过程大致如下:储户填写的存款单或取款单由业务员键入系统,如果是存款则系统记录存款人姓名、住址、身份证号码等存款信息,并打印出存款存单给储户;如果是取款且存款时留有密码,则系统首先核对储户密码,若密码正确或存款时未留密码,则系统计算利息并打印出利息清单给储户。

答案: 用ER图描绘系统中的数据对象。

(5)分所析习题2中第4题的患者监狱系统。试用实体-联系图描述本系统中的数据对象并用数据流程描绘本系统的功能。

(6 )复印机的工作过程大致如下:未接到复印命令时处于闲置状态,一旦接到复印命令则进入复印状态,完成一个复印命令规定的工作后又回到闲置状态,等待下一个复印命令;如果执行复印命令时发现没纸,则进入缺纸状态,发出警告,等待装纸,装满纸后进入闲置状态,准备接收复印命令;如果复印时发生卡纸故障,则进入卡纸状态,发出警告等待维修人员来排除故障,故障排除后回到闲置状态。

请用状态转换图描绘复印机的行为。

答案: 从问题陈述可知,复印机的状态主要有“闲置”、“复印”、“缺纸”和“卡纸”。引起状态转换的事件主要是“复印命令”、“完成复印命令”、“发现缺纸”、“装满纸”、“发生卡纸故障”和“排除了卡纸故障”。

第五章

5.1为每种类型的模块耦合举一个具体的例子。

答:耦合式对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于接口的复杂度,进入或访问某一模块的点,以及通过接口的数据。一般模块之间的可能的连接方式有七种,构成耦合的七种类型,它们的关系为:

低 耦合性 高

独立性 弱 下面举例说明以上耦合:

A. 非直接耦合:两个模块没有直接的关系(模块1和模块2),独立性最强 B.数据耦合:即一个模块访问另一个模块的时候,彼此之间是通过数据参数来交换输入、输出信息的,这种耦合为数据耦合。这种耦合较为松散,模块间独立性较强。

G.内容耦合:如果出现以下情况之一,两个模块就发生了内容耦合 ① 一个模块访问另一个模块的内部数据。

② 一个模块不通过正常入口儿转到另一个模块的内部

③ 两个模块有一部分程序代码重叠(只可能发生在汇编程序中) ④ 一个模块有多个入口(这意味着一个模块有几种功能) Sub AA(….) …

… Goto L … End sub Sub BB(..) … … L: … … End sub

5.2为每种类型的模块内聚举一个例子

答:内聚标志着一个模块内各个元素之间彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。 低内聚:

A. 偶然内聚:如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的。这就叫做

偶然内聚

偶然内聚的例子:在模块T 中有A,B,C三条语句,至少从表面上看来这三条语句没什么联系,只是因为D,E,F,G中都有这三条语句,为了节省空间才把这三条语句作为一个模板放在一起。

B. 逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或相似的一类(例如一个模块产生各种类型的全

部输出),称为逻辑内聚

逻辑内聚的例子:某一个模块将打印,年,月,日,具体打印什么,将由传入的控制标志所决定。 C. 时间内聚:一个模块包含的任务必须在同一段时间内执行(例如,模块完成各种初始化工作),称为时

间内聚

时间内聚的例子:将多个变量的初始化放在同一个模块中实现。 中内聚:

A. 过程内聚:如果一个模块内的处理元素是相关的,而且必须以特定次序执行,称为过程内聚 过程内聚的例子:一个子程序,将开始读取学生的学号,然后是姓名,最后将读取分数,是由于特定的顺序而将这些操作组合在一起的

B. 通讯内聚:如果模块中所有的元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通讯

内聚

通讯内聚的例子:有一个子程序,它将打印实验报告,并且在完成后重新初始化传进来的实验数据。这个程序具有通讯内聚性。因为这两个操作由于使用同一个数据源联系在了一起。 高内聚:

A. 顺序内聚:如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一

个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。

顺序内聚的例子:有一个子程序,通过给出的生日,先计算出年龄。再根据年龄算出退休的时间,则这个程序具有顺序内聚性。

B. 功能内聚:如果模块内所有的元素属于一个整体完成一个单一的功能,则成为功能内聚。 功能内聚的例子:一个程序中所有的操作都是为了算出一个人的年龄

5.3用面向数据流的方法设计下列系统的软件结构

①储蓄系统

②机票预订系统

③患者监护系统

5.4 美国某大学有 200 名教师,校方与教师工会刚刚签订一项协议。按照协议, 所有年工资超过$26000(含$26000 )的教师工资将保持不变,年工资少于$26000 的教师将增加工资,所增加工资数额按下述方法计算:给每位教师所赡养的人(包 括教师本人)每年补助$100,此外,教师有一年工龄每年再多补助¥50,但是,增 加后的年工资总额不能多于$26000。

教师工资档案存储在行政办公室的磁带上,档案中有目前的年工资、赡养的人 数、雇佣日期等信息。需要写一个程序计算并印出每名教师的原工资和调整后的新 工资。

要求:(1)画出此系统的数据流图;(2)写出需求说明;

(3)设计上述的工资调整程序(要求用 HIPO 图描绘设计结果),设计时分别采 用两种算法,并比较两种算法的优缺点:

(a)搜索工资档案数据,找出年工资少于$26000 的人,计算新工资,校核是 否超过$26000,存储新工资,印出新旧工资对照表;

(b)把工资档案数据按工资从最低到最高的次序排序,当工资数额超过$26000 时即停止排序,计算新工资,校核是否超过限额,存储新工资,印出结果。 (4)你所画出的数据流图适应用那种算法? 解:(1)数据流图:

分解后:

(2)需求说明:

1. 功能需求:可以输入调资的标准,输入教师档案,经调资给出新的教师档案, 需要存储档案

2. 性能需求:软件的响应时间应小于0.5s,更新处理要快

3. 灵活需求:当需求发生某些变化时,该软件应该能够适应这些变化 4. 故障处理要求:出现错误时,应给予警告或提示 (3) A.

B.

(a)比较耗时,因为它要检索所有的档案,(b)从速度上看比较快,但是(b) 需要排序算法,比较复杂,(a)对于设计来讲比较简单 . (4)画出的数据流图比较适合(A)的算法

5.5下面将给出两个人玩的扑克牌游戏的一种玩法,试设计一个模拟程序,它的基本功能是: (1)发两手牌(利用随机数产生器)。 (2)确定赢者和赢牌的类型。

(3)模拟N次游戏,计算每种类型牌赢或平局的概率。要求用HIPO图描绘设计结果并且画出高层控制流程图。

扑克牌游戏规则如下:

(1)有两个人玩分别为A和B。

(2)一副扑克牌有52张牌,4种花色(黑桃、红桃、梅花、方块),每种花色的牌的点数按升序排列有2,3,4,.........,10,J,Q,K,A等13种。

(3)给每个人发三张牌,牌面向上,赢者立即可以确定。

(4)最高等级的一手牌成为同花,即3张牌均为同一种花色,最大的同花是同一种花色的Q,K,A。

(6)第三等级的牌是同点,即点数相同的三张牌,最大的同点是AAA。 (7)第四等级的牌是对子,即3张牌中有两张点数相同,最大的对子是A,A,K。

(8)第五等级的牌是杂牌,即除去上列4等之外的任何一手牌,最大的杂牌是不同花色的A.K,J。 (9)若两个人的牌类型不同,则等级高者胜;若等级相同,则点数高者胜;若点数也相同,则为平局。

程序:#include "stdio.h" int rabl(int a,int b,int *r) { }

int max(int T[10][10]) {

int t=0;

if(T[0][0]>T[1][0])

t=T[0][0];

int l,k,m,i,p; k=b-a+1; l=2; while(i

k=k+k+k+k+k; k=k%m; l=k/4+a;

if(l

else t=T[1][0]; if(t

t=T[2][0];

}

int E1(int T[10][10]) { }

int E2(int T[10][10]) { || }

int E3(int T[10][10]) { }

int E4(int T[10][10]) {

if(T[0][0]==T[1][0]==T[2][0])

return 1;

else

return 0;

(max(T[10][10])-2)==T[2][0])) // if(q=max(T[][10])) return 1;

int q=0;

if(((max(T[10][10])-1)==T[0][0]||(max(T[10][10])-1)==T[1][0]||(max(T[10][10])

-1)==T[2][0])&&((max(T[10][10])-2)==T[0][0]||(max(T[10][10])-2)==T[1][0]

if(T[0][1]==T[1][1]&&T[1][1]==T[2][1])

return 1;

else return 0;

else return 0;

}

return 1;

else if(T[0][0]==T[2][0]&&T[0][0]!=T[1][0])

return 1;

else if(T[1][0]==T[2][0]&&T[1][0]!=T[0][0])

return 1;

else return 0;

void main() {

int times=0,e1=0,e2=0,e3=0,e4=0,e5=0; int A[10][10],B[10][10]; int r1=2,r2=3;

printf("请输入游戏的次数\n"); scanf("%d",&times); for(int j=0;j

for(int i=0;i

if(E1(A[][10])>E1(B[][10])){

e1++;

printf("A赢,同花顺\n"); A[i][0]=rabl(1,13,&r1); A[i][1]=rabl(14,17,&r2); B[i][0]=rabl(1,13,&r1); B[i][1]=rabl(14,17,&r2);

else if(E1(A[][10])

else if(E1(A[][10])==E1(B[][10])&&E1(B[][10])==1) { }

else if(E2(A[][10])>E2(B[][10])) { }

else if(E2(A[][10])

else if(E2(A[][10])==E2(B[][10])&&E2(B[][10])==1) {

e2++; e2++;

printf("B赢,顺子\n"); e2++;

printf("A赢,顺子\n"); e1++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,同花顺\n"); printf("A赢,同花顺\n");

e1++;

printf("B赢,同花顺\n");

}

else

printf("B赢,顺子\n"); printf("A赢,顺子\n");

else if(E3(A[][10])>E3(B[][10])) { }

else if(E3(A[][10])

else if(E3(A[][10])==E3(B[][10])&&E3(B[][10])==1) { }

else if(E4(A[][10])>E4(B[][10])) { }

e4++;

printf("A赢,对子\n"); e3++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,同点\n"); printf("A赢,同点\n");

e3++;

printf("B赢,同点\n"); e3++;

printf("A赢,同点\n");

}

else if(E4(A[][10])>E4(B[][10])) { }

else if(E4(A[][10])==E4(B[][10])&&E4(B[][10])==1) ; { } else { }

if(max(A[][10])>max(B[][10])) else

printf("B赢,杂牌\n"); printf("A赢,杂牌\n");

e4++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,对子\n"); printf("A赢,对子\n");

e4++;

printf("B赢,对子\n");

printf("同花顺赢牌概率为%d,顺子赢牌概率为%d,同点赢牌概率为%d,对子赢牌概率为%d,

杂牌赢牌概率为%d",e1/times,e2/times,e3/times,e4/times,e5/times); }

控制流程图:

第六章

1、假设只有SEQUENCE和DO_WHILE两种控制结构,怎么利用它们完成IF_THEN_ELSE操作? 解:转化如下:

K = 1

DO WHILE (条件 .AND. K.EQ.1)

程序块1 K=K+1

END DO

DO WHILE ( (.NOT. 条件) .AND. K.EQ.1)

2、假设只有SEQUENCE和IF_THEN_ELSE两种控制结构,怎么利用它们完成DO_WHILE操作? 解:转化如下; label:

3、画出下列伪代码程序的流程图和盒图: START IF p THEN

WHILE q DO f END DO ELSE BLOCK g n END BLOCK END IF STOP

解:流程图:

IF (条件) THEN ELSE END IF

程序块 程序块 GOTO label 程序块2 K=K+1

END DO

1510

1

2 τ(月)

盒图:

60

10

1

3.5

τ(月)

4、图6.18给出的程序流程图代表一个非结构化的程序,问:(1)为什么说它是非结构化的? (2)设计一个等价的结构化程序。

(3)在(2)题的设计中使用附加的标识变量flag了吗? 若没用,在设计一个使用flag的程序; 若用了,在设计一个不用flag的程序。

解:(1)通常所说的结构化程序,是按照狭义的结构程序的 定义衡量,符合定义规定的程序,每个代码块只有一个入口 和一个出口。图示的程序的循环控制结构有两个出口,显然 不符合狭义的结构程序的定义,因此是非结构化的程序。 (2)使用附加的标志变量flag,至少有两种方法可以把该 程序改造为等价的结构化程序,图示盒图描绘了等价的结构 化程序。

(3)不使用flag把该程序改造为等价的结构化程序的方法如图所示。

5、研究下面的伪码程序: LOOP:Set I to(START+FINISH)/2 IF TABLE(I)=ITME goto FOUND IF TABLE(I)TME Set FINSH to (I-1) IF (FINSH-START)>1 goto LOOP IF TABLE(START)=ITEM goto FOUND IF TABLE(FINSH)=ITEM goto FOUND Set FLAG to 0 Goto DONE FOUND:Set FLAG to 1 DONE:EXIT 要求:

(1)画出流程图。

(2)程序是结构化的吗?说明理由。

(3)若此程序是非结构化,设计一个等价的结构化程序并画出流程图。 (4)此程序的功能是什么?它完成预定功能有什么隐含的前提条件吗? 解:(1)该程序流程图如下:

T

(2)该程序不是结构化的,结构化的程序只有一个入口和一个出口,而该程序的流程途中有两个出口。 (3)等价的结构化程序的流程图如下:

F

(4)此程序有二分查找的功能,它完成预定功能的隐含前提条件是现有序列为从小到大顺序排好的有序序列。

6.用Ashcroft_Manna技术可以将非结构化的程序转化为结构化程序,图6.19是一个转换的例子。 (1)能否从这个例子总结出Ashcroft_Manna技术的一些基本方法? (2)进一步简化6.19(b)给出的结构化设计。

解:(1)从这个例子中看出,Ashcroft_Manna 技术的基本方法是,当待改造的序含有嵌套的非结构化的IF语句时,改造后的程序中增加DO-CASE语句和DO-UNTIL语句,并增加一个辅助变量I,I的初始值为1。最外层的IF语句在I=1时执行,执行完这个IF语句后把I赋值为随后应该执行的内层IF语句所对应的CASE标号值。DO-CASE语句的最大分支数(可执行的最大标号值)等于IF语句的个数。当执行完最内层的IF语句之后,把I赋值为可执行的最大标号值加1,而DO-UNTIL 循环的结束条件就是I等于这个值。 (2)进一步简化后的结构化程序的流程图如下所示。

7、某交易所规定给经纪人的手续费计算方法如下:总手续费等于基本手续费加上与交易中的每股价格和股数有关的附加手续费。如果交易金额少于1000元,则基本手续费为交易金额的8.4%;如果交易总金额在1000元~10000元之间,则基本手续费为交易金额的5%,再加34元;如果金额超过10000元,则基本手续费为交易金额的4%加上134元。当每股售价低于14元时,附加手续费为基本手续费的5%,除非买进、卖出的股数不是100的倍数,在这种情况下附加手续费的9%。当每股售价在14元到25元之间时,附加手续费为基本手续费的2%,除非交易的股数不是100的倍数,在这种情况下附加手续费的6%。当每股售价超过25元时,如果交易的股数(即不是100的倍数),则附加手续费为基本手续费的4%,否则附加手续费为基本手续费的1%。 要求:

(1)用判定表表示手续费的计算方法。 (2)用判定数表示手续费的计算方法。

解:令P代表交易的总金额,Q代表每股的售价,n代表交易的股数。 (1)表示手续费计算方法的判定表如图所示

(2)表示手续费计算方法的判定树

8、画出下列伪码程序的流图,计算它的环形复杂度。你觉得这个程序的逻辑有什么问题吗? C EXAMPLE

LOOP:DO WHILE X>0 A=B+1 IF A>10 THEN X=A ELSE Y=Z END IF IF Y

THEN PRINT X,Y

ELSE IF Y=2

THEN GOTO LOOP

ELSE C=3 END IF END IF G=H+R END DO IF F>0

THEN PRINT G ELSE PRINT K END IF STOP

解:流程图:

环形复杂度:

V(G)=结点E-弧数n

+1=17-11+1=7=判断结点 +1=6 +1=7=封闭的区域数

逻辑有问题,当Z>0时,容易形成死循环;条件Y

盒图:

10、人机对话由操作员信息和系统信息交替组成。假设一段对话总是由操作员信息开始以系统信息结束,用Jackson图描绘这样的人机对话过程。 解:

第七章

第一题

1、下面给出的伪码中有一个错误。请仔细阅读这段伪码,说明该伪码的语法特点,找出并改正伪码中的错误。字频统计程序的伪码如下: INITIALIZE the Program READ the first text record

DO WHILE there are more words in the text record

DO WHILE there are more words in the text record EXTRACT the next text word

SEARCH the word-table for the extracted word IF the extracted word is found INCREMENT the word’s occurrence count ELSE

INSERT the extracted word into the table END IF

INCREMENT the words-processed count END DO at the end of the text record READ the next text record

END DO when all text records have heen read PRINT the table and summary information TERMINATE the program

答:INSERT the extracted word into the table在这个后面,有没有给这个word的occurrence/count赋值为1 第二题

2、研究下面给出的伪码程序,要求: (1) 画出它的程序流程图。

(2) 它是结构化的还是非结构化的?说明理由。 (3) 若是非结构化的,则

(a) 把它改造成仅用3种控制结构的结构化程序; (b) 写出这个结构化设计的伪码; (c) 用盒图表示这个结构化程序。 (4) 找出并改正程序逻辑中的错误。

COMMENT:PROGRAM SEARCHES FOR FIRST N REFERENCES TO A TOPIC IN AN INFORMATION RETRIEVAL SYSTEM WITH T TOTAL ENTRIES INPUT N

INPUT KEYWORD(S)FOR TOPIC I=O MATCH=0 DO WHILE I≤T

I=I+1

IF WORD=KEYWORD THEN MATCH=MATCH+1 STORE IN BUFFER END

IF MATCH=N THEN GOTO OUTPUT END END IF N=0 THEN PRINT ″NO MATCH″

OUTPUT:ELSE CALL SUBROUTINE TO PRINT BUFFER INFORMATION END

第三题

3、在第2题的设计中若输入的N值或KEYWORD不合理,会发生问题。 (1) 给出这些变量的不合理值的例子。 (2) 将这些不合理值输入程序会有什么后果?

(3) 怎样在程序中加入防错措施,以防止出现这些问题? (1)答:N=1,KEYWOED=#。 (2)答:无法打印出任何信息。 (3)答:加入循环 第四题

4、(1)什么是模块测试和集成测试?它们各有什么特点?

答:模块测试是对每个单独的模块,分别用黑盒和白盒测试技术,测试它的功能是否正确, 检查模块控制结构中的特定路径并发现最大数量的错误。

其特点是:主要应用白盒测试的技术,对多个模块的测试可以并发的进行。 集成测试是把模块装配在一起形成完整的软件包,在装配的同时进行测试。 特点是:可能发生接口问题。

(2)假设有一个由1000行FORTRAN语句构成的程序,估计在对它进行测试期间将发现多少个错误?为什么?

答:月25至100个错误,美国的一些统计数字告诉我们通常这个比值在0.005~0.02之间,也就是说,测试之前每1000条指令中大约有5~20个错误。假设测试之前每1000条指令中有10个错误,则估计对它进行测试期间将发现的错误数为:5000*10/1000=50。 (3)设计下列伪码程序的语句覆盖和路径覆盖测试用例: START INPUT(A,B,C) IF A>5 THEN X=10 ELSE X=1 END IF IF B>10 THEN X=20 ELSE X=2 END IF IF C>15 THEN X=30 ELSE X=3 END IF PRINT (X,Y,Z)

STOP

答:此程序的语句覆盖用例:①A=5,B=10,C=15;②A=6,B=11,C=16 条件覆盖用例为:①A=5,B=10,C=15;②A=6,B=11,C=16。 语句覆盖测试用例

序判定 输入 预期的输出 X Y Z 1 2 3 1230 0 0 预期的X Y Z 1 2 3 1 2 31 20 3

号 1 2 3 A B C

1 F F F 1 1 1 2 T T T 246

0 0 0 序号 1 1 F 2 F 3 4 5 6 7 8

判定

输入

语句覆盖的含义是,选择足够多的测试数据,使被测试程序中的每个语句至少执行一次。

2 3 A B C F F 1 1 1 F T 1 1 6F T F 1 40 1 F T T 1 0 46

T T T T

1 0 23

F F 20 0 1 0 1 10 2 0 3 F T 20 1 60 12 3T F 20 40 1 0 3 120 T T 20 0 460 10 23

0 0 0 0 0

第五题

5、某图书馆有一个使用CRT终端的信息检索系统,该系统有下列4个基本检索命令 要求:

(1) 设计测试数据以全面测试系统的正常操作;

(2) 设计测试数据以测试系统的非正常操作

解:⑪测试系统正常操作的测试数据 ①顺序执行下列3个命令:

b(KEYWORD) s(L) d(N)

其中,KEYWORD是正确的关键字;L是执行命令b后在屏幕上显示的约20个行号中的一个(至少应该使L分别为第一个、最后一个和中央一个行号);N是执行命令s后列出的索引号中的一个(至少应该使N分别为第一个、最后一个和中央一个索引号)。

针对若干个不同的KEYWORD重复执行上述命令序列。 ②顺序执行下列2个命令:

f(NAME) d(N)

其中,NAME是已知的作者姓名;N是执行命令f后列出的索引号中的一个(至少应该使N分别为第一个、最后一个和中央一个索引号)。

针对若干个不同的NAME重复执行上述命令序列。

⑫测试系统非正常操作的测试数据

①用过长的关键字作为命令b的参数:例如,b(reliability software and hardware combined) 预期的输出:系统截短过长的关键字,例如,上列命令中的关键字可能性被截短为reliability software ②用不正确的关键字作为命令b的参数:例如,b(AARDVARK) 预期的输出:显示出最接近的匹配结果,例如,执行上列命令后可能显示 1.AARON,JULES(book)

③用比执行命令b后列出的最大行号大1的数作为命令s的参数 预期的输出:“命令s的参数不在行号列表中” ④用数字和标点符号作为命令b和命令f的参数 预期的输出:“参数类型错”

⑤用字母字符作为命令s和命令d的参数 预期的输出:“参数类型错”

⑥用0和负数作为命令s和命令d的参数 预期的输出:“参数数值错”

⑦命令顺序错:例如,没执行命令b就执行命令s,或没执行命令s就执行命令d 预期的输出:“命令顺序错”

⑧命令语法错:例如,遗漏命令名b、s、d或f;或命令参数没用圆括号括起来 预期的输出:“命令语法错”

⑨命令参数空:例如,b()、s()、d或f() 预期的输出:系统提供默认参数或给出出错信息 ⑩使用拼错了的作者姓名作为f的参数 预期的输出:“找不到这们作者的著作” 第六题

6、航空公司A向软件公司B订购了一个规划飞行路线的程序。假设你是软件公司C的软件工程师,A公司已雇用你所在的公司对上述程序进行验收测试。任务是,根据下述事实设计验收测试的输入数据,解释你选取这些数据的理由。

领航员向程序输入出发点和目的地,以及根据天气和飞机型号而初步确定的飞行高度。程序读入途中的风向风力等数据,并且制定出3套飞行计划(高度,速度,方向及途中的5个位置校核点)。所制定的飞行计划应做到燃料消耗和飞行时间都最少。

用正常的输入数据作为测试数据

① 向程序输入常规的出发点,目的地,飞机型号,5个位置校核点,高度和速度。 ② 输入3~5组出发点和目的地,重复执行步骤1

③ 输入固定的出发点、目的地、飞机型号、5个位置校核点和高度,分别输入3~5个不同的速度,重复执行步骤1

④ 输入固定的出发点、目的地、飞机型号、5个位置校核点和速度,分别输入3~5个不同的高度,重复执行步骤1

⑤ 输入固定的出发点、目的地、飞机型号、速度和高度,分别输入3~5组不同的位置校核点,重复执行步骤1

⑥ 输入固定的出发点、目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1

⑦ 输入固定的目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1

⑧ 输入固定的出发点、5个位置校核点和高度,分别输入3~5个不同的目的地,重复执行步骤1

(2) 用特殊的数据值作为测试数据

① 分别输入非常高和非常低的数据组合测试

② 用负数测试

③ 输入数字0进行测试

④ 分别输入相距非常远和非常近的出发点和目的地测试

ay和size,size小于数组的大小,并给出需要查找的值,该值在somearray中;

预期的输出:返回-1;

⑤ 首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值不在somearray中;

预期的输出:返回-1;

⑥ 首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值在somearray中;

预期的输出:返回-1;

第七题

7、严格说来,有两种不同的路径覆盖测试,分别为程序路径覆盖和程序图路径覆盖。这两种测试可分别称为程序的自然执行和强, , 迫执行。所谓自然执行是指测试者(人或计算机)读入程序中的条件表达式,根据程序变量的当前值计算该条件表达式的值(真或假),并相应地分支。强迫执行是在用程序图作为程序的抽象模型时产生的一个人为的概念,它可以简化测试问题。强迫执行的含义是,一旦遇到条件表达式,测试者就强迫程序分两种情况(条件表达式的值为真和为假)执行。显然,强迫执行将遍历程序图的所有路径,然而由于各个条件表达式之间存在相互依赖的关系,这些路径中的某一些在自然执行时可能永远也不会进入。 为了使强迫执行的概念在实际工作中有用,它简化测试工具的好处应该超过它使用额外的不可能达到的测试用例所带来的坏处。在绝大多数情况下,强迫执行的测试数并不比自然执行的测试数大很多,此外,对强迫执行的定义实际上包含了一种技术,能够缩短在测试含有循环的程序时所需要的运行时间。 程序的大部分执行时间通常用于重复执行程序中的DO循环,特别是嵌套的循环。因此必须发明一种技术,使得每个DO循环只执行一遍。这样做并不会降低测试的功效,因为经验表明第一次或最后一次执行循环时最容易出错。

Laemmel教授提出的自动测试每条路径的技术如下: 当编写程序时每个DO循环应该写成一种包含测试变量T和模式变量M的特殊形式,因此

DO I= 1 TO 38

应变成

DO I=1 TO M*38+(1-M)*T

可见,当M=0时处于测试模式,而M=1时处于正常运行模式。当处于测试模式时,令T=0则该循环一次也不执行,令T=1则该循环只执行一次。 类似地应该使用模式变量和测试变量改写IF语句,例如 IF X+Y>0 THEN Z=X

ELSE Z=Y应变成

IF M*(X+Y)+T>0 THEN Z=X

ELSE

Z=Y正常运行时令M=1和T=0,测试期间令M=0,为测试THEN部分需令T=+1,测试ELSE部分则令

T=-1。

要求:

(1) 选取一个包含循环和IF语句的程序,用Laemmel技术修改这个程序,上机实际测试这个程序并解释所得到的结果。

(2) 设计一个程序按照Laemmel技术自动修改待测试的程序。利用这个测试工具修改上一问中人工修改的程序,两次修改得到的结果一致吗?

(3) 怎样把Laemmel技术推广到包含WHILE DO 和REPEAT UNTIL语句的程序?

(4) 试分析Laemmel技术的优缺点并提出改进意见。

(1)答:if (x+y)>2

A=x

Else

A=y

改为:if M*(x+y)+T>2

A=x

Else

A=y

结果一致。

(2)答:两次结果是一致的

(3)答:WHILE DO 和IF ELSE修改技术类似。

(4)答:优点是可以使得结果更为精确。缺点是并不适用所有的程序,有时会有程序运行变得复杂。

第八题

8、对一个包含10000条机器指令的程序进行一个月集成测试后,总共改正了15个错误,此时MTTF=10h;经过两个月测试后,总共改正了25个错误(第二个月改正了10个错误),MTTF=15h。

要求:

(1)根据上述数据确定MTTF与测试时间之间的函数关系,画出MTTF与测试时间τ的关系曲线。在化这条曲线是做了什么假设?

(2)为做到MTTF=100h,必须进行多长时间的集成测试?当集成测试结束时总共改正了多少个错误,还有多少个错误潜伏在程序中?

答:(1)MTTF与测试时间τ的关系曲线如下:

MTTF(h)

15

10

1

2 τ(月)

假设调试过程中没有引入新的错误。

(2)根据估算平均无故障时间的公式可得:

1/K(Et/10000-100/10000)=10

1/K (Et/10000-300/10000)=15

计算可得:K=333,Et=45

当MTTF=100h时,有

1/333(45/10000-Ec/10000)=100

计算可得:Ec=42.按前两个月测试改错的进度估算,需进行3个月的集成测试。

当测试结束时,共改正了42个错误,还有3个错误潜伏在程序中。

第九题

9.如对一个长度为100000条指令的程序进行集成测试期间记录下下面的数据:

(a)7月1日:集成测试开始,没有发现错误。

(b)8月2日:总共改正100个错误,此时MTTF=0.4h

(c)9月1日:总共改正300个错误,此时MTTF=2h

根据上列数据完成下列各题。

估计程序中的错误总数。

为使MTTF达到10h,必须测试和调试这个程序多长时间?

画出MTTF和测试时间τ之间的函数关系曲线。

答:(1)根据估算平均无故障时间的公式可得:

1/K(Et/100000-100/100000)=0.4

1/K (Et/100000-300/100000)=2

计算可得:K=1000,Et=350即程序中的错误总数为350。

(2)当MTTF=10h时,有

1/K (350/100000- Ec/100000)=10

计算可得:Ec=340.按前两个月测试改错的进度估算,还进行2个月的集成测试。

(3)MTTF和测试时间τ之间的函数关系曲线如下:

MTTF(h)

2

0.4

1

第十题

10、在测试一个长度为24000条指令的程序时,第一个月由甲、乙两名测试员各自独立测试这个程序。经一个月测试后,甲发现并改正20个错误,使MTTF达到10h。与此同时,乙发现24个错误,其中6个甲2 τ(月)

也发现了。以后由甲一个人继续测试这个程序。问:

(1)刚开始测试时程序中总共有多少个潜在的错误?

(2)为使MTTF达到60h,必须再改正多少个错误?还需多长测试时间?

(3)画出MTTF与集成测试时间τ之间的函数关系曲线。

答:(1)根据公式:B0=B2B1/bc,可得:

B0=20*24/6=80,即刚开始测试时程序中总共有80个错误。

(2)根据估算平均无故障时间的公式可得:

1/K(80/24000-20/24000)=10

1/K(80/24000- Ec/24000)=60

计算可得:K=40,Ec=70

即还需要改正50个错误。根据甲的改正进度,估计还需要3个月。

(3)MTTF与集成测试时间τ之间的函数关系曲线如下:

MTTF(h)

60

10

1

3.5 τ(月)

第八章

一.答:软件的可维护性与哪些因素有关?在软件开发过程中应该采取哪些措施来提高软件产品的可维护性?

答:(1)、可理解性

(2)、可预测性

(3)、可修改性

(4)、可移植性

(5)、可重用性

在每个阶段结束前的技术审查和管理复查中,应该着重对可维护性进行复审过程中,应该对将来要改进的部分和可能要改的部分加以注意指明,应该讨论软件的可移植性问题,考虑可能影响软件维护的系统界面。在设计和编码过程中应该尽量使用可重用的软件构件,每个测试步骤都可以暗示在软件正式交付使用之前,程序中可能需要做预防性维护的部分。在完成每项维护工作之后,都应该对软件维护本身仔细认真地复审。

二:答:应该选取a 和 c 因为文档是影响软件可维护性的决定因素。因此,文档甚至比可执行的程序代码更重要,文档必须和程序代码同时维护,只有和程序代码完全一致才能是真正有价值的代码。 文档修改:针对系统中当前正在修改的那些部分文档建立完整的文档。

代码重构:首先用重构工具分析源代码,标注出和结构化程序设计概念相违背的部分。然后重构有问题的代码(此项可以工作可自动化进行)。最后,复审和测试生成的重构代码(以保证没有引入异常)并更新代码文档。

三: 答:对储蓄系统:一般大型软件的维护成本远远高于开发成本若干倍,所以在设计时就应该考虑到软件维护成本,而且在开发过程中应该使用标准的程序设计语言和标准的操作系统接口,可以大大提高软件的可维护性,也可以减少软件存在的错误;

对机票预订系统:往往人一多系统瘫痪几率就大,在开发人员不在场的情况下,很容易出现系统错误,维护软件也是很困难的,也会给很多人带来不便,所以,在设计过程中应该严格科学的管理规划还有合理设计模块,是各个模块的独立性越高,这样对软件的改进越方便,也便于快速纠错;

对患者监护系统:应该要考虑它的完善性和预防性,要能满足用户在使用过程中的增加和修改工作,还要为了改善未来的可维护性或可靠性而修改软件。更要考虑系统数据的隐秘及安全,随时备份。

第一章

一、什么是软件危机?它有哪些典型表现?为什么会出现软件危机?

软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它包括两方面:如何开发软件,已满足对软件日益增长的需求;如何维护数量不断增长的已有软件。 软件危机的典型表现:

(1) 对软件开发成本和进度的估计常常很不准确。常常出现实际成本比估算成本高出一个数量级、实际进度比计划进度拖延几个月甚至几年的现象。而为了赶进度和节约成本所采取的一些权宜之计又往往损害了软件产品的质量。这些都降低了开发商的信誉,引起用户不满。

(2) 用户对已完成的软件不满意的现象时有发生。 (3) 软件产品的质量往往是靠不住的。

(4) 软件常常是不可维护的。

(5) 软件通常没有适当的文档资料。文档资料不全或不合格,必将给软件开发和维护工作带来许多难以想象的困难和难以解决的问题。 (6) 软件成本、软件维护费在计算机系统总成本中所占比例逐年上升。 (7) 开发生产率提高的速度远跟不上计算机应用普及的需求。 软件危机出现的原因:

(1) 来自软件自身的特点:是逻辑部件,缺乏可见性;规模庞大、复杂,修改、维护困难。 (2) 软件开发与维护的方法不当:忽视需求分析;认为软件开发等于程序编写;轻视软件维护。 (3) 供求矛盾将是一个永恒的主题:面对日益增长的软件需求,人们显得力不从心。

二、假设自己是一家软件公司的总工程师,当把图1.1给手下的软件工程师们观看,告诉他们及时发现并改正错误的重要性时,有人不同意这个观点,认为要求在错误进入软件之前就清楚它们是不现实的,并举例说:“如果一个故障是编码错误造成的,那么,一个人怎么能在设计阶段清除它呢?”应该怎么反驳他?

答:在软件开发的不同阶段进行修改付出的代价是很不相同的,在早期引入变动,涉及的面较少,因而代价也比较低;在开发的中期,软件配置的许多成分已经完成,引入一个变动要对所有已完成的配置成分都做相应的修改,

不仅工作量大,而且逻辑上也更复杂,因此付出的代价剧增;在软件“已经完成”是在引入变动,当然付出的代价更高。一个故障是代码错误造成的,有时这种错误是不可避免的,但要修改的成本是很小的,因为这不是 整体构架的错误。

三、什么是软件工程?它有哪些本质特征?怎样用软件工程消除软件危机?

1993年IEEE的定义:软件工程是:① 把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;② 研究①中提到的途径。 软件工程的本质特征:

(1) 软件工程关注于大型程序(软件系统)的构造

(2) 软件工程的中心课题是分解问题,控制复杂性

(3) 软件是经

常变化的,开发过程中必须考虑软件将来可能的变化

(4) 开发软件的效率非常重要,因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的方法和工具 (5) 和谐地合作是开发软件的关键

(6) 软件必须有效地支持它的用户

(7) 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人(完成一些工作)消除软件危机的途径: (1) 对计算机软件有一个正确的认识(软件≠程序)

(2) 必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目

(3) 推广使用在实践中总结出来的开发软件的成功技术和方法 (4) 开发和使用更好的软件工具

四、简述结构化范型和面向对象范型的要点,并分析他们的优缺点。

1. 传统方法学:也称为生命周期方法学或结构化范型。 优点:把软件生命周期划分成基干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协作, 从而降低了整个软件开发过程的困难程度。缺点:当软件规模庞大时,或者对软件的需求是模糊的或会承受时 间而变化的时候,开发出的软件往往不成功;而且维护起来仍然很困难。

2. 面向对象方法学:优点:降低了软件产品的复杂性;提高了软件的可理解性;简化了软件的开发和维护工作; 促进了软件重用。 五、1-5 根据历史数据可以做出如下的假设 :

对计算机存储容量的需求大致按下面公式描述的趋势逐年增加:M=4080e0.28(Y-1960) 存储器的价格按下面公式描述的趋势逐年下降:P1=0.3×0.72Y-1974(美分/位)

如果计算机字长为16位,则存储器价格下降的趋势为:P2=0.048×0.72Y-1974(美元/字) 在上列公式中Y代表年份,M是存储容量(字数),P1和P2代表价格。

基于上述假设可以比较计算机硬件和软件成本的变化趋势。要求计算:

(1) 在1985年对计算机存储容量的需求估计是多少?如果字长为16位,这个存储器的价格是多少? 存储容量需求M=4080e0.28(1985-1960)=4474263(字) 存储器价格P=0.048*0.72(1985-1974)*4474263=5789美元

(2) 假设在1985年一名程序员每天可开发出10条指令,程序员的平均工资是每月4000美元。如果一条指令为一个字长,计算使存储器装满程序所需用的成本。

需要工作量4474263/200=22371(人/月) 指令成本22371*4000=89484000美元

(3) 假设在1995年存储器字长为32位,一名程序员每天可开发出30条指令,程序员的月平均工资为6000美元,重复(1)、(2)题。 需求估计M=4080e0.28(1995-1960)=73577679字

存储器价格0.003*32*0.72(1995-1974)*73577679=7127美元 工作量73577679/600=122629(人/月) 成本122629*6000=735776790美元

六、什么是软件过程?它与软件工程方法学有何关系?

软件过程是为了开发出高质量的软件产品所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。 软件工程方法学:通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称范型。 软件过程是软件工程方法学的3个重要组成部分之一。

七、什么是软件生命周期模型?试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的使用范围。 软件生命周期模型是跨越整个生存期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架。

瀑布模型 优点:它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。虽然有不少缺陷但比在软件开发中随意的状态要好得多。

缺点:(1) 实际的项目大部分情况难以按照该模型给出的顺序进行,而且这种模型的迭代是间接的,这很容易由微小的变化而造成大的混乱。

(2) 经常情况下客户难以表达真正的需求,而这种模型却要求如此,这种模型是不欢迎具有二义性问题存在的。

(3) 客户要等到开发周期的晚期才能看到程序运行的测试版本,而在这时发现大的错误时,可能引起客户的惊慌,而后果也可能是灾难性的。 快速原型模型

优点:使用户能够感受到实际的系统,使开发者能够快速地构造出系统的框架。

缺点:产品的先天性不足,因为开发者常常需要做实现上的折中,可能采用不合适的操作系统或程序设计语言,以使原型能够尽快工作。 增量模型

优点:(1) 人员分配灵活,刚开始不用投入大量人力资源,当核心产品很受欢迎时,可增加人力实现下一个增量。

(2) 当配备的人员不能在设定的期限内完成产品时,它提供了一种先推出核心产品的途径,这样就可以先发布部分功能给客户,对客户起到镇静剂的作用。

缺点:(1) 至始至终开发者和客户纠缠在一起,直到完全版本出来。 (2) 适合于软件需求不明确、设计方案有一定风险的软件项目。 该模型具有一定的市场。 螺旋模型

优点:对于大型系统及软件的开发,这种模型是一个很好的方法。开发者和客户能够较好地对待和理解每一个演化级别上的风险。 缺点:(1) 需要相当的风险分析评估的专门技术,且成功依赖于这种技术。

(2) 很明显一个大的没有被发现的风险问题,将会导致问题的发生,可能导致演化 的方法失去控制。 (3) 这种模型相对比较新,应用不广泛,其功效需要进一步的验证。 该模型适合于大型软件的开发

八、为什么说喷泉模型较好的体现了面向对象软件开发过程无缝和迭代的特性?

因为使用面向对象方法学开发软件时,各个阶段都使用统一的概念和表示符号,因此,整个开发过程都是吻合一致的,或者说是无缝连接的,这自然就很容易实现各个开发步骤的反复多次迭代,达到认识的逐步深化,而喷泉模型则很好的体现了面向对象软件开发过

程迭代和无缝的特性。

九、试讨论Rational统一过程的优缺点。

优点:提高了团队生产力,在迭代的开发过程、需求管理、基于组建的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模版和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。

缺点:RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,他没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。 十.Rational统一过程主要适用于何种项目? 大型的需求不断变化的复杂软件系统项目 十一.说明敏捷过程的适用范围

适用于商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束 十二.说明微软过程的适用范围

适用于商业环境下具有有限资源和有限开发时间约束的项目的软件过程模式

第二章

1.在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?

答:(1)开发一个软件时,需要判断原定的系统模型和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度,如果做不到这些,那么花费在这些工程上的任何时间、人力、软硬件资源和经费,都是无谓的浪费。可行性研究的实质是要进行一次大大压缩简化了的系统分析和设计过程,就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。 (2)一般说来,至少应该从以下三个方面研究每种解法的可行性:

a.技术可行性。对要开发项目的功能、 性能和限制条件进行分析, 确定在现有的资源条件下,技术风险有多大,项目是否能实现,这些即为技术可行性研究的内容。这里的资源包括已有的或可以搞到的硬件、软件资源,现有技术人员的技术水平和已有的工作基础。 b.经济可行性。进行开发成本的估算以及了解取得效益的评估, 确定要开发的项目是否值得投资开发,这些即为经济可行性研究的内容对于大多数系统,一般衡量经济上是否合算,应考虑一个“底线”,经济可行性研究范围较广,包括成本—效益分析, 长期公司经营策略, 开发所需的成本和资源,潜在的市场前景。

c.操作可行性。有时还要研究社会可行性问题,研究要开发的项目是否存在任何侵犯、妨碍等责任问题。社会可行性所涉及的范围也比较广,它包括合同、责任、 侵权和其他一些技术人员常常不了解的陷阱等。 必要时还应该从法律、社会效益等更广泛的方面研究每种解法的可行性。

2.为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员键入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息并印出利息清单给储户。 请写出问题定义并分析此系统的可行性。 数据流程图:

取票图:

航空订票系统技术在目前是一个技术上成熟的系统,并且在航空公司内部准备采取有力措施保证资金和人员配置等。因此,分阶段开发“航空订票系统”的构想是可行的。为了使航空公司适应现代化市场竞争的需求,促进机票预订管理信息化,不断满足旅客预订机票的要求,争取更好的经济效益,可立即着手系统的开发与完善。

3、为方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地等)输入进入该系统,系统为旅客安排航班,印出取票通知和账单,旅客在飞机起飞的前一天凭取票通知和账单交款取票,系统校对无误即印出机票给旅客。 写出问题定义并分析系统的可行性。 1> 目标:在一个月内建立一个高效率,无差错的航空公司机票预定系统 2> 存在的主要问题:人工不易管理,手续繁琐 3> 建立新系统

① 经济可行性

成本估算:打印机一台(2000元)+开发费(3500元)=5500元 可承担

效益估算:该系统有很好的社会效益,提高了航空公司售票效率,方便了旅客,售 票方便化,科学化 ② 技术可行性

经过调查分析,得到目前航空公司机票预定系统流程图如下:

4.目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时

观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,试写出问题定义,并且分析开发这个系统的可行性可行性分析--原系统分析:

可行性分析-逻辑图:

技术可行性;

虽然生理数据的采集需要涉及大量的专业精密仪器,软件工程师并不精通,但是可以在专业人士的帮助下完成。

经济可行性:

支出方面由医院方面承担,是否可行取决于医院方面是否能支付所需的费用。

操作可行性:

医生并不具有软件维护的能力,在数据库的维护上需要专业人士来进行,因为病患数目并不会太多,所以只需一个人或者几个人定期对数据库进行管理和维护就行了。

5北京某高校可用的电话号码有以下几类:校内电话号码由4位数字组成,第一位数字不是0.校外电话又分为本市电话和外地电话两类。拨校外电话需要先拨0,若是本市电话则接着拨8位数字(第一位不是0),若是外地电话则拨3位区码后再拨8位电话号码(第一位不是0)。 答:

电话号码= [校内电话号码|校外电话号码] 校内电话号码= 非零数字+ 3 位数字 校外电话号码= [本市号码|外地号码] 本市号码= 数字零+ 8 位数字

外地号码= 数字零+ 3 位数字+ 8 位数字

非零数字= [1 |2 |3 |4 |5 |6 |7 |8 |9] 数字零= 0

3位数字= 3{数字}3

8位数字= 非零数字+ 7 位数字 7位数字= 7{数字}7

数字= [0 |1 |2 |3 |4 |5 |6 |7 |8 |9]

其中,[ ]意思是或,从校内电话号码或校外电话号码中选择一个;{ }表示重复,两边的数字表示重复次数的下限和上限;=意思是定义为;+意思是和,连接两个分量。

第三章

(1).为什么要进行需求分析?通常对软件系统有哪些要求?

答: 1) 为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件,不论我们把设计和编码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望,给开发者带来烦恼。 2)确定对系统的综合要求:1、功能需求;2、性能需求;3、可靠性和可用性需求;4、出错处理需求;5、接口需求;6、约束;7、逆向需求;8、将来可以提出的要求,分析系统的数据要求。

(2)怎样与用户有效地沟通以获取用户的真实需求? 答案 :

与用户沟通获取需求的方法:访谈;面向数据流自顶向下求精;简易的应用规格说明技术;快速建立软件原型

3 银行计算机储蓄系统的工作过程大致如下:储户填写的存款单或取款单由业务员键入系统,如果是存款则系统记录存款人姓名、住址、身份证号码等存款信息,并打印出存款存单给储户;如果是取款且存款时留有密码,则系统首先核对储户密码,若密码正确或存款时未留密码,则系统计算利息并打印出利息清单给储户。

答案: 用ER图描绘系统中的数据对象。

(5)分所析习题2中第4题的患者监狱系统。试用实体-联系图描述本系统中的数据对象并用数据流程描绘本系统的功能。

(6 )复印机的工作过程大致如下:未接到复印命令时处于闲置状态,一旦接到复印命令则进入复印状态,完成一个复印命令规定的工作后又回到闲置状态,等待下一个复印命令;如果执行复印命令时发现没纸,则进入缺纸状态,发出警告,等待装纸,装满纸后进入闲置状态,准备接收复印命令;如果复印时发生卡纸故障,则进入卡纸状态,发出警告等待维修人员来排除故障,故障排除后回到闲置状态。

请用状态转换图描绘复印机的行为。

答案: 从问题陈述可知,复印机的状态主要有“闲置”、“复印”、“缺纸”和“卡纸”。引起状态转换的事件主要是“复印命令”、“完成复印命令”、“发现缺纸”、“装满纸”、“发生卡纸故障”和“排除了卡纸故障”。

第五章

5.1为每种类型的模块耦合举一个具体的例子。

答:耦合式对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于接口的复杂度,进入或访问某一模块的点,以及通过接口的数据。一般模块之间的可能的连接方式有七种,构成耦合的七种类型,它们的关系为:

低 耦合性 高

独立性 弱 下面举例说明以上耦合:

A. 非直接耦合:两个模块没有直接的关系(模块1和模块2),独立性最强 B.数据耦合:即一个模块访问另一个模块的时候,彼此之间是通过数据参数来交换输入、输出信息的,这种耦合为数据耦合。这种耦合较为松散,模块间独立性较强。

G.内容耦合:如果出现以下情况之一,两个模块就发生了内容耦合 ① 一个模块访问另一个模块的内部数据。

② 一个模块不通过正常入口儿转到另一个模块的内部

③ 两个模块有一部分程序代码重叠(只可能发生在汇编程序中) ④ 一个模块有多个入口(这意味着一个模块有几种功能) Sub AA(….) …

… Goto L … End sub Sub BB(..) … … L: … … End sub

5.2为每种类型的模块内聚举一个例子

答:内聚标志着一个模块内各个元素之间彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。 低内聚:

A. 偶然内聚:如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的。这就叫做

偶然内聚

偶然内聚的例子:在模块T 中有A,B,C三条语句,至少从表面上看来这三条语句没什么联系,只是因为D,E,F,G中都有这三条语句,为了节省空间才把这三条语句作为一个模板放在一起。

B. 逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或相似的一类(例如一个模块产生各种类型的全

部输出),称为逻辑内聚

逻辑内聚的例子:某一个模块将打印,年,月,日,具体打印什么,将由传入的控制标志所决定。 C. 时间内聚:一个模块包含的任务必须在同一段时间内执行(例如,模块完成各种初始化工作),称为时

间内聚

时间内聚的例子:将多个变量的初始化放在同一个模块中实现。 中内聚:

A. 过程内聚:如果一个模块内的处理元素是相关的,而且必须以特定次序执行,称为过程内聚 过程内聚的例子:一个子程序,将开始读取学生的学号,然后是姓名,最后将读取分数,是由于特定的顺序而将这些操作组合在一起的

B. 通讯内聚:如果模块中所有的元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通讯

内聚

通讯内聚的例子:有一个子程序,它将打印实验报告,并且在完成后重新初始化传进来的实验数据。这个程序具有通讯内聚性。因为这两个操作由于使用同一个数据源联系在了一起。 高内聚:

A. 顺序内聚:如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一

个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。

顺序内聚的例子:有一个子程序,通过给出的生日,先计算出年龄。再根据年龄算出退休的时间,则这个程序具有顺序内聚性。

B. 功能内聚:如果模块内所有的元素属于一个整体完成一个单一的功能,则成为功能内聚。 功能内聚的例子:一个程序中所有的操作都是为了算出一个人的年龄

5.3用面向数据流的方法设计下列系统的软件结构

①储蓄系统

②机票预订系统

③患者监护系统

5.4 美国某大学有 200 名教师,校方与教师工会刚刚签订一项协议。按照协议, 所有年工资超过$26000(含$26000 )的教师工资将保持不变,年工资少于$26000 的教师将增加工资,所增加工资数额按下述方法计算:给每位教师所赡养的人(包 括教师本人)每年补助$100,此外,教师有一年工龄每年再多补助¥50,但是,增 加后的年工资总额不能多于$26000。

教师工资档案存储在行政办公室的磁带上,档案中有目前的年工资、赡养的人 数、雇佣日期等信息。需要写一个程序计算并印出每名教师的原工资和调整后的新 工资。

要求:(1)画出此系统的数据流图;(2)写出需求说明;

(3)设计上述的工资调整程序(要求用 HIPO 图描绘设计结果),设计时分别采 用两种算法,并比较两种算法的优缺点:

(a)搜索工资档案数据,找出年工资少于$26000 的人,计算新工资,校核是 否超过$26000,存储新工资,印出新旧工资对照表;

(b)把工资档案数据按工资从最低到最高的次序排序,当工资数额超过$26000 时即停止排序,计算新工资,校核是否超过限额,存储新工资,印出结果。 (4)你所画出的数据流图适应用那种算法? 解:(1)数据流图:

分解后:

(2)需求说明:

1. 功能需求:可以输入调资的标准,输入教师档案,经调资给出新的教师档案, 需要存储档案

2. 性能需求:软件的响应时间应小于0.5s,更新处理要快

3. 灵活需求:当需求发生某些变化时,该软件应该能够适应这些变化 4. 故障处理要求:出现错误时,应给予警告或提示 (3) A.

B.

(a)比较耗时,因为它要检索所有的档案,(b)从速度上看比较快,但是(b) 需要排序算法,比较复杂,(a)对于设计来讲比较简单 . (4)画出的数据流图比较适合(A)的算法

5.5下面将给出两个人玩的扑克牌游戏的一种玩法,试设计一个模拟程序,它的基本功能是: (1)发两手牌(利用随机数产生器)。 (2)确定赢者和赢牌的类型。

(3)模拟N次游戏,计算每种类型牌赢或平局的概率。要求用HIPO图描绘设计结果并且画出高层控制流程图。

扑克牌游戏规则如下:

(1)有两个人玩分别为A和B。

(2)一副扑克牌有52张牌,4种花色(黑桃、红桃、梅花、方块),每种花色的牌的点数按升序排列有2,3,4,.........,10,J,Q,K,A等13种。

(3)给每个人发三张牌,牌面向上,赢者立即可以确定。

(4)最高等级的一手牌成为同花,即3张牌均为同一种花色,最大的同花是同一种花色的Q,K,A。

(6)第三等级的牌是同点,即点数相同的三张牌,最大的同点是AAA。 (7)第四等级的牌是对子,即3张牌中有两张点数相同,最大的对子是A,A,K。

(8)第五等级的牌是杂牌,即除去上列4等之外的任何一手牌,最大的杂牌是不同花色的A.K,J。 (9)若两个人的牌类型不同,则等级高者胜;若等级相同,则点数高者胜;若点数也相同,则为平局。

程序:#include "stdio.h" int rabl(int a,int b,int *r) { }

int max(int T[10][10]) {

int t=0;

if(T[0][0]>T[1][0])

t=T[0][0];

int l,k,m,i,p; k=b-a+1; l=2; while(i

k=k+k+k+k+k; k=k%m; l=k/4+a;

if(l

else t=T[1][0]; if(t

t=T[2][0];

}

int E1(int T[10][10]) { }

int E2(int T[10][10]) { || }

int E3(int T[10][10]) { }

int E4(int T[10][10]) {

if(T[0][0]==T[1][0]==T[2][0])

return 1;

else

return 0;

(max(T[10][10])-2)==T[2][0])) // if(q=max(T[][10])) return 1;

int q=0;

if(((max(T[10][10])-1)==T[0][0]||(max(T[10][10])-1)==T[1][0]||(max(T[10][10])

-1)==T[2][0])&&((max(T[10][10])-2)==T[0][0]||(max(T[10][10])-2)==T[1][0]

if(T[0][1]==T[1][1]&&T[1][1]==T[2][1])

return 1;

else return 0;

else return 0;

}

return 1;

else if(T[0][0]==T[2][0]&&T[0][0]!=T[1][0])

return 1;

else if(T[1][0]==T[2][0]&&T[1][0]!=T[0][0])

return 1;

else return 0;

void main() {

int times=0,e1=0,e2=0,e3=0,e4=0,e5=0; int A[10][10],B[10][10]; int r1=2,r2=3;

printf("请输入游戏的次数\n"); scanf("%d",&times); for(int j=0;j

for(int i=0;i

if(E1(A[][10])>E1(B[][10])){

e1++;

printf("A赢,同花顺\n"); A[i][0]=rabl(1,13,&r1); A[i][1]=rabl(14,17,&r2); B[i][0]=rabl(1,13,&r1); B[i][1]=rabl(14,17,&r2);

else if(E1(A[][10])

else if(E1(A[][10])==E1(B[][10])&&E1(B[][10])==1) { }

else if(E2(A[][10])>E2(B[][10])) { }

else if(E2(A[][10])

else if(E2(A[][10])==E2(B[][10])&&E2(B[][10])==1) {

e2++; e2++;

printf("B赢,顺子\n"); e2++;

printf("A赢,顺子\n"); e1++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,同花顺\n"); printf("A赢,同花顺\n");

e1++;

printf("B赢,同花顺\n");

}

else

printf("B赢,顺子\n"); printf("A赢,顺子\n");

else if(E3(A[][10])>E3(B[][10])) { }

else if(E3(A[][10])

else if(E3(A[][10])==E3(B[][10])&&E3(B[][10])==1) { }

else if(E4(A[][10])>E4(B[][10])) { }

e4++;

printf("A赢,对子\n"); e3++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,同点\n"); printf("A赢,同点\n");

e3++;

printf("B赢,同点\n"); e3++;

printf("A赢,同点\n");

}

else if(E4(A[][10])>E4(B[][10])) { }

else if(E4(A[][10])==E4(B[][10])&&E4(B[][10])==1) ; { } else { }

if(max(A[][10])>max(B[][10])) else

printf("B赢,杂牌\n"); printf("A赢,杂牌\n");

e4++;

if(max(A[][10])>max(B[][10])) else

printf("B赢,对子\n"); printf("A赢,对子\n");

e4++;

printf("B赢,对子\n");

printf("同花顺赢牌概率为%d,顺子赢牌概率为%d,同点赢牌概率为%d,对子赢牌概率为%d,

杂牌赢牌概率为%d",e1/times,e2/times,e3/times,e4/times,e5/times); }

控制流程图:

第六章

1、假设只有SEQUENCE和DO_WHILE两种控制结构,怎么利用它们完成IF_THEN_ELSE操作? 解:转化如下:

K = 1

DO WHILE (条件 .AND. K.EQ.1)

程序块1 K=K+1

END DO

DO WHILE ( (.NOT. 条件) .AND. K.EQ.1)

2、假设只有SEQUENCE和IF_THEN_ELSE两种控制结构,怎么利用它们完成DO_WHILE操作? 解:转化如下; label:

3、画出下列伪代码程序的流程图和盒图: START IF p THEN

WHILE q DO f END DO ELSE BLOCK g n END BLOCK END IF STOP

解:流程图:

IF (条件) THEN ELSE END IF

程序块 程序块 GOTO label 程序块2 K=K+1

END DO

1510

1

2 τ(月)

盒图:

60

10

1

3.5

τ(月)

4、图6.18给出的程序流程图代表一个非结构化的程序,问:(1)为什么说它是非结构化的? (2)设计一个等价的结构化程序。

(3)在(2)题的设计中使用附加的标识变量flag了吗? 若没用,在设计一个使用flag的程序; 若用了,在设计一个不用flag的程序。

解:(1)通常所说的结构化程序,是按照狭义的结构程序的 定义衡量,符合定义规定的程序,每个代码块只有一个入口 和一个出口。图示的程序的循环控制结构有两个出口,显然 不符合狭义的结构程序的定义,因此是非结构化的程序。 (2)使用附加的标志变量flag,至少有两种方法可以把该 程序改造为等价的结构化程序,图示盒图描绘了等价的结构 化程序。

(3)不使用flag把该程序改造为等价的结构化程序的方法如图所示。

5、研究下面的伪码程序: LOOP:Set I to(START+FINISH)/2 IF TABLE(I)=ITME goto FOUND IF TABLE(I)TME Set FINSH to (I-1) IF (FINSH-START)>1 goto LOOP IF TABLE(START)=ITEM goto FOUND IF TABLE(FINSH)=ITEM goto FOUND Set FLAG to 0 Goto DONE FOUND:Set FLAG to 1 DONE:EXIT 要求:

(1)画出流程图。

(2)程序是结构化的吗?说明理由。

(3)若此程序是非结构化,设计一个等价的结构化程序并画出流程图。 (4)此程序的功能是什么?它完成预定功能有什么隐含的前提条件吗? 解:(1)该程序流程图如下:

T

(2)该程序不是结构化的,结构化的程序只有一个入口和一个出口,而该程序的流程途中有两个出口。 (3)等价的结构化程序的流程图如下:

F

(4)此程序有二分查找的功能,它完成预定功能的隐含前提条件是现有序列为从小到大顺序排好的有序序列。

6.用Ashcroft_Manna技术可以将非结构化的程序转化为结构化程序,图6.19是一个转换的例子。 (1)能否从这个例子总结出Ashcroft_Manna技术的一些基本方法? (2)进一步简化6.19(b)给出的结构化设计。

解:(1)从这个例子中看出,Ashcroft_Manna 技术的基本方法是,当待改造的序含有嵌套的非结构化的IF语句时,改造后的程序中增加DO-CASE语句和DO-UNTIL语句,并增加一个辅助变量I,I的初始值为1。最外层的IF语句在I=1时执行,执行完这个IF语句后把I赋值为随后应该执行的内层IF语句所对应的CASE标号值。DO-CASE语句的最大分支数(可执行的最大标号值)等于IF语句的个数。当执行完最内层的IF语句之后,把I赋值为可执行的最大标号值加1,而DO-UNTIL 循环的结束条件就是I等于这个值。 (2)进一步简化后的结构化程序的流程图如下所示。

7、某交易所规定给经纪人的手续费计算方法如下:总手续费等于基本手续费加上与交易中的每股价格和股数有关的附加手续费。如果交易金额少于1000元,则基本手续费为交易金额的8.4%;如果交易总金额在1000元~10000元之间,则基本手续费为交易金额的5%,再加34元;如果金额超过10000元,则基本手续费为交易金额的4%加上134元。当每股售价低于14元时,附加手续费为基本手续费的5%,除非买进、卖出的股数不是100的倍数,在这种情况下附加手续费的9%。当每股售价在14元到25元之间时,附加手续费为基本手续费的2%,除非交易的股数不是100的倍数,在这种情况下附加手续费的6%。当每股售价超过25元时,如果交易的股数(即不是100的倍数),则附加手续费为基本手续费的4%,否则附加手续费为基本手续费的1%。 要求:

(1)用判定表表示手续费的计算方法。 (2)用判定数表示手续费的计算方法。

解:令P代表交易的总金额,Q代表每股的售价,n代表交易的股数。 (1)表示手续费计算方法的判定表如图所示

(2)表示手续费计算方法的判定树

8、画出下列伪码程序的流图,计算它的环形复杂度。你觉得这个程序的逻辑有什么问题吗? C EXAMPLE

LOOP:DO WHILE X>0 A=B+1 IF A>10 THEN X=A ELSE Y=Z END IF IF Y

THEN PRINT X,Y

ELSE IF Y=2

THEN GOTO LOOP

ELSE C=3 END IF END IF G=H+R END DO IF F>0

THEN PRINT G ELSE PRINT K END IF STOP

解:流程图:

环形复杂度:

V(G)=结点E-弧数n

+1=17-11+1=7=判断结点 +1=6 +1=7=封闭的区域数

逻辑有问题,当Z>0时,容易形成死循环;条件Y

盒图:

10、人机对话由操作员信息和系统信息交替组成。假设一段对话总是由操作员信息开始以系统信息结束,用Jackson图描绘这样的人机对话过程。 解:

第七章

第一题

1、下面给出的伪码中有一个错误。请仔细阅读这段伪码,说明该伪码的语法特点,找出并改正伪码中的错误。字频统计程序的伪码如下: INITIALIZE the Program READ the first text record

DO WHILE there are more words in the text record

DO WHILE there are more words in the text record EXTRACT the next text word

SEARCH the word-table for the extracted word IF the extracted word is found INCREMENT the word’s occurrence count ELSE

INSERT the extracted word into the table END IF

INCREMENT the words-processed count END DO at the end of the text record READ the next text record

END DO when all text records have heen read PRINT the table and summary information TERMINATE the program

答:INSERT the extracted word into the table在这个后面,有没有给这个word的occurrence/count赋值为1 第二题

2、研究下面给出的伪码程序,要求: (1) 画出它的程序流程图。

(2) 它是结构化的还是非结构化的?说明理由。 (3) 若是非结构化的,则

(a) 把它改造成仅用3种控制结构的结构化程序; (b) 写出这个结构化设计的伪码; (c) 用盒图表示这个结构化程序。 (4) 找出并改正程序逻辑中的错误。

COMMENT:PROGRAM SEARCHES FOR FIRST N REFERENCES TO A TOPIC IN AN INFORMATION RETRIEVAL SYSTEM WITH T TOTAL ENTRIES INPUT N

INPUT KEYWORD(S)FOR TOPIC I=O MATCH=0 DO WHILE I≤T

I=I+1

IF WORD=KEYWORD THEN MATCH=MATCH+1 STORE IN BUFFER END

IF MATCH=N THEN GOTO OUTPUT END END IF N=0 THEN PRINT ″NO MATCH″

OUTPUT:ELSE CALL SUBROUTINE TO PRINT BUFFER INFORMATION END

第三题

3、在第2题的设计中若输入的N值或KEYWORD不合理,会发生问题。 (1) 给出这些变量的不合理值的例子。 (2) 将这些不合理值输入程序会有什么后果?

(3) 怎样在程序中加入防错措施,以防止出现这些问题? (1)答:N=1,KEYWOED=#。 (2)答:无法打印出任何信息。 (3)答:加入循环 第四题

4、(1)什么是模块测试和集成测试?它们各有什么特点?

答:模块测试是对每个单独的模块,分别用黑盒和白盒测试技术,测试它的功能是否正确, 检查模块控制结构中的特定路径并发现最大数量的错误。

其特点是:主要应用白盒测试的技术,对多个模块的测试可以并发的进行。 集成测试是把模块装配在一起形成完整的软件包,在装配的同时进行测试。 特点是:可能发生接口问题。

(2)假设有一个由1000行FORTRAN语句构成的程序,估计在对它进行测试期间将发现多少个错误?为什么?

答:月25至100个错误,美国的一些统计数字告诉我们通常这个比值在0.005~0.02之间,也就是说,测试之前每1000条指令中大约有5~20个错误。假设测试之前每1000条指令中有10个错误,则估计对它进行测试期间将发现的错误数为:5000*10/1000=50。 (3)设计下列伪码程序的语句覆盖和路径覆盖测试用例: START INPUT(A,B,C) IF A>5 THEN X=10 ELSE X=1 END IF IF B>10 THEN X=20 ELSE X=2 END IF IF C>15 THEN X=30 ELSE X=3 END IF PRINT (X,Y,Z)

STOP

答:此程序的语句覆盖用例:①A=5,B=10,C=15;②A=6,B=11,C=16 条件覆盖用例为:①A=5,B=10,C=15;②A=6,B=11,C=16。 语句覆盖测试用例

序判定 输入 预期的输出 X Y Z 1 2 3 1230 0 0 预期的X Y Z 1 2 3 1 2 31 20 3

号 1 2 3 A B C

1 F F F 1 1 1 2 T T T 246

0 0 0 序号 1 1 F 2 F 3 4 5 6 7 8

判定

输入

语句覆盖的含义是,选择足够多的测试数据,使被测试程序中的每个语句至少执行一次。

2 3 A B C F F 1 1 1 F T 1 1 6F T F 1 40 1 F T T 1 0 46

T T T T

1 0 23

F F 20 0 1 0 1 10 2 0 3 F T 20 1 60 12 3T F 20 40 1 0 3 120 T T 20 0 460 10 23

0 0 0 0 0

第五题

5、某图书馆有一个使用CRT终端的信息检索系统,该系统有下列4个基本检索命令 要求:

(1) 设计测试数据以全面测试系统的正常操作;

(2) 设计测试数据以测试系统的非正常操作

解:⑪测试系统正常操作的测试数据 ①顺序执行下列3个命令:

b(KEYWORD) s(L) d(N)

其中,KEYWORD是正确的关键字;L是执行命令b后在屏幕上显示的约20个行号中的一个(至少应该使L分别为第一个、最后一个和中央一个行号);N是执行命令s后列出的索引号中的一个(至少应该使N分别为第一个、最后一个和中央一个索引号)。

针对若干个不同的KEYWORD重复执行上述命令序列。 ②顺序执行下列2个命令:

f(NAME) d(N)

其中,NAME是已知的作者姓名;N是执行命令f后列出的索引号中的一个(至少应该使N分别为第一个、最后一个和中央一个索引号)。

针对若干个不同的NAME重复执行上述命令序列。

⑫测试系统非正常操作的测试数据

①用过长的关键字作为命令b的参数:例如,b(reliability software and hardware combined) 预期的输出:系统截短过长的关键字,例如,上列命令中的关键字可能性被截短为reliability software ②用不正确的关键字作为命令b的参数:例如,b(AARDVARK) 预期的输出:显示出最接近的匹配结果,例如,执行上列命令后可能显示 1.AARON,JULES(book)

③用比执行命令b后列出的最大行号大1的数作为命令s的参数 预期的输出:“命令s的参数不在行号列表中” ④用数字和标点符号作为命令b和命令f的参数 预期的输出:“参数类型错”

⑤用字母字符作为命令s和命令d的参数 预期的输出:“参数类型错”

⑥用0和负数作为命令s和命令d的参数 预期的输出:“参数数值错”

⑦命令顺序错:例如,没执行命令b就执行命令s,或没执行命令s就执行命令d 预期的输出:“命令顺序错”

⑧命令语法错:例如,遗漏命令名b、s、d或f;或命令参数没用圆括号括起来 预期的输出:“命令语法错”

⑨命令参数空:例如,b()、s()、d或f() 预期的输出:系统提供默认参数或给出出错信息 ⑩使用拼错了的作者姓名作为f的参数 预期的输出:“找不到这们作者的著作” 第六题

6、航空公司A向软件公司B订购了一个规划飞行路线的程序。假设你是软件公司C的软件工程师,A公司已雇用你所在的公司对上述程序进行验收测试。任务是,根据下述事实设计验收测试的输入数据,解释你选取这些数据的理由。

领航员向程序输入出发点和目的地,以及根据天气和飞机型号而初步确定的飞行高度。程序读入途中的风向风力等数据,并且制定出3套飞行计划(高度,速度,方向及途中的5个位置校核点)。所制定的飞行计划应做到燃料消耗和飞行时间都最少。

用正常的输入数据作为测试数据

① 向程序输入常规的出发点,目的地,飞机型号,5个位置校核点,高度和速度。 ② 输入3~5组出发点和目的地,重复执行步骤1

③ 输入固定的出发点、目的地、飞机型号、5个位置校核点和高度,分别输入3~5个不同的速度,重复执行步骤1

④ 输入固定的出发点、目的地、飞机型号、5个位置校核点和速度,分别输入3~5个不同的高度,重复执行步骤1

⑤ 输入固定的出发点、目的地、飞机型号、速度和高度,分别输入3~5组不同的位置校核点,重复执行步骤1

⑥ 输入固定的出发点、目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1

⑦ 输入固定的目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1

⑧ 输入固定的出发点、5个位置校核点和高度,分别输入3~5个不同的目的地,重复执行步骤1

(2) 用特殊的数据值作为测试数据

① 分别输入非常高和非常低的数据组合测试

② 用负数测试

③ 输入数字0进行测试

④ 分别输入相距非常远和非常近的出发点和目的地测试

ay和size,size小于数组的大小,并给出需要查找的值,该值在somearray中;

预期的输出:返回-1;

⑤ 首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值不在somearray中;

预期的输出:返回-1;

⑥ 首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值在somearray中;

预期的输出:返回-1;

第七题

7、严格说来,有两种不同的路径覆盖测试,分别为程序路径覆盖和程序图路径覆盖。这两种测试可分别称为程序的自然执行和强, , 迫执行。所谓自然执行是指测试者(人或计算机)读入程序中的条件表达式,根据程序变量的当前值计算该条件表达式的值(真或假),并相应地分支。强迫执行是在用程序图作为程序的抽象模型时产生的一个人为的概念,它可以简化测试问题。强迫执行的含义是,一旦遇到条件表达式,测试者就强迫程序分两种情况(条件表达式的值为真和为假)执行。显然,强迫执行将遍历程序图的所有路径,然而由于各个条件表达式之间存在相互依赖的关系,这些路径中的某一些在自然执行时可能永远也不会进入。 为了使强迫执行的概念在实际工作中有用,它简化测试工具的好处应该超过它使用额外的不可能达到的测试用例所带来的坏处。在绝大多数情况下,强迫执行的测试数并不比自然执行的测试数大很多,此外,对强迫执行的定义实际上包含了一种技术,能够缩短在测试含有循环的程序时所需要的运行时间。 程序的大部分执行时间通常用于重复执行程序中的DO循环,特别是嵌套的循环。因此必须发明一种技术,使得每个DO循环只执行一遍。这样做并不会降低测试的功效,因为经验表明第一次或最后一次执行循环时最容易出错。

Laemmel教授提出的自动测试每条路径的技术如下: 当编写程序时每个DO循环应该写成一种包含测试变量T和模式变量M的特殊形式,因此

DO I= 1 TO 38

应变成

DO I=1 TO M*38+(1-M)*T

可见,当M=0时处于测试模式,而M=1时处于正常运行模式。当处于测试模式时,令T=0则该循环一次也不执行,令T=1则该循环只执行一次。 类似地应该使用模式变量和测试变量改写IF语句,例如 IF X+Y>0 THEN Z=X

ELSE Z=Y应变成

IF M*(X+Y)+T>0 THEN Z=X

ELSE

Z=Y正常运行时令M=1和T=0,测试期间令M=0,为测试THEN部分需令T=+1,测试ELSE部分则令

T=-1。

要求:

(1) 选取一个包含循环和IF语句的程序,用Laemmel技术修改这个程序,上机实际测试这个程序并解释所得到的结果。

(2) 设计一个程序按照Laemmel技术自动修改待测试的程序。利用这个测试工具修改上一问中人工修改的程序,两次修改得到的结果一致吗?

(3) 怎样把Laemmel技术推广到包含WHILE DO 和REPEAT UNTIL语句的程序?

(4) 试分析Laemmel技术的优缺点并提出改进意见。

(1)答:if (x+y)>2

A=x

Else

A=y

改为:if M*(x+y)+T>2

A=x

Else

A=y

结果一致。

(2)答:两次结果是一致的

(3)答:WHILE DO 和IF ELSE修改技术类似。

(4)答:优点是可以使得结果更为精确。缺点是并不适用所有的程序,有时会有程序运行变得复杂。

第八题

8、对一个包含10000条机器指令的程序进行一个月集成测试后,总共改正了15个错误,此时MTTF=10h;经过两个月测试后,总共改正了25个错误(第二个月改正了10个错误),MTTF=15h。

要求:

(1)根据上述数据确定MTTF与测试时间之间的函数关系,画出MTTF与测试时间τ的关系曲线。在化这条曲线是做了什么假设?

(2)为做到MTTF=100h,必须进行多长时间的集成测试?当集成测试结束时总共改正了多少个错误,还有多少个错误潜伏在程序中?

答:(1)MTTF与测试时间τ的关系曲线如下:

MTTF(h)

15

10

1

2 τ(月)

假设调试过程中没有引入新的错误。

(2)根据估算平均无故障时间的公式可得:

1/K(Et/10000-100/10000)=10

1/K (Et/10000-300/10000)=15

计算可得:K=333,Et=45

当MTTF=100h时,有

1/333(45/10000-Ec/10000)=100

计算可得:Ec=42.按前两个月测试改错的进度估算,需进行3个月的集成测试。

当测试结束时,共改正了42个错误,还有3个错误潜伏在程序中。

第九题

9.如对一个长度为100000条指令的程序进行集成测试期间记录下下面的数据:

(a)7月1日:集成测试开始,没有发现错误。

(b)8月2日:总共改正100个错误,此时MTTF=0.4h

(c)9月1日:总共改正300个错误,此时MTTF=2h

根据上列数据完成下列各题。

估计程序中的错误总数。

为使MTTF达到10h,必须测试和调试这个程序多长时间?

画出MTTF和测试时间τ之间的函数关系曲线。

答:(1)根据估算平均无故障时间的公式可得:

1/K(Et/100000-100/100000)=0.4

1/K (Et/100000-300/100000)=2

计算可得:K=1000,Et=350即程序中的错误总数为350。

(2)当MTTF=10h时,有

1/K (350/100000- Ec/100000)=10

计算可得:Ec=340.按前两个月测试改错的进度估算,还进行2个月的集成测试。

(3)MTTF和测试时间τ之间的函数关系曲线如下:

MTTF(h)

2

0.4

1

第十题

10、在测试一个长度为24000条指令的程序时,第一个月由甲、乙两名测试员各自独立测试这个程序。经一个月测试后,甲发现并改正20个错误,使MTTF达到10h。与此同时,乙发现24个错误,其中6个甲2 τ(月)

也发现了。以后由甲一个人继续测试这个程序。问:

(1)刚开始测试时程序中总共有多少个潜在的错误?

(2)为使MTTF达到60h,必须再改正多少个错误?还需多长测试时间?

(3)画出MTTF与集成测试时间τ之间的函数关系曲线。

答:(1)根据公式:B0=B2B1/bc,可得:

B0=20*24/6=80,即刚开始测试时程序中总共有80个错误。

(2)根据估算平均无故障时间的公式可得:

1/K(80/24000-20/24000)=10

1/K(80/24000- Ec/24000)=60

计算可得:K=40,Ec=70

即还需要改正50个错误。根据甲的改正进度,估计还需要3个月。

(3)MTTF与集成测试时间τ之间的函数关系曲线如下:

MTTF(h)

60

10

1

3.5 τ(月)

第八章

一.答:软件的可维护性与哪些因素有关?在软件开发过程中应该采取哪些措施来提高软件产品的可维护性?

答:(1)、可理解性

(2)、可预测性

(3)、可修改性

(4)、可移植性

(5)、可重用性

在每个阶段结束前的技术审查和管理复查中,应该着重对可维护性进行复审过程中,应该对将来要改进的部分和可能要改的部分加以注意指明,应该讨论软件的可移植性问题,考虑可能影响软件维护的系统界面。在设计和编码过程中应该尽量使用可重用的软件构件,每个测试步骤都可以暗示在软件正式交付使用之前,程序中可能需要做预防性维护的部分。在完成每项维护工作之后,都应该对软件维护本身仔细认真地复审。

二:答:应该选取a 和 c 因为文档是影响软件可维护性的决定因素。因此,文档甚至比可执行的程序代码更重要,文档必须和程序代码同时维护,只有和程序代码完全一致才能是真正有价值的代码。 文档修改:针对系统中当前正在修改的那些部分文档建立完整的文档。

代码重构:首先用重构工具分析源代码,标注出和结构化程序设计概念相违背的部分。然后重构有问题的代码(此项可以工作可自动化进行)。最后,复审和测试生成的重构代码(以保证没有引入异常)并更新代码文档。

三: 答:对储蓄系统:一般大型软件的维护成本远远高于开发成本若干倍,所以在设计时就应该考虑到软件维护成本,而且在开发过程中应该使用标准的程序设计语言和标准的操作系统接口,可以大大提高软件的可维护性,也可以减少软件存在的错误;

对机票预订系统:往往人一多系统瘫痪几率就大,在开发人员不在场的情况下,很容易出现系统错误,维护软件也是很困难的,也会给很多人带来不便,所以,在设计过程中应该严格科学的管理规划还有合理设计模块,是各个模块的独立性越高,这样对软件的改进越方便,也便于快速纠错;

对患者监护系统:应该要考虑它的完善性和预防性,要能满足用户在使用过程中的增加和修改工作,还要为了改善未来的可维护性或可靠性而修改软件。更要考虑系统数据的隐秘及安全,随时备份。


相关内容

  • 软件工程导论(第五版)课后习题答案
  • <软件工程导论>课后习题答案 第一章 软件工程概论 1.什么是软件危机? 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题.这些问题表现在以下几个方面: (1)用户对开发出的软件很难满意. (2)软件产品的质量往往靠不住. (3)一般软件很难维护. (4)软件生产效率很低 ...

  • 物流导论 - 课程教学大纲
  • 附件1 青岛农业大学本科专业跨学院 开设课程教学大纲审核表 ___________学院: 现将__________________学院对贵学院_______________________专业开设的_____________________课程教学大纲送交贵学院审核,请您们根据以下教学大纲审定表的要 ...

  • 2015年英语类3D电子书(题库)
  • 2015年英语类3D电子书(题库)共428种 英语类考试 大学英语考试 大学英语四级               1.[圣才视频]大学英语四级考试真题解析班(网授)[免费下载] 8.[3D题库]2015年12月大学英语四级题库[历年真题+章节题库+模拟试题][免费下载] ...

  • [传递现象导论]1-4章课后答案
  • 第一章习题解 1-1. 水流进高为h =0.2m 的两块宽平板之间的通道,如图1-52所示.已知:通道截面具有速度分布u x =0. 075-7. 5y 2.求:通道截面平均速度U . 解:由式(1-3)得通道截面平均速度 u dA ⎰U = A x A = 2⎰ 0.1 (0.075-7.5y ) ...

  • 通信工程导论课程报告
  • 通信工程导论课程报告 一.通信工程专业方向的认识: 通信工程专业方向主要指光纤通信.无线通信.网络与交换.多媒体通信四个方向 1光纤通信: □ 已成为一种最主要的信息传输技术,迄今尚未发现可以取代它的更好的技术.即使是在全球通信行业处于低迷时期,光纤通信的发展也从未停滞过.从现代通信的发展趋势来看, ...

  • 大学课本课后习题答案
  • 注册可用 公共课程 http://www.10xiao.com/forum-6-1.html 新视野大学英语读写教程第四册答案 http://www.10xiao.com/thread-7-1-1.html 新视野大学英语读写教程第三册答案 http://www.10xiao.com/thread- ...

  • [算法导论]习题答案
  • 算法导论第二版答案 Chapter2 Getting Start 2.1 Insertion sort 2.1.2 将Insertion-Sort重写为按非递减顺序排序 2.1.3 计算两个n位的二进制数组之和 2.2 Analyzing algorithms 2.2.1将函数n3/1000100 ...

  • 信息技术导论复习题
  • 一.单选题,答案填在括号内. 1. 冯·诺依曼的主要贡献是( ). A.发明了微型计算机 B.设计了第一台电子计算机 C.提出了存储程序的概念 D.设计了高级程序设计语言 2.微型计算机硬件系统中最核心的部件是( ). A. 主板 B. CPU C. 内存储器 D.I/O设备 3.计算机系统必须具备 ...

  • [转]振动相关经典书籍
  • 1  传统教材及其更新 对我国振动教学的影响影响很大的国外教材当推Timoshenko等的<工程中的振动问题>(S. Timoshenko, S. H. Young, W. Weaver. Vibration Problems in Engineering (4th ed.). John ...