C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数

上传人:E**** 文档编号:89452945 上传时间:2019-05-25 格式:PPTX 页数:34 大小:253.09KB
返回 下载 相关 举报
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数_第1页
第1页 / 共34页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数_第2页
第2页 / 共34页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数_第3页
第3页 / 共34页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数_第4页
第4页 / 共34页
C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数》由会员分享,可在线阅读,更多相关《C语言程序设计教程 第2版 教学课件 ppt 作者 吉顺如 刘新铭 辜碧容 第6章 函数(34页珍藏版)》请在金锄头文库上搜索。

1、第 6 章 函 数,学习目标,熟练掌握用户函数的结构、设计方法和调用方法; 熟练掌握函数调用中数据传递的几种方法; 3. 会设计简单的函数和嵌套函数,主要内容,函数的概念 函数调用中数据传递的方法 函数调用 全局变量和局部变量,6.1 函数概念 一.概述 一个C程序可通过一个主函数和若干个子函数实现模 块化结构。在功能上,由主函数调用其它函数,其它函 数也可以互相调用。,main( ) 函数A(形式参数表) 函数B(形式参数表) ; ; ; 调用函数A; 调用函数B; ; ; ; 返回主调函数A( ) 返回主调函数main( ),说明: (1) 一个源程序文件由一个或多个函数组成。C语言以源文

2、 件为单位进行编译,而不是以函数为单位进行编译。,(2) C程序的执行从main()函数开始,如果在main()函数中调 用了其它函数, 在调用结束后,流程最后必须回到主调函 数,在main()函数中结束整个程序的运行。 (3) 所有的函数都是平行的,函数之间只有调用关系,个 函数并不从属于另一函数。,二.函数的分类 1.库函数和用户自定义的函数(从使用的角度分类) 库函数也叫标准函数,这是由系统提供的,用户 可直接调用的函数。 例如:printf( )、scanf( )、sqrt( )、pow( ) 、strcmp( )都是C语言的标准函数。 用户自定义的函数就是用户根据需要,自行设计 的函

