C语言实践教程课件第3章课件_第1页
C语言实践教程课件第3章课件_第2页
C语言实践教程课件第3章课件_第3页
C语言实践教程课件第3章课件_第4页
C语言实践教程课件第3章课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.1软件开发过程3.1.1软件概念在现代软件工程中软件概念不仅指程序本身,还包括规范而完备的文档材料。其中文档是软件“质”的部分,而程序则是文档代码化的表现形式。3.1.2软件的特点软件生产是逻辑思维,集中于开发而不是制造,因此起决定作用的是人的智能的高效率的发挥。这与开发者的个人技术水平和工作作风有很大的关系。3.1.3软件开发的一般步骤研究软件的生存周期可分为三个大阶段:计划阶段,开发阶段和维护阶段。计划阶段:这一阶段的任务是进行问题定义,可行性研究和需求分析。开发阶段:这一阶段的任务就是进行设计、编码和测试。维护阶段:维护阶段的任务就是通过各种必要的维护活动使系统持久地满足用户的需要,通常通过四类维护活动,改正性维护,既诊断和改进在使用过程中发现的软件错误;适应性维护,既修改软件以适应变化的环境;完善性维护,根据用户的要求改进或扩充软件使它更加完善;预防性维护,既修改软件为将来的维护活动做准备。3.1.4软件开发时常见的错误观念只要有对总目标的一般性描述,就可以开始写代码了,其他细节问题可以再补充。给出程序,并且运行了任务就算完成任务。软件灵活性大,易于修改。没有必要进行评审进度耽误了,可以增加人员。软件工作直到交付使用为止3.2结构化程序设计3.2.1结构化程序设计的一般概念程序设计优劣的判定标准

(1)功能应能满足用户目标要求;(2)可靠性应达到预定水平;(3)用户界面友好;(4)在规定的条件下执行时间要短;(5)资源消耗少;(6)可维护性好;(7)可移植性高;结构化程序设计原则

(1)大型程序,按功能划分模块。(2)每一个基本程序单元,具有“独立程序“的特征,既单入口,单出口;强调由3种基本结构(顺序、选择、循环)组成;严格限制使用goto语句;不包含无限循环,即程序执行时间是有限的;程序中所有语句都应有执行的机会;书写格式清晰。按上述原则进行设计,就称为结构化程序设计。结构化程序设计的优点在于能使结构清晰,风格固定,便于理解、交流和维护。其缺点是设计出的程序运行效率有所降低。3.2.2自顶向下逐步求精模块程序设计思想程序模块化的优点包括:(1)便于将复杂问题转化为个别小问题。(2)便于从抽象到具体地进行程序设计。(3)便于测试和维护。采用模块化原则设计程序时,某个模块所包含的信息(过程和数据)其他模块不需要知道,既不能访问,以体现模块的独立性。(4)便于理解分析程序。在对模块化程序进行分析时,由于每个模块功能明确,彼此独立,所以可以采用自顶向下的分析方法,首先确定每个模块的功能,进而理解整个程序。自顶向下逐步求精的程序设计方法自顶向下设计的一个重要特点是,对某一层来说,下一层设计的细节是隐藏起来的,只要那些必须通过接口的数据和控制才有定义。如果一个数据结构被整个包含在某个低层模块之中。在设计到达该层之前,没有必要进行描述。但当数据必须由某层的几个模块共享时,则必须在进展到该层之前就选定数据结构。逐步求精的特点是考虑问题时先整体后局部,先抽象后具体。它要求从问题的全局出发,首先明确“做什么“,接着将其进一步分解成若干子任务分而治之。一步一步精细化,每步都向程序的最终形式接近一点,直到获得一个在你所使用的计算机系统上可执行的程序为止。由此可见,通常把自顶而下逐步求精及模块化设计结合起来实现程序的结构化设计。

