函数定义的一般形式(2).ppt_第1页
函数定义的一般形式(2).ppt_第2页
函数定义的一般形式(2).ppt_第3页
函数定义的一般形式(2).ppt_第4页
函数定义的一般形式(2).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、8.1概述8.2函数定义的一般形式8.3函数参数和函数值8.4函数调用8.5嵌套调用8.6递归调用8.7数组作为函数参数8.8局部变量和全局变量8.9变量的存储类别8.10内部函数和外部函数,绑定,8.1概述1。一个大的程序通常应该分成几个程序模块,每个模块用来完成一个特定的功能。该方法的优点是:a)各模块要实现的功能相对简单,算法容易建立,程序的编程和调试简单,不易出错;b)方便众多设计人员共同工作,充分发挥各自优势,提高软件设计质量;c)减少重复设计。这被称为“模块化编程”。2.在C语言中,函数用来实现每个模块的功能。因此,在C语言编程中,要实现模块化编程,一般需要根据结构化编程方法对给定

2、的设计任务采用“自顶向下、逐步细化、模块化设计和结构化编码”的方法。问题:1)如何编辑许多功能;2)许多功能之间有什么关系?3)如何构建函数?4)如何使用这些功能?一个C程序由一个主函数和几个函数组成,可以在不同的C源文件中编辑。如下图所示。C语言源程序由一个或多个函数和其他部分组成,但主函数只能存在于一个源程序文件中。函数由函数头和函数体组成。如下图所示。后退,继续,5。功能的使用。不管所有函数是否在同一个源程序文件中,主函数调用其他函数,其他函数可以相互调用,甚至一个函数可以调用自己,一个函数可以被一个或多个函数调用任意多次。如下图所示。后退,继续,6。本章的主要任务1)学习和掌握函数的定

3、义方法;2)学习和掌握函数的调用方法和调用形式;3)学习和掌握主音功能和调音功能之间的数据传输路径和实现方法。7.注:1)以上内容是我们用C语言编程的关键或核心内容之一。当然,为了充分发挥C语言在编程中的优势和特点,除了掌握本章的内容外,后面还有其他章节的内容。2)在定义一个函数时,在明确其函数的前提下,必须注意以下三个方面:是否有要处理的数据,如果有,是什么样的数据;如何处理和如何处理;是否有结果,如果有,是什么样的数据(称为函数的返回值)。如下图所示。Back,Continue,例如,查找两个数字的最大值的函数。int max(int a,int b)int c;c=ab?a:b返回(c)

4、;从这个例子可以看出,要处理的数据只是一些符号量,没有给出具体的数值;处理用C语言操作符表示,操作对象是需要处理的数据A和B;加工结果存储在变量C中.当调用这个函数时,可以确定A和B的具体值,结果也是某个值。给定不同的数据可以得到不同的结果。可以看出,要定义一个函数,首先要根据要实现的功能需求定义几个符号变量,然后用C语言的操作符、表达式和语句对它们进行一系列的操作,并将结果存储在返回的后面。3)C语言系统提供了许多功能。对这些功能的理解和应用与上述分析相同。当使用它们时,我们需要知道它的函数(直到函数如何实现)、函数参数(即要处理的数据)和返回值(即处理结果)。实际上,后退、继续,当一个函数

5、被定义时,它被以与系统提供的函数相同的方式使用。然而,用户定义的函数在形式上更加多样化。8.2功能定义的一般形式,1。定义类型标识符不带参数的函数名()声明一些语句2。带参数的定义类型标识符函数名(形式参数表列)声明了一些语句,如求两个数的最大值和三个数的最大值。int max(int a,int b,int c)int d;d=ab?a:bd=cd?c:d返回(d);Back,Continue,features:不需要从外部世界获取数据(信息),但它的功能通常是完成一系列特定的操作,如输出,有或没有返回值。类似于getchar(),get(),等等。Back,Continue,feature

