C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章

上传人:E**** 文档编号:89190682 上传时间:2019-05-21 格式:PPT 页数:70 大小:1.23MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章_第1页
第1页 / 共70页
C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章_第2页
第2页 / 共70页
C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章_第3页
第3页 / 共70页
C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章_第4页
第4页 / 共70页
C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 陆蓓 主编 龙之一 易幼庆 赵建锋 副主编 郑 宁 主审 《C语言程序设计》第五章(70页珍藏版)》请在金锄头文库上搜索。

1、第五章 函数,主要内容,什么是函数,1,函数的定义和调用,2,函数的声明,3,函数的参数传递,4,递归,5,局部变量与全局变量,6,变量的存储类别,7,本章要点,函数定义和函数返回值 函数调用与参数传递、函数原型 函数的递归调用 变量的作用域和存储类别,本章学习目标,了解模块化设计方法 掌握函数定义和函数原型说明的方法及二者的区别 掌握函数的参数传递方式与函数调用方法 了解函数的递归调用 理解掌握变量的作用域和存储类的概念,5.1 什么是函数,在C语言中,函数就是组合在一起的一系列语句,并且可以通过一个名字调用它。 函数这个术语来自于数学 f(x)=x2+2x+1, 其中f是函数名,x是自变量

2、,f(x)是对应于自变量x的函数值,式子x2+2x+1则给出了由x值得到f(x)值的计算规则。 数学函数中的自变量在C语言中通常称为函数参数。 C语言中的函数可以没有参数,也可以不返回函数值。,5.2 函数的定义和调用,5.2.1计算两个实数的平均值,【例5-1】计算两个实数的平均值 /* 程序5-1 */ #include float average(float a, float b) float c; c=(a+b)/2; return c; void main( ) float x,y,z; scanf(“%f%f”, ,5.2 函数的定义和调用(续),5.2.2 显示提示信息,【例5-

3、2】显示提示信息 /* 程序5-2 */ #include void showinfo( ) printf(“This is a minus.n”); void main( ) int a,b; scanf(“%d%d”, ,5.2.3 函数的定义,函数定义的一般形式: 类型 函数名 (形式参数列表) 声明 语句 函数的定义可以分为两部分,函数首部和函数体。,5.2.3 函数的定义(续),在函数首部通常依次包含函数类型、函数名及形式参数的定义。 类型指定是函数返回值的类型。函数可以有,也可以没有返回值。如果忽略函数返回值类型,则返回值类型为int类型。如果函数没有返回值,应该将类型定义为voi

4、d。 形式参数列表依次说明了每个形参的类型和名称。函数可以有多个形参,也可以没有形参。多个形参之间用逗号分隔。即使没有形参,这一对括号也不能省略。,5.2.3 函数的定义(续),函数的函数体中可以包含内部变量的定义和执行语句,它给出了函数功能实现的细节。 函数体也可以为空 void showinfo( ) ,5.2.4 return语句,return语句的作用是从被调用函数返回到主调函数中产生调用的地方。return语句会结束被调用函数的执行,使程序返回到主调函数中去执行。此外,使用return语句,还可以带回一个函数返回值。 对于非void类型的函数必须使用return语句给出函数的返回值。

5、return语句的语法格式为: return 表达式; 这里的表达式有时是常量或变量,有时是复杂的表达式。return语句返回表达式的值。,5.2.4 return语句(续),float average(float a, float b) return (a+b)/2; ,float average(float a, float b) float c; c=(a+b)/2; return c; ,5.2.4 return语句(续),如果return语句中表达式的类型和在函数首部指定的返回值类型不一致,那么系统会把表达式的类型隐式转换成返回值类型。例如: int ave(float a, flo

6、at b) float c; c=(a+b)/2; return c; 例如函数调用ave(1.0,2.0)的返回结果为1。,5.2.5 函数的调用,函数调用的格式为: 函数名(实际参数列表) 多个实际参数用逗号分隔。 实际参数表示要传递给被调函数的数据。实参可以是变量、常量或任何正确的表达式。 实参的个数应和形参的个数相同,并且实参要和对应的形参类型一致,否则将自动进行类型转换,当然也可以在调用时,使用强制类型转换来使实参的类型与形参一致。 调用没有形参的函数也不需要提供实参,小括号内可以为空,但小括号是必须的。,5.2.5 函数的调用(续),对于void类型的函数,其函数调用是一个语句 s