程序中常见的错误有两种:一种是语法错误:另一种是逻辑错误。语法错误一般会在源程序被编译时由编译程序及时发现,因此相对比较容易排除。而程序的逻辑错误常常是潜在的。例如,在程序中使用了零作除数,将导致程序执行时出现异常,而这种错误编译程序可能无法查出。这就要求程序设计者根据设计文挡。反复地,不厌其烦地阅读程序并精心设计测试用例,力求及时发现程序中的错误。

测试的目的是发现程序中的错误,而程序的目标是开发出高质量的完全符合用户需求的程序,因此,发现错误必须要改正错误,这又是调试的目的。调试是测试阶段最困难的工作。程序测试过程涵盖了整个程序生命周期的过程。包括需求定义阶段的需求测试、编码阶段的单元测试、集成测试以及后期的确认测试、系统测试,验证程序是否合格、能否交付用户使用等。3.3.1程序测试原则在测试阶段,应遵从以下测试原则。设计测试用例设计测试用例时,应给出测试的预期结果。

设计非法输入的测试用例一个程序,不仅是当输入是合法的时候,能正确运行,而且当有非法输入(有意的和无意的)时,还能够拒绝接受那些非法输入并给出提示信息。进行回归测试对于程序的任何修改都有可能引入新的错误,用以前测试用例进行回归测试,有助于发现由于修改程序而引入的新错误。

集中测试容易出错的程序段对一些测试进行统计的结果表明:一段程序中已发现的错误数越多,则其中存在错误的概率也就越大。为了提高测试的效率,在进行深入的测试时,要集中测试那些容易出错即出错多的程序段。妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。

一个好的测试用例是能够发现至今尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。3.3.2.程序测试的常用方法从是否需要执行被测程序的角度,程序测试方法和技术分为静态测试和动态测试;同时按功能他们又被划分为白盒测试和黑盒测试。静态测试:静态测试包括代码检查、静态结构分析、代码质量度量等。动态测试:动态测试是基于计算机的测试,是为了发现错误而执行程序的过程。

白盒测试方法:也称结构测试。它是将程序视为一个透明的盒子,即根据程序的内部结构和处理过程,对程序的所有逻辑路径进行测试。

黑盒测试方法黑盒测试方法简称黑盒法,也称功能测试。它是着眼于程序的外部特征,而不考虑程序的内部逻辑构造。黑盒法是在程序的接口上进行测试,看它能否满足功能要求,输入能否正确接收,并能否输出正确的结果,以及外部信息(如数据文件)的完整性能否保持。黑盒法主要有等价类划分法、边界值分析法、错误推测法和因果图法等。3.3.3程序测试过程程序测试是保证程序质量的重要手段。程序测试过程分4个步骤,即单元测试、集成测试、验收测试和系统测试。

单元测试单元测试是对程序设计的最小单位——模块(程序单元)进行正确性检验测试。单元测试主要针对模块的以下5个基本特性进行:①模块接口测试——测试通过模块的数据流;②数据结构测试;③重要的执行路径检查;④出错处理测试;⑤影响以上各点及其他相关点的边界条件测试。单元测试方法可以采用静态分析和动态测试。这两种测试可以互补。

在进行模块测试时,必须设计一个驱动模块和若干个桩模块。

驱动模块的作用是模拟被测试模块的调用模块。桩模块的作用是模拟被测试模块的下属模块。

集成测试集成测试是在组装程序的过程中,对组装的模块进行测试。集成测试包括了子系统测试和系统测试。集成测试所涉及的内容包括:程序单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。确认测试与系统测试①确认测试确认测试的任务是验证程序的功能和性能。②系统测试系统测试是把通过测试确认的程序,作为整个基于计算机系统的一个元素,与计算机硬件、外设、支撑程序、数据和人员等其他系统元素组合在一起,在实际运行(使用)环境下对计算机系统进行一系列的集成测试和确认测试。3.3.4程序的调试程序调试(通常称Debug,即排错)程序调试活动由两部分组成:一是根据错误的迹象确定程序中错误的确切性质、原因和位置。二是对程序进行修改,排除这个错误。程序调试的基本步骤:(1)错误定位;(2)修改设计和代码;(3)进行回归测试;

