c语言第5讲使用函数封装代码_第1页
c语言第5讲使用函数封装代码_第2页
c语言第5讲使用函数封装代码_第3页
c语言第5讲使用函数封装代码_第4页
c语言第5讲使用函数封装代码_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、第5讲 使用函数封装代码,本讲学习内容: 函数及其组成 使用函数的结构化编程的优点 如何创建函数 如何在函数中声明局部变量 如何从函数将值返回给程序 如何给函数传递参数,1,5.1 函数是什么,函数的定义 函数是一个被命名的、独立的代码段,它执行特定的任务,并可能给调用它的程序返回一个值。,2,函数是什么,函数的用法 参见程序ch5cube.c。,3,5.2 自顶向下的方法,采用结构化编程时,可以选用自顶向下的方法。 程序的大多数实际工作是由位于树枝末梢的函数完成,位于“主干”附件的函数主要用于引导程序执行这些函数。 要求编写代码之前一定要进行规划,预先确定程序的结构可以节省编写和调试代码的时

2、间。,4,5.3 函数的工作原理,仅当函数被程序的其他部分调用后,函数中的语句才会被执行。 调用函数时,程序可以通过一个或多个参数给它传递信息,然后执行函数中的语句,完成设计任务。 函数中的语句执行完毕后,控制权将返回给调用函数的地方。 函数能够以返回值的方式将信息返回给程序。,5,函数的工作原理,main() call func1() call func2() call func3() ,func1 () ,func2 () ,func3 () ,6,5.4 编写函数,函数头 函数的返回类型 函数名 参数列表 函数体 函数原型,7,5.4.1 函数头,每个函数的第一行都是函数头,函数头由三部

3、分组成,其中每一部分完成特定的功能。,type function-name ( parm1,. ),函数的返回类型,函数名,参数列表,8,5.4.2 函数的返回类型,函数的返回类型指定了函数返回给调用程序的数据类型。 例如: int func1()/* Returns a type int. */ float func2()/* Returns a type float. */ void func3()/* Returns nothing. */,9,5.4.3 函数名,遵循变量名规则,可以为函数命名为任何名称。 在一个具体的C程序中,函数名必须唯一。 建议给函数指定一个描述其功能的名称。,1

4、0,5.4.4 参数列表,函数通过参数来接受外界传入的值,其参数类型信息由函数头中的参数列表提供。 例如: long cube(long x) void func1(int x, float y, char z) int func2(void),11,形参与实参,形参(parameter)位于函数头,是实参的一个占位符。函数的形参是固定的,在程序执行期间不会变化。 实参(argument)是调用程序传递给函数的实际值。每次调用函数时,可以传递不同的参数。 关系:函数通过相应的形参名来访问实参。,12,形式参数与实际参数的关系,形式参数在函数中是变量名,在函数调用时,形参被分配相应的内存。 实际

5、参数是表达式负责向对应的形参标识的内存单元传递数据。 实参与形参必须个数相同。 对应的形参和实参的类型必须一致。 形参和实参之间的关系是: 单向的值的传递,主调函数中有如下语句: scanf(%d,%d, 如果输入 6,2 函数 int max(int a,int b) 形参 a 得到第一个实际参数a的值 6 形参 b 得到第二个实际参数b+3的值 5,例如,13,形参与实参的区别,参见程序ch5list1.c。,14,形参与实参,第一次调用 z = half_of(x); float half_of(float k),3.5,实参,形参,第二次调用 z = half_of(y); float

6、 half_of(float k),65.11,实参,形参,15,5.4.5 函数体,局部变量 函数的语句 返回值,16,1. 局部变量,在函数体中声明的变量,称之为局部变量,该变量是该函数私有的。 声明局部变量的方式和其他变量相同,可以声明任何类型的变量。,int func1(int y) int a, b = 10; float rate; double cost = 12.55; /* function code goes here */ ,17,演示局部变量,参见程序ch5var.c。,18,2. 函数的语句,函数几乎可以包含任何语句,在函数中唯一不能做的是定义另一个函数,但可以使用其

7、他任何语句,包括调用函数。,19,3. 返回一个值,要从函数返回一个值,可以使用关键字return,并在后面加上一个表达式。,int func1(int var) int x; /* Function code goes here */ return x; ,20,返回一个值,函数可以包含多条return语句,但只有一条被执行的return语句对程序有影响。 参见程序ch5return.c。,21,5.4.6 函数原型,使用用户定义的每个函数,程序都应包含一个原型。其功能是将有关函数的信息告知编译器。 函数原型和函数头相同,只是后面多了一个分号。,22,5.5 将参数传递给函数,要将参数传递给

8、函数,可将它们放在函数名的后面,并用圆括号括起。 参数的数目与类型必须同函数头和函数原型中的形参匹配。,int a,b,c; 函数调用func1(a, b, c);,函数头void func1(int x, int y, int z),23,将参数传递给函数,每个参数都是可以任何合法的表达式:常量、变量、数学表达式,甚至可以是另一个函数(返回一个值的函数)。,例如:half()、square()和third()均为有返回值 的函数,则可以这样编写代码: x half(third(square(half(y);,24,5.6 调用函数,调用函数的方式有两种: 对于任何函数,都可以使用其名称和参数

9、列表进行调用。 仅适用于有返回值的函数,即为合法的表达式,可用于任何能使用表达式的地方。,wait(12);,printf(“Half of %d is %d”, x, half_of(x); a = half_of(x); if( half_of(x) 10) ,25,递归,递归指的是函数直接或间接调用自己。 间接递归指的是一个函数调用另一个函数,而后者又调用前者。,26,使用递归函数计算阶乘,例如,x的阶乘表示为x!,计算方法如下: x! = x * (x-1) * (x-2) * (x-3)* (2) * 1,然而,也可以这样计算x!: x! = x * (x-1)! 然后,可以使用同样的方法计算x-1的阶乘: (x-1)! = (x-1) * (x-2)! 可以不断地以递归的方式计算下去,直到1。,参见程序ch5recurse.c。,27,5.7 函数的位置,就目前水平而言,函数定义位于main()函数所在的源代码文件中,并位于main()函数的后面。,函数原型void func1(int x, int y, int z); int main(void) int a,b,c; 函数调

温馨提示

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

评论

0/150

提交评论