6、s:这种类型的函数是最常见的用户定义函数,它需要从外部世界获取数据(函数参数),并对其执行一系列操作,以获得作为函数返回值的所需结果。此外,函数参数的数量和类型是任意的,返回值的类型也是任意的。三.“空函数”的定义类型描述符函数名()例如:虚()这个函数的函数体是空的,没有参数,所以叫做“空函数”。当调用这个函数时,什么都不做,也没有实际效果。事实上,这是“结构化编程方法”在编程和编辑阶段的延续,即“自顶向下”:首先,定义源文件中包含的每个函数的头(函数类型和函数名)。因为函数名通常具有“见其名,思其义”的功能,所以只要看到这些空函数,就有可能对源文件中的所有函数及其函数有一个基本的了解,以免

7、遗漏它们;“逐步细化”:根据功能逐一编写和改进每个功能。由于“空函数”是合法的,因此可以在编写函数“返回,继续”后进行编译。如果有错误,一定是在函数中。一般来说,每个函数中的语句很少,函数和算法也相对简单。即使有错误,也很容易发现和修改。4.8.3函数参数和函数值,1。形式参数和实际参数1。形式参数:缩写为形式参数。定义函数时,函数名后括号中的参数称为形式参数。它们只是符号量,没有特定值,不占用存储单元,但必须指定它们的类型。实际参数:简称为实际参数。当在主音函数中调用一个函数时,函数名后括号中的参数(可以是常量或表达式)称为实际参数。它们有精确的值和类型,如果它们是变量,它们也占用存储单元。

8、3.形式参数之间的数据传递:当调用一个函数时,首先要将形式参数的数据传递给相应的形式参数。然后,将程序的执行转移到函数,并对形式参数执行一系列操作。操作结果(即函数的返回值)通过函数名返回到调用函数的地方。如例8.2所示,调用max函数。显然,价值的传递是单向的。后退,继续,后退,继续,4。因为在实际参数之间有传递的值,所以它们应该具有相同的类型或兼容的赋值。如果实际参数是常量或表达式,它们的值应该具有相同的类型或兼容的赋值。5.只有当一个函数被调用时,存储单元才被分配给该参数,一旦调用结束,由该参数占用的存储空间就被释放。第二,函数的返回值我希望主音函数可以通过函数调用得到一个确定的值,这个

9、值就是函数的返回值。1.函数的返回值是通过函数中的return语句获得的。return语句的格式是Return(表达式);或返回表达式;2.定义时解释函数值的类型,即函数的类型。3.通常,函数的类型应该与return语句后的表达式的类型一致。如果不是,则以功能类型为准,并进行自动类型转换。示例8.3,后退,继续,4。定义函数时,函数体中可能没有返回语句,这并不意味着函数没有返回值,而是没有返回用户期望的明确的函数值,而是返回一个不确定的值。5.为了清楚地表示函数“不返回值”,请使用“void”将函数定义为“无类型”或“空类型”。8.4函数调用,1。调用的一般形式函数名(参数表的列)1。实际参与