程序调试方法程序调试可以分为静态调试和动态调试。静态调试主要是指通过人的思维来分析源程序代码和排错;动态调试是辅助静态调试的。主要的调试方法采用:(1)强行排错法(2)回溯法

(3)原因排除法原因排除法是通过演绎和归纳,以及二分法来实现。

演绎法是列出所有可能的原因和假设,然后排除一个又一个不可能的原因,直到剩下最后一个真正的原因为止。归纳法是一种从特殊推断出一般的系统化思考方法。其基本思想是从一些线索着手,通过分析寻找到潜在的原因,从而找出错误。二分法的基本思想是,如果已知每个变量在程序中若干个关键点的正确值,则可以使用定值语句(如赋值语句、输入语句等)在程序中的某点附近给这些变量赋以正确值,然后运行程序并检查程序的输出。如果输出结果是正确的,则错误原因在程序的前半部分;反之,错误原因在程序的后半部分。对错误原因所在的部分重复使用这种方法,直到将出错范围缩小到容易诊断的程度为止。3.4算法3.4.1算法的概念为解决问题而采用的方法和步骤就称为算法。计算机的算法就是为实现某个任务而构成的指令集,是有穷的计算过程。它规定了在程序中如何对数据进行正确处理的运算步骤。著名科学家Wirth(沃思)提出一个著名的公式表达程序设计的实质:程序=算法+数据结构显然,在程序设计中,算法是灵魂,数据结构是加工对象,算法解决的是“做什么”和“怎么做”的问题。程序中的操作语句就是对算法的实现。

有的算法可能只需要很少的步骤而有些算法则需要较多的步骤。一般而言,应该选择易于理解、简单、步骤少的算法。所以在进行算法设计时,不仅要保证算法的正确性,还要考虑算法的质量。选择合适的算法。3.4.2算法的特性

1.有穷性

2.确定性

3.有效性

4.有零个或多个输入输入是指在算法执行时,需要从外界取得的信息。一个算法可以没有输入,也可以有一个或多个输入,这都取决于问题本身。

5.有一个或多个输出输出就是将算法执行的结果送到输出设备。没有输出的算法是无意义的。上述5个方面是一个正确算法应具备的特征,同时算法还应该具有直观,清晰、易懂的表示形式,便于维护、修改和交流。3.4.3算法的描述方法描述一个算法,可以用多种不同的表示方法。常见的有自然语言表示法、流程图、N—S图、伪代码和PAD图等。3.4.3.1用自然语言表示算法通常自然语言只用来描述简单的问题。3.4.3.2用流程图表示算法传统的流程图

流程图是算法的图形描述工具。它用几何图形来表示各种操作,直观形象、易于理解,是最常用的一种描述算法的方法。美国国家标准化协会(AmericanNationalStandardInstitute,ANSI)规定了一些常用的流程图符号。用流程图表示三种基本结构

1966年,Bohar和Jacopini提出以下三种基本结构,通常用这三种基本结构来作为表示一个良好算法的基本单元。顺序结构:选择结构,也叫分支结构;循环结构,也称为重复结构。它又可分为两种类型:当型(while型)循环结构;直到型(until型)循环结构,顺序结构选择结构直到型(until型)循环结构3.4.3.3用N-S图表示算法在传统流程图中,由于流程线的随意性,使流程图变得毫无规律,大大降低了算法的可读性。

1973年美国学者Nassi和Shneiderman提出了一种新的流程图形式——N-S图。全部算法写在一个矩形框内,在该框内还可以包含其他的从属于它的框。这种流程图非常适合于结构化的程序设计。顺序执行条件执行当型循环直到型循环

