




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章模块化设计与应用,主要内容模块化程序设计函数定义函数调用函数声明函数的传递参数函数的返回值预处理,模块化分,4.1模块化程序设计方法,4.1.1模块化程序设计思想将整个系统进行分解成若干功能独立的,能分别设计、编程和测试的模块。特点:程序员能单独地负责一个或几个模块的开发。开发一个模块不需要知道系统其它模块的内部结构和编程细节。模块之间的接口尽可能简明,模块应尽可能彼此隔离。具有可修改性具有易读性具有易验证性模块化分方法:自上向下,逐步分解,分而治之,4.1模块化程序设计方法,4.1.2模块规划实例,例4-1简单计算器问题描述:完成一个简单的计算器程序。要求能够完成如下的常用运算:加、减、乘、除、取余、倒数、以e为底的对数、以10为底的对数、开平方、指数运算、正弦、余弦、正切、二、八、十、十六进制之间的相互转换、位运算符运算、位段位运算、求pi()和阶乘。,1.模块分类2.模块功能细化,六则运算对数运算,以10为底的运算以e为底的运算,4.1.2模块规划实例,4.1模块化程序设计方法,例4-2学生成绩档案管理问题描述:完成一个综合的学生成绩档案管理系统。要求能够管理N个学生的3门功课(英语、高数和C语言)的成绩,需要实现以下功能:读入/存储学生信息、录入/修改/删除学生基本信息、录入/修改成绩、按学号/姓名查询、排序、浏览、统计每门课的优、良、中等、及格、不及格人数。,4.1模块化程序设计方法,1.模块分类2.模块功能细化,学生信息维护学生成绩维护,学生信息录入、修改、查询等,学生成绩管理,学生档案管理,查询,统计,读入学生信息,录入学生信息,修改学生信息,删除学生信息,录入成绩,修改成绩,存储学生信息,按学号查询,按姓名查询,浏览,排序,4.2函数,库函数;自定义函数4.2.1函数的定义一般形式:,函数类型函数名(数据类型参数1,数据类型参数2,)函数体,函数运行完毕后返回值的类型,无加void,函数的唯一标识符合标识符命名规则,参数表没有加void,函数定义不允许嵌套,4.2函数,(1)在计算机中只能求出近似值(2)通过截取所给公式的前n项来实现所要求的精度。n的大小由截取的条件决定,此处定为取到某一项的绝对值小于10-6为止(3)正负号交替;分母依次相差为2;可以用循环结构实现求和运算,例4-3(a)定义一个函数,实现用公式求的值。,/*定义一个函数*/*purpose:定义一个函数,求Pi的近似值author:gcycreated:2008/08/1214:58:22*/#includefloatSelPi(void)/求piintnSign=1;floatfNumber=1.0,fTerm=1,fPi=0;while(fabs(fTerm)1e-6)fPi=fPi+fTerm;fNumber=fNumber+2;nSign=-nSign;fTerm=nSign/fNumber;return(4*fPi);,4.2函数,4.2.2函数的调用1.函数声明,函数类型函数名(数据类型参数名1,数据类型参数名2,);,在主调函数之前,需对被调函数进行声明,以下三种形式可以不用函数声明(1)当被调用函数的函数定义出现在主调函数之前时。(2)如果在所有函数定义之前,在函数外部(例如文件或程序开始处)预先对各个函数进行了声明,则在主调函数中可以省去对被调用函数的说明。(3)若被调用函数的函数类型为int型时。,4.2函数,4.2.2函数的调用2.函数调用,函数名(实参表列);,(1)在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。(2)实参必须在类型上按顺序与形参一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。(3)如果实参表中包括多个参数表达式,对实参的求值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反,这一点读者尤其要注意。(4)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。,#includevoidmain()floatSelPi(void);/函数声明printf(pi=%.5fn,SelPi();,4.2函数,4.2.2函数的调用2.函数调用,注意:在C语言中,可以用以下几种方式调用函数:(1)函数表达式。函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。读者可以尝试一下把此例中的函数调用方式改成此种方式。(2)函数语句。C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句。(3)函数实参。函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。此例中的函数调用就属于此种方式。,4.2函数,4.2.2函数的调用3.函数的参数在主调函数和被调用函数之间的数据传递是通过函数的参数进行的,实际上这也是数据共享的一种形式。实参变量对形参变量的数据传递是单向传递,(1)从数学的角度来说,可以一直迭代下去。但用计算机求解则不可以,并且大多数情况下得到的都是近似值。(2)需要一个条件限制迭代次数,这里采用前后两次求出的的差的绝对值小于所给的精度10-6这一限制条件。(3)迭代公式是很容易用循环结构实现的。,(1)可以证明这个迭代公式对于任意初值x00都是收敛的。大家不妨尝试一下,只需要具备数列收敛的相关知识即可。该公式来源于牛顿迭代法。具体推导过程,可以参考“数值分析”或“计算方法”的方面的书籍。(2)程序中定义了函数SelSquareRoot(floatfRadicand),指定了一个浮点类型的形式参数fRadicand,此时的fRadicand并没有实际的意义;在语句printf(%f的平方根为:%fn,fRadic,SelSquareRoot(fRadic);当中,将实际的参数fRadic赋给了形参fRadicand,相当于fRadicand=fRadic,并且通过函数调用,开始执行函数SelSquareRoot()。(3)由于主调函数main()放在被调用函数SelSquareRoot()之后,所以这里可以不进行函数声明。,4.2.2函数的调用3.函数的参数,注意:(1)在函数没有被调用时,函数中的形参只是一个符号,系统并不为之分配内存空间,只有该函数被调用时,才会为之分配存储空间,并且在调用结束后,形参所占的内存也被释放。(2)在内存中,实参单元与形参单元是不同的单元。(3)实参可以是常量、变量或表达式,但要求它们有确定的值,也就是说,在调用函数时必须给形参赋以确定的值。(4)在被定义的函数中,必须指定形参的类型,并且实参与形参的类型应一致,否则将发生类型“不匹配的错误”。(5)形参在获得值之后便与实参相脱离,此后无论形参发生了怎样的改变,都不会影响到实参。,例4-5定义一个有两个参数函数Swap,函数Swap能够完成对这两个参数的值的交换。,由此可以看出,虽然在函数Swap()中,变量nNum1和nNum2的值已经交换,但并没有影响到主函数中的nNumber1和nNumber2的值,此时仍然输出为nNumber1=4,nNumber2=7。这里,请读者思考一下:有没有办法使最后的输出结果为nNumber1=7,nNumber2=4呢?请到后面的第6章中找答案。对于主调函数和被调用函数之间的数据传递是通过函数参数实现的,实参变量对形参变量的数据传递是单向传递,即只由实参传给形参,而不能由形参传回来给实参的内容已讲述完毕。但读者可能希望通过函数调用使主调函数能得到一个被调用函数的执行结果,这又该如何实现呢?,return(返回表达式);,4.函数返回值函数的返回值是通过函数中的return语句获得的。return语句将被调函数中的一个确定值带回主调函数中去。return语句的一般格式是:,注意:(1)return语句的功能:返回主调函数,并将“返回表达式”的值带给主调函数。(2)函数的返回值可以有一个以上的return语句,哪一个return语句起作用要看使用的具体环境。(3)函数的返回值是确定的。这里包含两层意思,一是函数值的类型确定。二是函数的返回值确定,即在return语句中的表达式的值必须确定。(4)调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空)类型”。为了使程序具有良好的可读性并减少出错,凡不要求返回值的函数都应定义为空类型,而不使用系统的缺省处理。(5)在定义函数时,对函数类型的说明,应与return语句中返回值表达式的类型一致。如果不一致,则以函数类型为准。系统将缺省函数类型按整型(int)来处理,5.函数调用的执行过程,4.3预处理,预处理命令是由ANSI统一规定的,但不是C语言本身的组成部分,不能直接对它们进行编译。根据预处理命令对程序作相应的处理,使程序不再包括预处理命令,再由编译程序对预处理后的源程序进行通常的编译处理,得到可执行的目标代码。C语言提供了多种预处理功能,合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。,4.1模块化程序设计方法,4.3.1文件包含所谓“文件包含”是指一个源文件将另外一个或多个源文件的全部内容包含到本文件之中。它是C预处理程序的一个重要功能,其一般形式为:#include文件名#include(1)在文件头部的被包含的文件称为“头文件”或“标题文件”,常以“.h”为后缀(h为head的缩写)。(2)一个#include命令只能指定一个被包含文件,(3)文件包含允许嵌套,(4)文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。,4.3.1文件包含,(5)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来,(6)如果文件1包含文件2,而文件2中要用到文件3的内容,则可在文件1中用两个#include命令分别包含文件2和文件3,且文件3应出现在文件2之前,即在文件1中定义。(7)如果需要修改一些常数,不必修改每个程序,只需修改一个文件(头部文件)即可。(8)使用“文件包含”命令,还可以减少编程人员的重复劳动。4.3.2宏定义在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替换,这称为“宏替换”或“宏展开”。在C语言中,“宏”分为有参数和无参数两种。1.不带参数的宏定义#define标识符字符串,(1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,字符串中可以包含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。(2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。(3)宏定义必须写在函数之外,其作用域为定义命令之后到本源程序结束。(4)源程序中若宏名在引号里,则预处理程序不对其作宏替换,而把宏名当作字符串处理。(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层替换。如,(6)习惯上宏名用大写字母表示,以便于与变量区别,但也允许用小写字母。(7)对“输出格式”作宏定义,可以减少书写麻烦。,#define宏名(形参表)字符串,2.带参数的宏定义C语言允许宏带有参数。,带参宏调用的一般形式为:,宏名(实参表);,对于带参的宏定义有以下问题需要说明:(1)带参宏定义中,宏名和形参表之间不能有空格出现。(2)带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号替换,不存在值传递的问题。(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。(4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。(5)带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果也可能是不同的。(6)宏定义也可用来定义多个语句,在宏调用时,把这些语句又替换到源程序内。,4.4应用实例,例4-6简单计算器问题描述:采用函数调用方式完成简单计算器程序的六则运算模块、幂运算、三角函数模块和求pi。,使用计算器前先要进行功能选择,将功能选择定义为一个函数。(3)由于幂运算模块又被分解成了两个功能小模块(开方、指数运算),因此需要设计类似于主菜单的二级菜单,方便选择功能。(4)由于三角函数模块又被分解成了三个功能小模块(正弦、余弦、正切),因此也需要设计类似于主菜单的二级菜单,方便选择功能。然后先定义三个函数分别实现这三个功能小模块,再在二级菜单中调用它们。本小节只定义两个函数分别实现正弦、余弦,余下的正切将在第6章实现。(5)求pi模块不用再继续分解了,只要定义一个函数即可。,其他代码详见书,4.4应用实例,例4-7学生成绩档案管理。问题描述:(1)在第4.1节里,把学生成绩档案管理规划成了四大功能模块,除统计模块外其它三个模块还被进一步分解(如图4-2所示)。现在需要设计一个“主菜单”和三个“二级菜单”供
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《社团贷款管理办法》
- 语音包业务管理办法
- 西宁机动车管理办法
- 仓储物流物资管理办法
- 心脏康复生活质量影响-洞察及研究
- 红薯储藏期管理办法
- 产品改进计划管理办法
- 产品对外报价管理办法
- 营口特殊资产管理办法
- 装修工程绿色管理办法
- 《从“浪浪山”启程做更好的“小妖怪”!》开学第一课班会教案
- 1.8《天气的影响》教学设计-教科版三上科学(新教材)
- 防地震教学课件
- 消防系统信号传输方案
- T-WHCIA 1008-2025 城市道路软弱土地基处理技术规程
- 2025年7月广东深圳市光明区审计局招聘专干1人笔试参考题库附答案解析
- 2025年高校辅导员招考笔试真题及答案
- 2025年高考生物甘肃卷试题答案解读及备考指导(精校打印)
- 2025北师大版三年级数学上册 第二单元 测量(二) 单元教学设计
- 2025年江西省赣州市《综合基础知识》事业单位招聘考试国考真题(附答案)
- 沉香种植可行性研究报告
评论
0/150
提交评论