收藏 分销(赏)

第7章函数省公共课一等奖全国赛课获奖课件.pptx

上传人:快乐****生活 文档编号:3541793 上传时间:2024-07-09 格式:PPTX 页数:44 大小:257.28KB
下载 相关 举报
第7章函数省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共44页
第7章函数省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共44页
第7章函数省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共44页
第7章函数省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共44页
第7章函数省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、第7章 函数第1页本章主要内容o1 函数概述函数概述o2 函数定义函数定义o3 函数参数与调用函数参数与调用 o4 递归函数递归函数o5 内联函数内联函数o6 重载函数重载函数o7 默认参数函数默认参数函数o8 全局变量与局部变量全局变量与局部变量o9 变量存放类型变量存放类型o10 内部函数与外部函数内部函数与外部函数o11 怎样运行一个多文件程序怎样运行一个多文件程序第2页7.1 函数概述o程序通常是非常复杂而冗长。实际编程中,有些程序需要几万甚至几百万程序通常是非常复杂而冗长。实际编程中,有些程序需要几万甚至几百万行代码。在编写一个很长程序时,能够采取一个很好策略,就是把这个大行代码。在

2、编写一个很长程序时,能够采取一个很好策略,就是把这个大程序分割成一些相对独立而且便于管理和阅读小块程序。这么,不论对程程序分割成一些相对独立而且便于管理和阅读小块程序。这么,不论对程序员还是其它阅读者都很方便。序员还是其它阅读者都很方便。o把相关语句组织在一起,并给它们注明对应名称,利用这种方法把程序分把相关语句组织在一起,并给它们注明对应名称,利用这种方法把程序分块,这种形式组合就是函数。块,这种形式组合就是函数。o函数使用是经过函数调用实现。函数使用是经过函数调用实现。o程序员编写完成指定任务函数,普通称之为程序员编写完成指定任务函数,普通称之为用户自定义函数用户自定义函数;C+提供提供能

3、够在任何程序中使用公共函数,称为能够在任何程序中使用公共函数,称为标准库函数标准库函数。程序总是从。程序总是从main()函数开始开启。函数开始开启。第3页mainbacdefghhiegp 下列图反应了函数被调用层次关系:下列图反应了函数被调用层次关系:第4页oC+函数是一个独立完成某个功效语句块,函数与函数之间经过输入参函数是一个独立完成某个功效语句块,函数与函数之间经过输入参数和返回值数和返回值(输出输出)来联络。能够把函数看作是一个来联络。能够把函数看作是一个“黑盒黑盒(black box)”,除了输入输出,其它什么也看不见。,除了输入输出,其它什么也看不见。#include#incl