例:先后输入若干个正整数,要求求出其中最大的数,当输入的数小于0时结束。用N-S流程图表示算法3.4.3.4用伪代码表示算法伪代码是用介于自然与计算机语言之间的文字及符号来描述算法的。3.4.3.5用计算机语言表示算法众所周知,计算机是无法识别流程图和伪代码的,只能识别用计算机语言编写的程序。因此,在用流程图或伪代码描述了一个算法后,还必须将其转化为计算机语言程序。当然用计算机语言表示算法必须严格遵守所用语言的语法规则。3.5程序设计基本算法举例算法可分为两大类别:数值运算和非数值运算。数值运算的目的是得到数值解。而非数值运算应用的范围更为广泛,最常见的是用于事务管理领域,例如信息检索、信息管理等。当前,计算机在非数值运算方面的应用比例远远超过了在数值运算方面的应用。3.5.4常见算法3.5.4.2查找查找是数据结构中的基本运算,常见的两种查找方法是顺序查找和折半查找。

顺序查找顺序查找的查找过程为:从表的一端开始,向表的另一端逐个进行记录的关键字和给定值的比较,若某个记录的关键字与给定值相等,则表示查找成功,并给出记录在查找表中的位置;否则,若经过比较所有记录的关键字与给定值比较逗不相等,则表示查找失败,给出失败信息。

折半查找折半查找又称为二分法查找,要求查找表中的记录必须按关键字有序排列,并且查找表必须以顺序方式存储。其查找过程为:在有序的查找表中,取中间位置记录作为比较对象,若给定值与中间位置记录关键字相等,则表示查找成功;若给定值大于中间位置记录的值,则继续查找大的一边;若给定值小于中间位置记录关键字,则继续查找小的一边。如此不断重复上述查找过程,直到查找成功,若所查找范围内所有记录的关键字都与给定值不等,则查找失败。3.5.4.3排序冒泡排序法冒泡排序法是基于交换思想的一种简单排序方法。其算法基本思想是:将待排序的记录顺次两两比较,若前者大于后者,则两记录交换。如此重复将所有记录处理一遍的过程称为一趟冒泡排序。其结果是将关键字最大的记录交换到最后的位置。对于n个记录的序列进行排序,最多需要n-1趟冒泡排序。具体步骤如下。(1)有n个数(存放在数组[a]中),第一趟将每相邻的两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”。(2)第二趟对余下的n-1个数(最大数已“沉底”)按上述方法进行比较,经n-2次两两相邻比较后得次大的数。(3)以此类推,将n个数进行n-1次比较,在第j趟中要进行n-j次两两比较。

简单选择排序法简单选择排序法的基本算法思想是:每一趟在n-i+1(i=1,2,…,n-1)个记录中选定关键字最小的记录作为有序序列中第i个记录。具体步骤如下:(1)对有n个数的序列从中选出最小(升序)或最大(降序)的数,与第一个数交换位置。(2)除第1个数外,其余n-1个数中最小或最大的数,与第2个数交换位置。(3)以此类推,选择了n-1次后,这个数列已按升序(降序)排列。

3.6C语言程序设计风格3.6.1C语言程序结构特点无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一个,就是编写函数,至少也要编写一个主函数。执行C程序就是执行相应的主函数。即从它的主函数的第一个左花括号开始,依次执行后面的语句,直到最后的右花括号为止。其他函数只有在执行主函数的过程中被调用时才执行。3.6.2C语言程序设计风格

C语言中“函数”的概念和数学中的“函数”概念不完全相同。C语言中的“函数”实际上是“功能”的意思,其实就是一段程序。当需要完成某一个功能时,就用一个函数(可以是标准函数或自己设计的函数)去实现它。进行程序设计时,我们首先集中考虑main()函数中的算法。当main()中需要使用某一功能时,我们就先写上一个调用具有该功能的函数表达式。这时的函数相当于一个黑盒子。我们只需知道它具有什么功能。设计完main()的算法并检验无误后,我们开始考虑它所调用的函数。

在这些被调用的函数中,若在库函数中可以找到,那就直接使用它,否则由用户来设计这些函数。这样设计的程序从逻辑关系上就形成了层次结构。这个层次结构的形成是自顶向下的。这种方法也是自顶向下、逐步求精的C语言程序设计方法。可以看出,这种方法允许程序员在进行程序设计时,每个阶段都能集中精力解决只属

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论