10、参数必须一一对应。2.参数可以是常数、有值的变量以及可以获得的值的表达式。2.参数的评估顺序。许多C语言版本是从右向左评估的。例8.4二。函数调用方法1。函数调用语句:函数不需要返回值,只需要完成某些操作。2.函数表达式:当函数调用出现在表达式中时,要求函数带回一个确定的值来参与表达式运算。3.函数参数:调用另一个函数时,一个函数的调用作为实际参数。例如mmax(a,max(b,c);printf(“% d”,最大值(b,c);本质上,它也以功能表达的形式出现。后退,继续,后退,继续,3。在一个函数中调用另一个函数(即被调用的函数)时,被调用函数的描述和函数原型需要满足的条件:1。被调用的函数

11、必须是现有函数(库函数或用户定义函数)。2.如果是库函数,使用源文件开头的include命令将调用库函数所需的信息“包含”到这个文件中。例如,#include #include 3。如果调用了用户定义的函数,并且该函数与调用它的函数(主音函数)在同一个文件中,则调整后的函数通常应该在主音函数中声明。示例8.5声明北方调用函数。4.为被调用函数声明的格式类型标识符函数名(形式参数表列);关于参数表有三种情况:1)参数类型名称参数变量名2)只有参数类型名称3)没有(但没有全面检查)5。一些特殊情况,如后退、继续,1)如果调谐函数是在主调谐函数之前定义的,则调谐函数不能在主调谐函数中声明;2)在源文

12、件中,如果在定义所有函数之前,已经在主音函数之外声明了一个函数,则没有必要在每个主音函数中声明要调用的函数;3)如果函数的类型是整数或字符,无论这些函数位于何处,它们都不能在主音函数中声明。函数1的嵌套调用。函数的嵌套调用C语言中函数的定义是并行和独立的,即定义一个函数时,一个函数不能包含另一个函数,但在调用一个函数的过程中,这个函数可以调用其他函数甚至调用自己,前者称为函数的嵌套调用,后者称为函数的递归调用。如下图所示。后退,继续,后退,继续,二。嵌套调用示例8.6通过弦截法找到方程x3-5x2 16x-80=0的根。弦截法的思想是方程的一个解是x*,f(x)是x*的有限邻域内的单调函数。a

13、)给出位于x*两侧的两个点x1和x2,并计算它们对应的函数值y1=f(x1),y2=f(x2) B)如果|x1-x2|,那么x*=(x1 x2)/2,并结束;否则,交点(x1,y1)和(x2,y2)被用作曲线的弦,并且在x轴上的弦的交点:x (x1*y2-x2*y1)/(y2-y1)被计算:y=f(x) C如果y1*y0,则x1=x;y1=y;否则,使x2=x;y2=yx和d)重复步骤b)和c)。算法,后退,继续,从算法的N-S流程图可以看出,要得到给定方程的根,必须解决以下问题:后退,继续,1。计算函数f(x)=x3-5x2 16x-80的值。因为这种计算在很多地方都存在,所以在编程中通常是

14、用C语言的函数来实现的。显然,该函数需要从外部世界获得一个数据(即问题中给出的函数的自变量),并且具有一个函数值,其类型应该是实数。函数名标记为:F.2.弦与x轴交点x的计算。出于同样的原因,这个操作通常是通过编程中的C语言函数来实现的。显然,这个函数需要从外界获得两个数据(即x1和x2),并且应该有一个函数值(即弦和x轴的交点x),并且它的类型应该是实数。函数名被标记为xpoint。此外,当使用xpoint函数计算交点x时,应该首先计算x1和x2的函数值,所以应该在xpoint中调用f函数,这显然是函数的嵌套调用。3.求解方程f(x)=0的根。只要用弦截法求一维方程的根,不管f(x)的函数形

15、式是什么,算法都是一样的。鉴于这种情况,在程序设计中,为了减少程序代码的重复,提高重用率和程序质量,这种操作往往是由一个或几个C语言函数来实现的。显然,有必要从外部获得两个数据(即满足弦截面法的x1和x2),并且具有函数值(即方程f(x)=0的根),并且其类型应该是实数。函数名标记为:root。另外,当用根函数求解方程的根时,需要计算弦和x轴的交点x,所以x点函数应该在根中调用,f点函数应该在x点中调用,这显然是函数的嵌套调用。它们之间的调用关系如下图所示。8.6函数1的递归调用。函数、递归调用的形式和特点在调用函数的过程中,程序直接或间接调用函数本身,这就是函数的递归调用。1.直接递归调用,

16、返回,继续,int f(int x) int y,z;z=f(y);返回(表达式);2。间接递归调用,返回,继续,3。递归调用的特点,后退,继续,无论是直接递归还是间接递归,都有一个调用循环(类似于循环语句)。因为它是一个循环,所以它可能成为一个“无限循环”。因此,必须控制这个调用,以确保递归调用可以结束。根据经验,为了使这种调用只进行有限的次数,在两种递归调用中,函数的调用必须是有条件的,即函数的调用必须由if语句控制。2.递归调用示例8.7有5个人坐在一起,问第五个人多大了?他说他比第四个人大两岁。当问第四个人时,他说他比第三个人大两岁。当问第三个人时,他说他比第二个人大两岁。当问第二个人时,他说他比第一个人大2岁。最后,我问了第一个人,他说他10岁了。第五个人多大了?附加示例:有一个分数序列:2/1,3/2,5/3,8/5,计算前20项的总和。【分析】假设第n项为s(n)=x(n)/y(n),那么当n=1时,x(n)=x(n-1) y(n-1),y(n)=x

温馨提示

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

评论

0/150

提交评论