4、ude void printstar()void printstar()cout *n;cout *n;void print_message()void print_message()cout function print_message.n;cout function print_message.n;void main()void main()printstar();printstar();print_message();print_message();printstar();printstar();第5页7.2 函数定义定义:定义:函数名(函数名()语句语句;申明:申明:函数名(函数名()

5、;);int max(int x,int y);/函数原型申明函数原型申明int max(int x,int y)/函数定义函数定义 int z;z=xy?x:y;return(z);C+和和C语言关于函数内语言关于函数内部申明要求有所不一样。部申明要求有所不一样。早期也可写作:早期也可写作:int max(x,y)int x,y;第6页pC+中函数申明又称为中函数申明又称为函数原型函数原型。函数原型和函数定义在返回类型、函。函数原型和函数定义在返回类型、函数名和参数表上必须完全一致。数名和参数表上必须完全一致。p函数原型中无须包含参数名字,而只要包含参数类型。比如上例中函数申函数原型中无须包

6、含参数名字,而只要包含参数类型。比如上例中函数申明能够写作:明能够写作:int max(int,int);p函数普通应该先申明,后使用。函数普通应该先申明,后使用。但假如被调用函数定义出现主调用函数之但假如被调用函数定义出现主调用函数之前,则能够无须加以申明。前,则能够无须加以申明。double add(double x,double y)return x+y;void main()cout y?x:y;return(z);p假如返回其它数据类型,则在返回时,先作类型转换,如:假如返回其它数据类型,则在返回时,先作类型转换,如:int f()return 3.5;第10页p函数返回不是函数本身

7、,而不一个值。函数返回不是函数本身,而不一个值。p无返回函数也能够使用无返回函数也能够使用return,但不能返回值。比如:,但不能返回值。比如:void message(int a)if(a 10)return;/p函数返回值若是省略,则默认为函数返回值若是省略,则默认为int类型。类型。p关于关于main函数及其返回值。函数及其返回值。第11页7.3 函数参数与调用o7.3.1 形式参数和实际参数形式参数和实际参数形式参数:形式参数:定义函数中参数变量名定义函数中参数变量名实际参数:实际参数:调用一个函数时,函数名后面括号中表示式调用一个函数时,函数名后面括号中表示式(如:变量、常量(如:

8、变量、常量)#include int max(int a,int b);return a b?a:b;void main()int x,y;cin x y;cout max=2)return(fib(x-1)+fib(x-2);else return 1;int fn1(int a)int b;b=fn2(a+1);/.int fn2(int s)int c;c=fn1(s-1);/.第16页o7.4.3 递归调用条件递归调用条件(1)必须有完成函数任务语句;必须有完成函数任务语句;(2)一个确定是否能防止递归调用测试;一个确定是否能防止递归调用测试;(3)一个递归调用语句;一个递归调用语句;

9、(4)先测试,后递归调用。先测试,后递归调用。int fact(int n)if(n=1)return 1;return fact(n-1)*n;第17页o7.4.4 递归评价递归评价o 大多数递归函数都能用非递归函数来代替,递归目标是简化程序设计,使程大多数递归函数都能用非递归函数来代替,递归目标是简化程序设计,使程序易读序易读。o 但递归增加了系统开销,时间上说,执行调用与返回额外工作要占用但递归增加了系统开销,时间上说,执行调用与返回额外工作要占用CPU时间。空间上,伴随每递归一次,栈内存就多占用一截。时间。空间上,伴随每递归一次,栈内存就多占用一截。o 对应非递归函数即使效率高,但却比

10、较难编程,而且相对来说可读性差。当对应非递归函数即使效率高,但却比较难编程,而且相对来说可读性差。当代程序设计目标主要是可读性好,所以勉励用递归函数实现程序思想。代程序设计目标主要是可读性好,所以勉励用递归函数实现程序思想。第18页7.5 内联函数o内联函数主要用于处理程序运行效率问题。因为函数调用需要建立栈内存内联函数主要用于处理程序运行效率问题。因为函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作都需要一些时间开环境,进行参数传递,并产生程序执行转移,这些工作都需要一些时间开销。所以对于函数使用频率高,代码很短函数能够使用内联函数。销。所以对于函数使用频率高,代码很短

11、函数能够使用内联函数。o定义内联函数时,在函数申明前加上定义内联函数时,在函数申明前加上inline关键字,如:关键字,如:inline int isnumber(char ch);o编译器看到到编译器看到到inline后,为该函数创建一段代码,在后面每次碰到该函数后,为该函数创建一段代码,在后面每次碰到该函数调用都用对应一段代码来替换。如:调用都用对应一段代码来替换。如:第19页#include inline int isnumber(char ch);void main()char c=;while(c!=q)cin c;if(isnumber(c)cout you entered a d

12、igit.n;elsecout=0&ch=9)?1:0;第20页o内联函数中,不能含有复杂结构控制语句,如内联函数中,不能含有复杂结构控制语句,如switch和和while。假如内。假如内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。另外,递归函数是不能做为内联函数。另外,递归函数是不能做为内联函数。o内联函数只适合于只有内联函数只适合于只有15行小函数。对于一个含有许多语句大函数,行小函数。对于一个含有许多语句大函数,函数调用和返回开销相对来说微不足道,所以也没有必要用内联函数实现。函数调用和返回开销相对来

13、说微不足道,所以也没有必要用内联函数实现。第21页7.6 重载函数o 重载函数需要性重载函数需要性:在在C语言中,每个函数必须有其唯一名字,但有时,这会令人生厌。比如,语言中,每个函数必须有其唯一名字,但有时,这会令人生厌。比如,求一个数绝对值,因为命名唯一,所以对于不一样类型需要不一样名字函数:求一个数绝对值,因为命名唯一,所以对于不一样类型需要不一样名字函数:int abs(int);long labs(long);double fabs(double);这几个函数所做事情是一样,都是求绝对值。对于在不一样类型上作不一这几个函数所做事情是一样,都是求绝对值。对于在不一样类型上作不一样运算而

14、又用一样名字情况,称这为重载。比如,上述样运算而又用一样名字情况,称这为重载。比如,上述3个函数申明能够改为:个函数申明能够改为:int abs(int);long abs(long);double abs(double);第22页o C+用一个函数命名技术能够准确判断出应该使用哪个用一个函数命名技术能够准确判断出应该使用哪个abs()函数:函数:abs(-10);abs(-12.23);o 关于匹配重载函数次序。关于匹配重载函数次序。o 重载函数最少在参数个数、参数类型或参数次序上有所不一样,光靠返回值重载函数最少在参数个数、参数类型或参数次序上有所不一样,光靠返回值不一样则是不够,如:不一

15、样则是不够,如:void func(int);int func(int);o 让重载函数执行不一样功效,不是一个好编程格调。让重载函数执行不一样功效,不是一个好编程格调。第23页7.7 默认参数函数o7.7.1 默认参数目标默认参数目标 通常函数调用时,要为函数每个参数给定对应实参。通常函数调用时,要为函数每个参数给定对应实参。C+能够给函数定能够给函数定义默认参数值。如:义默认参数值。如:void delay(int loops=1000);void delay(int loops)if(loops=0)return;for(int i=0;iloops;+i)/Do nothing 则调用

16、:则调用:delay(2500);/loops设置为设置为2500 delay();/OK,loops采取默认值采取默认值1000第24页o7.7.2 默认参数申明默认参数申明 默认参数只允许在函数申明中提供,函数定义中不允许默认参数:默认参数只允许在函数申明中提供,函数定义中不允许默认参数:void point(int x=3,int y=4);void point(int x,int y)cout x endl;cout y endl;第25页o7.7.3 默认参数次序要求默认参数次序要求 假如一个函数中有多个默认参数,则默认参数应从右至左逐步定义。当调假如一个函数中有多个默认参数,则默认

17、参数应从右至左逐步定义。当调用函数时,只能向左匹配参数。如:用函数时,只能向左匹配参数。如:void func(int a=1,int b,int c=3,int d=4);/errorvoid func(int a,int b=2,int c=3,int d=4);/OK对于第对于第2个函数申明:个函数申明:func(10,15,20,30);/OKfunc();/error,a没有值没有值func(12,12);/c,d默认默认Func(2,15,20);/error,只有从右到左次序默认只有从右到左次序默认 第26页o7.7.4 默认参数与函数重载默认参数与函数重载 默认参数可将一系列简

18、单重载函数合成为一个,如:默认参数可将一系列简单重载函数合成为一个,如:void point(int,int)/*.*/void point(int a)return point(a,4);void point()return point(3,4);可用下面默认参数函数来代替:可用下面默认参数函数来代替:void point(int a=3,int b=4);第27页而以下重载函数将会引发二义性,如:而以下重载函数将会引发二义性,如:void func(int a);void func(int a,int b=4);void func(int a=3,int b=4);func(7);/err

19、orfunc(20,30);/error 第28页7.8 全局变量与局部变量o7.8.1 程序内存区域程序内存区域n并不是全部变量时时刻刻都是可知。并不是全部变量时时刻刻都是可知。一些变量在整个程序中都是可见,一些变量在整个程序中都是可见,它们称为全局变量。一些变量只能它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。在一个函数中可知,称为局部变量。第29页o7.8.2 全局变量全局变量n在函数外边申明变量被认在函数外边申明变量被认为是全局变量,并在程序为是全局变量,并在程序每个函数中可见。每个函数中可见。n全局变量由编译器自动建全局变量由编译器自动建立,而且初始化为立,而且初始化

20、为0。int n=5;void main()int m=n;/void func()int s;n=s;/第30页o7.8.3 局部变量o在函数内部定义变量仅在该函数内是可见。o一个函数可认为局部变量定义任何名字,而不用担心其他函数是否使用过一样名字。o局部变量没有初始化,如果局部变量不被显式初始化,那么其内容是不可预料。void main()int n;/void func()int n;/第31页7.9 变量存放类型变量存放类型7.9.1 静态局部变量静态局部变量o在局部变量前加上在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变关键字,就成了静态局部变量。静态局部变量

21、存放在内存全局数据区。量存放在内存全局数据区。函数结束时,静态局部变量不会消失,每次该函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间函数调用时,也不会为其重新分配空间。o静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它函静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它函数中可见。数中可见。示例程序:示例程序:第32页#include int n=0;void func1();void func2();void main()for(int i=0;i2;+i)func1();func2();void func1()static int a=

22、0;n+;a+;cout n=n ,a=a endl;void func2()int a=0;n+;a+;cout n=n ,a=a endl;n=1,a=1n=2,a=1n=3,a=2n=4,a=1运行结果运行结果第33页7.9.2 外部变量外部变量o用用extern申明外部变量。申明外部变量。o外部变量外部变量(即全局变量即全局变量)是在函数外部定义,它作用域为从变量定义处开始到是在函数外部定义,它作用域为从变量定义处开始到本程序文件末尾。本程序文件末尾。比如,一个工程文件由两个比如,一个工程文件由两个CPP文件组成,分别是文件组成,分别是part1.cpp和和part2.cpp:第34页

23、/Part1.cpp/#include void fn1();void fn2();int n;void main()n=3;fn1();/fn1()函数定义在本文件中函数定义在本文件中cout n endl;void fn1()fn2();/fn2()函数定义不在本文件中函数定义不在本文件中/Part2.cpp/#include extern int n;/n由另一个源文件定义由另一个源文件定义void fn2()/fn2()函数在另一个源文件中使用函数在另一个源文件中使用n=8;第35页o用用extern申明外部变量是变量申明,不是变量定义。注意申明与定义区分。申明外部变量是变量申明,不是

24、变量定义。注意申明与定义区分。o假如一个全局变量只限于本文件使用,不希望被其它文件引用,这时能够在假如一个全局变量只限于本文件使用,不希望被其它文件引用,这时能够在定义全局变量时加一个定义全局变量时加一个static,如,如:/part1.cpp/static int n;void main()n=3;/第36页7.9.3 变量作用域变量作用域o变量作用域是变量在程序中有效范围,变量作用域是变量在程序中有效范围,C+作用域分为:局部作用域作用域分为:局部作用域(块作块作用域用域),函数原型作用域,文件作用域和类作用域。函数原型作用域,文件作用域和类作用域。o局部作用域:当标识符申明出现在由一对

25、花括号括起来程序块内时,该标识局部作用域:当标识符申明出现在由一对花括号括起来程序块内时,该标识符作用域从申明点开始,到块结束处为止,该作用域范围含有局部性。如:符作用域从申明点开始,到块结束处为止,该作用域范围含有局部性。如:第37页#include int n=0;double area(double width,double length);/width,length可有可无可有可无void main()int sum=0;for(int i=0;i10;i+)int half;half=i/2;n+=sum;cout half i sum n;/ERROR!第38页7.9.4 变量可见

26、性变量可见性#include int n=0;void main()int n=10;cout n inside main()is n endl n outside main()is :n endl;第39页7.10 内部函数与外部函数内部函数与外部函数o依据函数能否被其它源文件调用,将函数区分为内部函数和外部函数。依据函数能否被其它源文件调用,将函数区分为内部函数和外部函数。o假如一个函数只能被本文件中其它函数调用,被之为内部函数。在定义内假如一个函数只能被本文件中其它函数调用,被之为内部函数。在定义内部函数时,在函数名和函数返回值类型前加上部函数时,在函数名和函数返回值类型前加上stati

27、c。o假如一个函数能够在其它文件中作用,称之为外部函数。定义外部函数时,假如一个函数能够在其它文件中作用,称之为外部函数。定义外部函数时,在函数名和函数返回值类型前加上在函数名和函数返回值类型前加上extern。因为函数本质上是全局,所。因为函数本质上是全局,所以以extern能够省略。能够省略。第40页7.11 怎样运行一个多文件程序怎样运行一个多文件程序o一个程序经常由多个源文件组成,每个源文件是一个可编译程序单位。在一个程序经常由多个源文件组成,每个源文件是一个可编译程序单位。在将程序分解成多个源文件之后,必须计划在每个源文件中哪些信息能够被将程序分解成多个源文件之后,必须计划在每个源文

28、件中哪些信息能够被其它文件使用,哪些不能够。其它文件使用,哪些不能够。o因为同一名字申明能够出现屡次,所以能够将申明放在头文件中。头文件因为同一名字申明能够出现屡次,所以能够将申明放在头文件中。头文件起着源文件之间接口作用。起着源文件之间接口作用。比如有以下程序结构:比如有以下程序结构:第41页/area.h/double AreaOfCircle(double dRadius);double AreaOfRectangle(double dWidth,double dHeight);/circle.cpp/#include area.hconst double pi=3.1415926;do

29、uble AreaOfCircle(double dRadius)return pi*dRadius*dRadius;/rectangle.cpp/#include area.hdouble AreaOfRectangle(double dWidth,double dHeight)return dWidth*dHeight;第42页/main.cpp/#include#include area.hvoid main()double w,h;w=10.0;h=20.0;cout AreaOfRectangle(w,h)endl;double r;r=10;cout AreaOfCircle(r)endl;第43页C+C+程序开发示意图程序开发示意图程序开发示意图程序开发示意图第44页

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服