没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
案例分析-开发综合程序
经过基本的编程训练后,我们已经能编写解决小问题的程序,对程序的开发也有了初步
的认识,还掌握了 C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以
完成自我任务的成就感。但是,对于程序设计而言,学习 C 的步伐不应该停留于此。我们最
终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设
计思想,用 C 语言开发出解决复杂问题的大型综合程序。
首先介绍软件工程的概念,然后通过一个具体的案例讲述如何在综合程序的开发中应用
软件工程的思想和方法。
1 软件工程........................................................................................................................ 1
1.1 软件工程的定义....................................................................................................................1
1.2 传统的生命周期方法学........................................................................................................1
2 综合程序的开发流程...................................................................................................................2
2.1 问题定义................................................................................................................................3
2.2 程序分析................................................................................................................................3
2.3 程序设计................................................................................................................................4
2.3.1 结构化程序设计方法.....................................................................................................4
2.3.2 设计工具.........................................................................................................................6
2.2.3 扫雷游戏的设计.............................................................................................................8
2.4 编码......................................................................................................................................16
2.4.1 全局变量........................................................................................................................17
2.4.2 函数...............................................................................................................................17
2.4.3 风格...............................................................................................................................17
2.4.4 扫雷游戏的源程序.......................................................................................................21
2.5 测试和调试..........................................................................................................................29
2.5.1 调试...............................................................................................................................29
2.5.2 测试...............................................................................................................................30
2.6 运行与维护..........................................................................................................................34
2.7 分工协作..............................................................................................................................34
小结 ................................................................................................................................................35
1
1 软件工程
软件工程是随着软件的发展而诞生的一门学科。我们现在都知道软件由程序、数据和
文档组成,其中程序是主体,数据是使程序能正常操纵信息的数据结构,文档是与软件的开
发、维护和使用有关的材料。然而这一概念的形成却经历了三个阶段:第一阶段是在计算机
系统发展的早期时代,即 60 年代中期以前,由于硬件非常昂贵、运算速度低、内存容量少,
造成这时的软件就是规模较小的程序,需求者和编写者往往是同一个人,他们强调“程序设
计技巧”以节省存储单元和 CPU 时间,写出的程序只要能在计算机上的除正确的结果,程
序的写法可以不受任何约束,这些程序很难被别人看懂。这种个体化的软件环境,使得软件
设计通常是在人们头脑中进行的一个隐含的过程,除了程序清单之外,没有其它文档资料保
存下来;第二阶段是从 60 年代中期到 70 年代中期,随着计算机硬件的发展和应用的日益普
及,这个时期的一个重要特征是出现了“软件作坊”,但是基本上仍然沿用早期形成的个体
化软件开发方法,此时的软件包含程序及简单的说明书。可是当软件数量急剧膨胀时,“软
件危机”爆发了,所谓软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重
问题,如对软件开发成本和进度的不准确估计造成的超预算、拖延、甚至半途而废;软件产
品的质量往往靠不住;软件常常是不可维护的,包括程序中的错误难以改正、难以适应新的
软硬件环境的变化和无法扩展等;软件成本在计算机系统总成本中所占比例逐年上升;软件
开发生产率远远落后于计算机应用迅速普及深入的趋势,造成软件产品“供不应求”。为了
探讨如何解决软件危机问题,1968 年北大西洋公约组织的计算机科学家在德国召开了国际
会议,在该会议上正式提出并使用了“软件工程”这个名词,一门新兴的工程学科就此诞生
了;第三阶段也称为软件工程阶段,约从 70 年代至今,软件工作的范围从只考虑程序编写
扩展到涉及整个软件生存期,软件包括程序、数据和文档,软件开发的成果具有社会属性,
它要在市场中流通以满足广大用户的需要,软件开发者和用户的分工和责任是十分清楚的。
开发者应该尽可能地实践软件工程,以生产出高质量的软件。
1.1 软件工程的定义
虽然有很多软件工程的定义,但 Fritz Bauer 在 1968 年北大西洋公约组织的该主题的奠
基性会议上给出的定义仍是进一步展开讨论的基础:
软件工程是建立和使用一套合理的工程原则,以便获得经济的软件,这种软件是可靠的,
可以在实际机器上高效地运行。
IEEE 给出了一个更全面的定义:
软件工程是:(1) 将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和
维护,即将工程化应用于软件。(2) 在(1)中所述方法的研究。
更进一步地说,软件工程视软件的开发是一项工程,它借鉴传统工程的原则、方法,使
经过时间考验而证明是正确的管理方法和当前能够得到的最好的开发技术结合了起来,以提
高质量、降低成本为目的。
1.2 传统的生命周期方法学
一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,这就
如同一个人要经历胎儿、儿童、青年、中年、老年,直到最终死亡的漫长时期一样。通常把
软件经历的这个漫长的时期称为生命周期。软件工程强调使用生命周期方法学和各种结构分
析及结构设计技术。它们是在 70 年代为了对付应用软件日益增长的复杂程度、漫长的开发
2
周期以及用户对软件产品经常不满意的状况而发展起来的。人类解决复杂问题时普遍采用的
一个策略就是“各个击破”,也就是对问题进行分解然后再分别解决各个子问题的策略。
软件工程采用的生命周期方法学就是从时间角度对软件开发和维护的复杂问题进行分
解,把软件生命的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后逐步
完成每个阶段的任务。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而
后一阶段认为内务的完成通常是使前一阶段提出的解法更进一步具体化,加进了更多的实现
细节。在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审,若检查通不过,
则必须进行必要的返工,返工后还要再经过审查。审查的一个主要标准就是每个阶段都应该
提交和所开发的软件完全一致的高质量的文档资料,从而保证再软件开发工程结束时有一个
完整准确的软件配置交付使用。文档不仅是前后阶段的通信工具,而且是软件交付使用后进
行维护的依据。所以,采用生命周期方法学或称传统的软件工程方法,就使软件开发工程的
全过程以一种有条不紊的方式进行,保证了软件的质量,特别是提高了软件的可维护性。
一般来说,软件生命周期由软件定义、软件开发和软件维护三个时期组成,每个时期又
进一步划分成若干个阶段。软件定义时期的任务是确定软件开发工程必须完成的总目标;确
定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项
工程需要的资源和成本,并且制定工程进度表。这个时期的工作通常又称为系统分析。这一
时期通常进一步划分成三个阶段,即问题定义、可行性研究和需求分析。
时 期 阶 段 关键问题
问题定义 问题是什么?
可行性研究 有可行的解吗?
问题定义
需求分析 系统必须做什么?
总体设计 概括地说,应该如何解决这个问题? 系统
设计
详细设计 怎样具体地实现这个系统?
编码和单元测试 正确的程序模块
开发
系统
实现
综合测试 符合要求的软件
维护 维护 持久地满足用户需要的软件
表 2-1 软件生命周期每个阶段及其解决的关键问题
开发时期具体设计和实现在前一个时期定义的软件,它通常由下述四个阶段组成:总体
设计,详细设计,编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个阶
段又称为系统实现。
维护时期的主要任务是使软件持久地满足用户的需要。具体地说,当软件在使用过程中
发现错误时应该加以改正;当环境改变时应该修改软件以适应新的环境;当用户有新要求时
应该及时改进软件以满足用户的新需要。每一次维护活动本质上都是一次压缩和简化了的定
义和开发过程。表 2-1 列出了软件生命周期每个阶段及其解决的关键问题。
下一节,针对如何用 C 开发出一个大型综合程序这个主题,我们将从“软件工程”的
角度详细介绍开发综合程序的方法和流程。
2 综合程序的开发流程
从上一节中,我们已了解到编码只是软件开发的一个阶段,而且是处在实现阶段。对
于 C 语言的初学者,由于没有正式接受系统化开发方法的指导,往往会形成一个错误的认
识:程序的开发就是编码。也就是说,拿到问题后,马上就开始写程序。这种做法的不良后
3
果初学者无法体会到,是因为他们所面临的需要解决的问题,无论从规模而言,还是从难易
程度而言,实在是太小了。所以在直接编写程序的过程中,大脑已经让初学者无意识地完成
了问题的定以和设计过程。但是,这种侥幸的“个体化”做法对于复杂的现实问题的解决是
绝对行不通的。虽然目前我们还谈不到软件项目的开发,但是相对初学阶段,我们已经可以
解决较为复杂的问题了,即进入综合程序的阶段,因此,必须从现在开始,树立正确的开发
观,为今后专业化开发打好基础。
遵循软件的开发流程,大型综合程序的开发经历问题定义、分析、设计、编码、测试
和维护几个阶段。
2.1 问题定义
问题定义阶段是整个过程中占用时间最少的阶段,在这个步骤中我们的任务是明确要
解决的问题是什么。如果不知道问题是什么就试图解决这个问题,显然是盲目的,只会浪费
时间和金钱,结果是毫无意义的。
在综合程序训练时期,欲解决的问题可由教师提供,或者由学生自行选题。假若是后
者,那么学生必须动动脑筋,寻找身边有哪些事情可用计算机解决,然后确定一个可行的。
例如,某位同学非常熟悉 Windows 系统中自带的扫雷游戏,于是他以此为题,即自己实现
一个类似功能的扫雷游戏。
2.2 程序分析
这个阶段的任务仍然不是具体地解决问题,而是理解问题和分析问题,确定“为了解
决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。除此之外,
还要确定可能的输入或输出数据是什么。
我们在问题定义步骤中得到的问题,有时仅仅是一个抽象的题目,有时除题目外还附
一段简要说明。无论问题以何种形式出现,都需要做进一步的分析,以获得解决问题的计算
机系统必须实现哪些功能。下面我们以扫雷游戏为例,看看如何分析问题。这通过两步来完
成:首先必须对 Windows 系统中的扫雷游戏进行了解,然后确定我们将实现的扫雷系统要
做什么。
通过亲身体验或其它交流手段,可获知这个游戏是在屏幕显示的一个雷区范围内(如
图 2-1(a)所示),系统预先埋设了一定数目的地雷(图 2-1(a)中笑脸左侧小窗显示的数字),
游戏者在游戏过程中通过判断,若能正确标记出雷区中的所有地雷,则游戏胜利(如图 2-1(b)
所示);否则踩雷,游戏失败(如图 2-1(c)所示)。具体的游戏规则如下:
1) 在“游戏”菜单上,单击“开局”,出现图 2-1(a),其中包括地雷计数器窗口、计
时器窗口和雷区。开局后,单击雷区中的任何一个方块,便启动计时器。每标记
一个地雷,地雷计数器减 1;
2) 用鼠标左键单击某个方块,可挖开它。若所揭方块下有雷,则踩雷,即所有含地
雷的块都标记Å,这局游戏失败;如果方块上出现数字,它代表在它周围的八个
方块中共有多少颗地雷;
3) 用鼠标右键单击某个方块,则标记此块下埋着地雷(实际上可能是误标),显示为
。每标记一个地雷,地雷计数器减 1;
4) 用鼠标右键击打某个方块两次,则在某块上面标一个问号(?),意味着没有把握判
定它是否有雷。标记为?的块可在恰当的时候再击打鼠标右键两次或单击左键,
将其标记为地雷或挖开;
5) 如果某个数字方块周围的地雷全都标记完,可以同时单击鼠标左右键,将其剩下
的方块挖开。如果挨着这个方块的地雷没有全部标记完,则未挖开的方块将闪烁。
4
通过分析上述游戏规则,抛开 Windows 扫雷游戏中界面显示、鼠标操作等非本质的东
西,我们从 Windows 扫雷游戏中提取的主要功能包括:规则 1)隐含初始化新游戏的开局功
能,规则 2)隐含的挖雷功能,规则 3)对应的标记地雷功能,规则 4)对应的标记疑问功
能,规则 5)的自动挖开功能。另外,我们还可以看到游戏的输入是启动这些功能的指示信
息,通过鼠标左右键的操作来表达;游戏的输出是游戏是否成功。
我们所要实现的扫雷游戏正是Windows扫雷游戏的模仿版,也就是说能够实现 Windows
扫雷游戏的主要功能,因此,我们的目标系统必须具备:开局功能、挖雷功能、标记雷功
能、标记疑问功能、自动挖开功能。到这里,程序分析的工作就结束了。接下来,将进入
下一阶段——程序设计——的工作。
2.3 程序设计
著名计算机科学家 Nikiklaus Wirth 提出了公式:程序=算法+数据结构,这一公式反映
了程序的两个要素:算法和数据结构,实际上,程序还应当有另外两个要素:程序设计方法
和语言工具。这四个方面是一个程序设计人员所应具备的知识。算法是灵魂,数据结构是加
工对象,语言是工具,程序设计需要好的设计方法。
经过程序分析阶段的工作,综合程序必须“做什么”已经清楚了,现在是决定“怎样
做”的时候了,也就是到了设计算法和重要数据的数据结构的时候了。程序这个阶段的设计
工作,应该对要解决的问题设计出具体的解决方案,得出对目标系统的精确描述,从而在编
码阶段可以把这个描述直接翻译成用 C 语言书写的程序。
当然,程序设计将采用结构化程序设计方法,自顶向下逐步求精地设计出综合程序的
实现“蓝图”。为此,我们首先介绍结构化程序设计方法,然后列举描述算法的常用工具,
接着仍以扫雷游戏为例,详细说明设计阶段的工作和结构化程序设计方法的应用,最后谈谈
合作情况下如何分工协作的问题。
2.3.1 结构化程序设计方法
结构化程序设计的概念最早由 E.W.Dijkstra 提出。在软件发展的早期,程序员追求效率
第一,在程序中滥用 GOTO 语句,程序的控制流程时而 GOYO 过来,时而 GOTO 过去,
把程序的逻辑拧成一团乱麻,造成程序难于阅读和理解,有人称这种的可读性非常差的程序
为“一碗意大利细面条”(bowl of spaghetti,简称 BS 程序),“剪不断,理还乱”。在这种局
面下,1965 年 Dijkstra 在一次会议上指出:“可以从高级语言中取消 GOTO 语句”,“程序的
质量与程序中所包含的 GOTO 语句的数量成反比”。1966 年 Böhm 和 Jacopini 证明了:“任
何程序的逻辑均可用顺序、选择和循环这三种控制结构或它们的组合实现”,这一证明奠定
图 2-1 Windows 扫雷游戏 (a)开局 (b)胜利 (c)失败
剩余36页未读,继续阅读
fangfuyi2006
- 粉丝: 0
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0