《C语言程序设计》第6章函数.ppt
《《C语言程序设计》第6章函数.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》第6章函数.ppt(51页珍藏版)》请在三一办公上搜索。
1、第6章 函数,结构化程序的模块结构:,第6章 函数,程序结构:,第6章 函数,根据函数的定义者不同,分为如下两大类:(1)标准函数:系统提供的已定义的函数,一般用户都可以调用。如前面学习过的输入输出函数scanf、printf、getchar、putchar等。Turbo C 2.0的部分常用库函数见附录D。(2)用户自定义函数:用户自己编写的用来解决具体问题的函数。,第6章 函数,根据函数的参数形式,C语言函数又分为如下两种:(1)无参函数:主调函数并不将数据传送给被调用函数。(2)有参函数:在调用函数时,在主调函数和被调函数之间有参数传递,也就是说,主调函数可以将数据传送给被调用函数使用,
2、被调用函数中的数据也可以带回来供主调函数使用。,第6章 函数,6.1 函数的定义和调用,6.1.1 函数定义,函数定义的一般形式:类型标识符 函数名(形式参数表列)说明部分 执行部分 例:,int max(int x,int y)/*函数首部*/*函数体开始*/int z;/*说明部分*/if(xy)z=x;/*执行部分*/else z=y;return(z);/*函数体结束*/,第6章 函数,6.1 函数的定义和调用,6.1.1 函数定义,说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。,1)函数名前面的类型标识符是指函数返回值的类型,简称函数值类型。函数的返回值
3、由函数中的return语句获得,即return后的表达式的值,可以是简单类型、void类型或构造类型等。当return后的表达式的类型与函数名前面的类型标识符不一致时,以函数名前面的类型标识符为函数值类型(即是将return后的表达式的值转换为函数名前面的类型后作为函数值返回)。如果函数中无return语句,将返回一个不确定值;如希望不返回值,可以定义函数类型为void,当函数值类型为int时,可省略其类型的说明。,第6章 函数,6.1 函数的定义和调用,6.1.1 函数定义,说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。,2)函数名是函数的标识符,遵循C语言标识
4、符的命名规则,区分大小写。3)函数名后的形式参数表列给出函数的形式参数及其类型说明。形式参数简称形参,形式参数及其类型说明放在函数名后的一对圆括号中,要特别注意的是,无论函数是否有形式参数,函数名后的圆括号不可省,并且圆括号之后不能接“;”。形式参数表列的一般形式如下:形参1类型 形参1,形参2类型 形参2,形参n类型 形参n,第6章 函数,6.1 函数的定义和调用,6.1.1 函数定义,说明:函数定义包括函数首部和函数体两部分。(1)函数首部:函数定义的第一行。,(2)函数体:函数说明之后的花括号“”括起来的部分,包括说明部分和执行部分。1)声明部分:用来对函数中使用的变量和函数作说明。2)
5、执行部分:由基本语句组成,函数的功能由函数体内的各个语句的执行来实现。,第6章 函数,6.1 函数的定义和调用,6.1.2 函数调用,一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。,1函数调用的一般形式 函数名(实参表列);2函数调用语句的执行过程 首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到调用此函数的语句的下一条语句,继续往下执行。,第6章 函数,6.1 函数的定义和调用,6.1.2 函数调用,例:#includeint
6、max(int x,int y)int z;z=xy?x:y;return(z);,main()int a,b,c;scanf(%d%d,程序结果如下:输入:10 20输出:20,一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。,第6章 函数,6.1 函数的定义和调用,6.1.2 函数调用,一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。,3说明(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元;只有发生函数调用时被调用函数中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。(2)实参可以是常
7、量、变量或表达式,但必须有确定的值。在调用时将实参的值赋给形参变量。(3)实参与形参的类型应一致。只有字符型和整型可以互相通用。(4)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参变量与形参变量是不同的单元,即使同名,也是不同的单元。形参的值如果发生改变,并不会改变主调函数的实参值。,第6章 函数,6.1 函数的定义和调用,6.1.2 函数调用,例:,一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。,#includeswap(int x,int y)int t;printf(2)a=%d b=%dn,x
8、,y);t=x;x=y;y=t;printf(3)a=%d b=%dn,x,y);,main()int x=10,y=20;printf(1)x=%d y=%dn,x,y);swap(x,y);printf(4)x=%d y=%dn,x,y);,程序结果如下:(1)x=10 y=20(2)x=10 y=20(3)x=20 y=10(4)x=10 y=20,第6章 函数,6.1 函数的定义和调用,6.1.2 函数调用,一个函数一旦被定义,就可以在程序的其他函数中使用它,这个过程称为函数调用。,4函数调用方式函数有以下三种调用方式:(1)函数语句:把函数调用作为一个语句,例如:sort();这时不
9、要求函数带回值,只要求函数完成一定的操作。(2)函数表达式:函数出现在一表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的计算。例如:c=2*max(a,b);(3)函数参数。函数调用作为一个函数的实参。例如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。,第6章 函数,6.1 函数的定义和调用,6.1.3 函数声明,调用用户自定义函数时,一般调用函数和被调用函数应在同一个文件中,在调用函数中对被调用函数返回值的类型、函数名称、函数形式参数的类型进行说明,这种说明称为函数声明。,例:,#includemain
10、()int a,b,c;int max(int,int);/*对max函数进行声明*/scanf(%d%d,第6章 函数,6.1 函数的定义和调用,6.1.3 函数声明,函数声明有以下三种形式:(1)类型名 函数名(类型1 形参1,类型2 形参2,类型n 形参n);(2)类型名 函数名(类型1,类型2,类型n);(3)类型名 函数名();其中,形式(2)是最常用的一种声明形式。,第6章 函数,6.1 函数的定义和调用,6.1.3 函数声明,对被调用函数的声明,在以下几种情况下可以省略:(1)如果函数值是整型或字符型,可以不进行声明。例:,#includemain()int a,b,c;scan
11、f(%d%d,第6章 函数,6.1 函数的定义和调用,6.1.3 函数声明,对被调用函数的声明,在以下几种情况下可以省略:,(2)如果被调用函数的定义出现在主调函数之前,可以不声明。例:,int max(int x,int y)int z;z=xy?x:y;return(z);#includemain()int a,b,c;scanf(%d%d,第6章 函数,6.1 函数的定义和调用,6.1.3 函数声明,对被调用函数的声明,在以下几种情况下可以省略:,(3)如果在所有函数定义之前对函数类型进行了声明,则在各个主调函数中不再进行声明。例:,int max(int,int);#includema
12、in()int a,b,c;scanf(%d%d,第6章 函数,6.2 函数的嵌套调用和递归调用,6.2.1 函数的嵌套调用,所谓函数的嵌套调用是指一个函数调用另一函数的过程中又出现对其他函数的调用。函数嵌套调用的调用结构如图所示:,第6章 函数,6.2 函数的嵌套调用和递归调用,6.2.1 函数的嵌套调用,例:,fun1(int a,int b)int c;a+=a;b+=b;c=fun2(a,b);return c*c;,fun2(int a,int b)int c;c=a*b%3;return c;,main()int x=11,y=19;printf(%dn,fun1(x,y);,注意
13、:函数的调用可以嵌套,但函数的定义是平行的、相互独立的,不能嵌套定义。,第6章 函数,6.2 函数的嵌套调用和递归调用,6.2.2 函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。其调用结构如图所示。,第6章 函数,6.2 函数的嵌套调用和递归调用,6.2.2 函数的递归调用,递归函数的执行包括递推和回归两个过程。,例:求 t=n!,int f(int n)int t;if(n=1|n=0)t=1;else t=n*f(n-1);return t;main()int n,t;scanf(“%d”,递推:回归:,第6章 函数,6.3 变量的作用域及存储
14、类别,6.3.1 局部变量与全局变量,1局部变量,局部变量是在一个函数内部定义的变量,它只在本函数范围内有效。,例:fun1(int a,int b)int c;a+=a;b+=b;c=fun2(a,b);printf(%d,%dn,a,b);return c;fun2(int a,int b)int x;a+=a;b+=b;int a=1;a=a+b;x=a+b;printf(%d,%d,%dn,a,b,x);return x;main()int x=11,y=19;printf(%dn,fun1(x,y);printf(%d,%dn,x,y);,程序运行结果如下:44,76,12022,3
15、812011,19,第6章 函数,6.3 变量的作用域及存储类别,6.3.1 局部变量与全局变量,1局部变量,说明:(1)主函数main中定义的变量也是局部变量,也只在主函数中有效。(2)形式参数也是局部变量,其他函数不能调用。(3)可以在一个函数内部的复合语句中定义变量,这些变量只在复合语句中有效。(4)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。,第6章 函数,6.3 变量的作用域及存储类别,6.3.1 局部变量与全局变量,2全局变量,全局变量是在函数之外定义的变量,从定义变量的位置开始到本源文件结束范围内有效。,例:int a,b;fun1()int c;a=2;b=
16、3;c=fun2();printf(%d,%dn,a,b);return c;int x=11,y;fun2()a+=a;b+=b;x=a+b;y=a-b;printf(%d,%d,%d,%dn,a,b,x,y);return x;main()int y=19;printf(%dn,fun1();printf(%d,%dn,x,y);,程序运行结果如下:4,6,10,-24,61010,19,第6章 函数,6.3 变量的作用域及存储类别,6.3.1 局部变量与全局变量,2全局变量,说明:(1)全局变量可以在函数间传递数据,增加函数间数据联系的渠道。(2)全局变量在程序的整个执行过程中都有效。(
17、3)在同一个源文件中,全局变量与局部变量可以同名,在局部变量的作用范围内,全局变量不起作用。(4)对于全局变量,如果在定义时不进行初始化,则系统将自动赋予其初值,对数值型变量赋0,对字符型赋变量0。,第6章 函数,6.3 变量的作用域及存储类别,6.3.2 动态变量与静态变量,1动态存储方式和静态存储方式(1)动态存储方式。是指在程序运行期间根据需要动态分配存储空间的方式。(2)静态存储方式。是指在程序运行期间分配固定的存储空间的方式。,第6章 函数,6.3 变量的作用域及存储类别,6.3.2 动态变量与静态变量,2动态变量,以动态存储方式分配的变量称为动态变量,包括所有函数的形式参数、用au
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 函数
链接地址:https://www.31ppt.com/p-5896090.html