3、数。,2.无参函数和有参函数(从函数的形式分类) 函数的参数,就是被调用的函数运行时,由主调函数提供的数据。如果被调用的函数运行时,不需要由主调函数提供数据,则称之为无参函数,否则就称为有参函数。,【例6-1】 无参函数的例子。,【例6-2】 有参函数的例子。 int max(int x,int y) return(xy? x:y); main() int a,b,c; printf(“Please Input two integers:n“); scanf(“%d,%d“, ,6.2 函数的定义 调用函数必须遵循“定义在先、使用在后”的原则。 函数定义的格式: 类型说明符 函数名(类型说明符

4、 形参变量1,类型说明符 形参变量2,) 语句部分 ,函数名由用户确定,但必须遵循与定义变量名相同的规则。 函数名前面的类型说明符用以指出函数调用后,返回结果的 数据类型,称之为函数类型,在缺省的情况下,默认的函数 类型为 int 型。,6.3 函数参数和函数的值,一.形式参数和实际参数 形式参数和实际参数具有的特点和关系: (1)在定义函数时指定的形参变量,只有在函数被调用时才被分配内存单元。在调用结束后,形参所占的内存单元也随即被释放。,该语句是无法执行的,在结束对 max()的调用后,形参变量所占用 的存储单元已被释放,在这里,变 量名 x 和 y 是无意义的。,例如: int max(

5、int x,int y) return(xy? x:y); main() int a,b,c; printf(“Please Input two integers:n“); scanf(“%d,%d“, ,(2) 形参只能是变量,而实参必须是具有确定值的表达式。,main() int a,b,c; scanf(“%d,%d“, ,实参为常量10和 表达式a+b,实参为表达式a-b 和a+b,执行该语句后,变量a、b均已有了确定的值,例如: int max(int x,int y) return(xy? x:y); ,(3) 调用函数时实参与形参的个数、类型和先后顺序应 当保持一致。 【例6-3

6、】实参与形参的个数、类型和先后顺序对函数调用的影 响。 int add(char x,int y) int z; return(x+y); main() char a; int i; printf(“Please Input An Integer Number and a character“); scanf(“%d,%c“, ,正确的调用,错误的调用,这个return语句永 远也不会被执行,二. 函数的返回值 函数的返回值就是通过函数调用, 主调函数从被调用函数 中的 return 语句获得的一个确定的值。,return语句的格式: return(表达式); 或 return 表达式; re

7、turn语句中表达式的值就是被返回的值。 注意: (1) 一个函数中可以包含一个以上的return语句,但一旦执 行了其中任何一个return语句,就结束该函数的调用。所以, 每次调用函数以后,只能通过return语句返回一个值。 例如: int f(int x,int y) return(x+y); return(x*y); ,(2) 如果不需要从被调用函数带回函数值,可以不要return 语句。对于此类函数应当将其定义为void(空值类型)。 (3) 在函数定义中,函数类型应该和return语句中表达式的类型一致。如果它们的类型不致,则以函数类型为准,由函数类型决定返回值的类型。,6.4

8、函数的调用 一.函数调用的一般形式 程序中通过函数名调用函数,格式为: 函数名(实参表列) 如果是调用无参函数,则实参表列可以没有,但括弧不能省 略。实参表列各参数间用逗号隔开。实参与形参的个数、类型 与顺序应保持一致,以保证实参与形参之间能正确地实现参数 传递。,【例6-4】 输入半径,输出相应的圆面积和相应的球的体积。,float f (float r1) return(3.1415926*r1*r1); main() float r;,printf(“Please input radiusn“); scanf(“%f“, ,【例6 -5】 编程输出由“*”组成的三角形。 * * * *

9、*,本例在程序结构上显得更为清晰,这就是模块化结构的特点。,void pr(int n) int j; for(j=0;jn;j+) printf(“*“); printf(“n“); ,main() int i; for(i=1;i=5;i+) pr(2*i-1); ,输出一行n个 *字符后换行,调用pr()函数输出 五行*字符,二.函数声明,如果一个源程序包含了多个函数,而函数间又有相互调用,那将会使“定义在前、使用在后” 的原则难以实现。为此,C语言通过函数声明语句解决这个问题。 函数声明语句的格式: 类型说明符 函数名(类型说明符 形参变量1,类型说明 符 形参变量2,); 从形式上看

10、,函数声明就是在函数定义格式的基础上去掉了函数体。通常,将函数声明安排在源文件的开始部分。函数声明中的形参变量名可以省略。 例如: 函数声明 int f(int x,iny y,float z); 与 int f(int,int,float); 是等价的。,函数声明是语句, 这里的;不能少,【例6-5-1】编程输出由“*”组成的三角形。 void pr(); /* 函数声明语句, */ main() int i; for(i=1;i=5;i+) pr(2*i-1); void pr(int n) int j; for(j=0;jn;j+) printf(“*”); printf(“n”); ,

11、使用函数声明以后, 允许函数定义出现 在函数调用之后,三.函数调用中的值传递和地址传递 1.值传递 值传递就是在调用函数时,仅仅将实参的值传递给对应的形参变量,实参变量本身并不参于函数的执行过程,所以无法通过调用函数来改变实参变量的值。,形参变量的值被交换了,【例6-6】 试分析下面的程序,从键盘依次输入二个不同的整 数,判断其输出。,实参变量还是 原来的值,2. 地址传递 在数组参与函数调用的情况下,采用的不是单个变量的值传递的方法。由于数组名代表了数组存储的起始地址,所以,在函数调用时,实参把数组存储的起始地址传递给形参,使其指向同样的存储区域,这就是地址传递。在执行函数的过程中,凡是对形

12、参数组元素的加工处理实际上就是对实参数组元素的加工处理。这是地址传递和值传递的本质区别。,【例6-7】 设计一个函数用以计算一维数组中所有元素值的 总和。 #define N 5 sum(int arr,int); main() int aN,i; printf(“Please input %d integers:n“,N); for(i=0;iN;i+) scanf(“%d“, ,函数声明,形参变量为 数组和数组元素个数,函数调用,实参变量为 数组名和数组元素个数,四.函数的嵌套调用 函数的嵌套调用就是在一个函数(不是主函数)中又调用 另一个函数。 【例6-8】 编程求三个整数中的最大数。,

13、6.5 局部变量和全局变量 一.局部变量 根据变量的有效范围将其分为局部变量和全局变量,称 变量的有效范围为变量的作用域。 在一个函数或复合语句内部定义的变量称为局部变量, 它只在本函数或复合语句范围内有效,只有在本函数或复 合语句内部才能使用它们。,复 合 语 句,这里定义的i在 主函数内部有效,【例6-9】说明局部变量概念的例子之一。,main() int i=5,sum1=0,sum2=0; int i=0; for(;i=10;i+) sum1=sum1+i; ,for(;i=10;i+) sum2=sum2+i; printf(“SUM1=%dn “, sum1); printf(“

14、SUM2=%dn “, sum2); ,这里定义的i在 复合语句内部有效,主函数中定义的整型变量i 让位于复合语句内部定义的 整型变量i。,【例6-8-1】 编程求三个整数中的最大数。,函数max2( )和函数max3( )具有相同的形参变量名x,y。 但由于它们均为局部变量,只在定义它们的函数内部有效, 所以实际上,它们代表的是不同的变量。,二.全局变量 在函数之外定义的变量称为全局变量。全局变量可以为源文件中其它函数所共用,它的有效范围从定义变量的位置开始到源文件结束。,p,q为全局变量,函数f1()、f2()、main()都可以使用,局部变量a,b,c只在f1()函数内部有效,c1,c2

15、是全局变量,函数f2()、main()都可以使用,局部变量x,y,i,j只在f2()函数内部有效,局部变量m,n只在main()函数内部有效,【例6-11】 使用全局变量以后的例6-6的程序。,int a,b; void swap(int,int); main() printf(“Please Input Two Integers : “); scanf(“%d,%d“, ,void swap(int x,int y) int t; t=x; x=y; y=t; printf(“x=%d, y=%dn“, x,y); a=x; b=y; ,全局变量a,b在sawp()函数和主函数内部都有效,【例6-12】设计函数,用以找出三个整数中的最大、最小 数。 int max,min; void f(int x,int y,int z) if(xy) max=x; min=y; else max=y; min=x; if(zmax) max=z; else if(zmin) min=z; ,由于max,min是全局变量,故其在f()函数外部也有效,注意: 尽管全局变量可以帮助实现从函数中同时带出多 个结果,但还是建议读者不要轻易使用全局变量, 因为: (1).全局变量在程序

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号