7、howinfo( ); 对于非void类型的函数,其调用可以包含在表达式中,其函数返回值可以赋值给变量,或用于接下来的运算,或用于输出,或其他用途。 ave=average(a,b); sum=average(a,b)+average(c,d); printf(“%f”,average(a,b); average(a,b);,5.3 函数的声明,前面的程序总是把被调函数的定义放在main函数之前,也就是放在函数调用出现之前。实际上C程序中的函数是没有固定顺序的。可以将被调函数的定义放在函数调用之后。例如程序5-3。,/* 程序5-3 */ #include void main( ) float

8、 x,y,z; scanf(“%f%f”, ,5.3 函数的声明(续),这时,C语言要求在函数调用前对被调函数进行声明。这样可以帮助编译器进行更全面、更严格的语法检查,避免一些程序错误。 程序5-3增加函数声明后得到的程序如下。,/* 程序5-4 */ #include float average(float a,float b); /*函数声明*/ void main( ) float x,y,z; scanf(“%f%f”, ,5.3 函数的声明(续),可以看出,函数声明类似于函数定义的首部,区别是后面要带有一个分号。 函数声明的格式为: 类型 函数名(形式参数列表); float ave

9、rage(float a,float b); 或 float average(float ,float );,5.3 函数的声明(续),函数声明即可放在函数体外,也可以放在函数体内。在程序5-4中,对average函数的声明也可以放在main函数体内。 此时,函数声明仅对main函数有效,其它函数如需调用average函数,也要增加类似声明。 注意:函数声明也称为函数原型,函数声明必须和函数定义一致。,void main( ) float average(float a,float b); /*函数声明*/ float x,y,z; scanf(“%f%f”, ,5.4 函数的参数传递,形参实

10、际上是指定类型的变量,而实参可以是变量、常量或由运算符连接的表达式。 实参向形参的数据传递是值传递,在调用函数时,将计算出每个实参的值,然后将值赋值给对应的形参变量,作为形参变量的初始值。 如在程序5-4中,main函数调用average函数,5.4 函数的参数传递(续),函数执行过程中,如果形参的值发生了变化,这种变化不会影响对应实参的值。所以值传递是一种单向传递。 【例5-3】参数传递,/* 程序5-5 */ #include void swap(int x,int y) int temp; temp = x; x = y; y = temp; printf(“x=%d,y=%dn“, x

11、, y); void main() int a = 3, b = 4; swap(a, b); printf(“a=%d,b=%dn“, a, b); ,程序运行后输出结果为: x=4,y=3 a=3,b=4,5.4 函数的参数传递(续),程序执行过程如下: main函数定义变量a、b并初始化。 main函数调用函数swap,实参a、b将值传递给形参x、y。,5.4 函数的参数传递(续),swap函数交换x、y的值。 返回main函数,输出a、b的值,a、b的值没有改变。,5.5 递归,5.5.1函数的递归调用 函数直接或间接调用自己就称为函数的递归调用。 5.5.2递归的思想 汉诺塔问题 递

12、归的思想:将复杂问题分解为规模较小的子问题并且子问题和原问题本质上是相同的问题。子问题求解后,原问题也将求解。,5.5.3 递归的使用,问题:使用递归方法计算n! n!的定义是: 这种定义方式体现了递归的思想,求n!可以转化为先求(n-1)!。,5.5.3 递归的使用(续),下面以求5!为例说明求解过程。 递推过程 5!=4! 5 4!=3! 4 3!=2! 3 2!=1! 2 1!=1 回归过程 2!=12=2 3!=23=6 4!=64=24 5!=245=120,5.5.3 递归的使用(续),可以看出一个递归过程可以分为“递推”和“回归”两个阶段。“递推”阶段进行问题分解,将复杂问题分解

13、为性质相同、规模较小的简单问题,简单问题可做同样的分解直到分解后的问题可直接求解。“回归”阶段是根据已得到的简单问题的解一步一步返回,直到得到原问题的解。,5.5.3 递归的使用(续),【例5-6】使用递归方法求解n! 递归过程应该有结束递归调用的边界条件,如程序5-8中的n=1,当不满足边界条件时,产生新的递归调用;当满足边界条件时,不产生新的递归调用,递归调用返回。,/* 程序5-8 */ #include int fac(int n) if(n=1) return 1; else return fac(n-1)*n; void main( ) printf(“The factorial

14、of 5 is %d”,fac(5); ,5.6 局部变量与全局变量,5.6.1程序块 复合语句 变量定义 多条语句 我们将这样的复合语句称为一个程序块。 函数的函数体也是一个程序块。在函数体内也可以含有内部程序块。,if (xy) int temp; temp=x; x=y; y=temp; ,5.6.2 局部变量,在函数体内定义的变量称为函数的局部变量。 float average(float a,float b) float c; c=(a+b)/2; return c; ,5.6.2 局部变量(续),默认情况下,局部变量具有以下两个特性: (1)动态存储期限。 动态分配存储空间 只在函

15、数执行期间是存在的, 在两次函数调用之间,局部变量不能保留原来的值。 (2)程序块作用域。 作用域仅限于函数内体内, 在其它函数中是无法通过变量名直接访问该变量的。 可以在其他函数中定义同名的变量。,5.6.2 局部变量(续),main函数中定义的变量也属于局部变量。 函数的形式参数也是局部变量。 准确的说在程序块(包括函数体)中定义的变量都属于局部变量。程序块中的变量的作用域限定在定义该变量的程序块内。,5.6.2 局部变量(续),【例5-7】求两个整数的最大值,/*程序5-10*/ #include int maxvalue(int a, int b) if(ab) int temp; t

16、emp=a; a=b; b=temp; return a; void main( ) int a,b,max; printf(“Input a and b:n”); scanf(“%d,%d”, ,5.6.3 外部变量,我们把在函数之外定义的变量称为外部变量或全局变量。 float ave; float average(float a,float b) ave=(a+b)/2; ,5.6.3 外部变量(续),外部变量具有和局部变量不同的两个特性: (1)静态存储期限。在程序执行过程中,外部变量始终具有固定的存储空间,所以可以永久保留变量的值。 (2)文件作用域。外部变量的作用域是从变量的定义开始一直到程序文件的结束。所以在外部变量定义之后的所有函数都可以通过变量名访问它。,5.6.3 外部变量(续),外部变量可以被多个函数所

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

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

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