第4章函数精选PPT.ppt
《第4章函数精选PPT.ppt》由会员分享,可在线阅读,更多相关《第4章函数精选PPT.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章函数章函数1第1页,本讲稿共53页教学目标教学目标o了解函数的分类了解函数的分类o掌握函数的声明和定义规范掌握函数的声明和定义规范o掌握函数的形式参数和实际参数的定义和用法掌握函数的形式参数和实际参数的定义和用法o掌握函数返回值的大小和类型掌握函数返回值的大小和类型o掌握函数的调用方法和参数传递掌握函数的调用方法和参数传递o了解函数的嵌套调用了解函数的嵌套调用o掌握函数的递归调用及其程序规范掌握函数的递归调用及其程序规范o了解变量存储类型的基本概念了解变量存储类型的基本概念o掌握局部变量与全局变量的概念掌握局部变量与全局变量的概念 2第2页,本讲稿共53页o4.1 函数概述函数概述o4
2、.2 函数的声明和定义函数的声明和定义o4.3 函数的参数和函数的返回值函数的参数和函数的返回值 o4.4 函数的调用函数的调用 o4.5 局部变量和全局变量局部变量和全局变量 o4.6 变量的存储类型变量的存储类型 o4.7 外部函数和内部函数外部函数和内部函数 o4.8 综合应用综合应用 3第3页,本讲稿共53页oC是模块化程序设计语言是模块化程序设计语言C程序结构pC是函数式语言p必须有且只能有一个名为main的主函数pC程序的执行总是从main函数开始,在main中结束p函数不能嵌套定义,可以嵌套调用4.1 函数概述4第4页,本讲稿共53页o函数分类函数分类n函数定义的角度上分函数定义
3、的角度上分 o库函数库函数o用户自定义函数用户自定义函数n返回值情况来分返回值情况来分o有返回值函数有返回值函数o无返回值函数无返回值函数 n函数参数的传递来分函数参数的传递来分o有参数函数有参数函数o无参数函数无参数函数 5第5页,本讲稿共53页4.2 函数的声明和定义函数的声明和定义 o函数的类型说明函数的类型说明n告诉编译器它返回什么类型的数据告诉编译器它返回什么类型的数据 n不同的数据有不同的长度和内部表示不同的数据有不同的长度和内部表示 o函数的定义形式 函数返回值类型说明符 函数名(形式参数列表)函数内部变量声明 函数操作语句序列6第6页,本讲稿共53页o例例4.1:求两个整数的最
4、大值的函数定义:求两个整数的最大值的函数定义intint maxmax(int x,int y)(int x,int y)int z;int z;if(xy)if(xy)z=x;z=x;else elsez=y;z=y;return z;return z;返回值类型返回值类型返回值类型返回值类型函数名函数名函数名函数名函数参数函数参数函数参数函数参数函数体函数体函数体函数体7第7页,本讲稿共53页o说明说明n函数返回值类型说明符是函数返回值类型说明符是C语言合法的数据类型语言合法的数据类型说明符。说明符。n函数名是合法的函数名是合法的C语言标识符语言标识符n形式参数列表包含形式参数的类型说明和
5、形式形式参数列表包含形式参数的类型说明和形式参数名参数名n多个形式参数之间用逗号分开多个形式参数之间用逗号分开n如果没有形式参数列表,函数名后面的圆括号如果没有形式参数列表,函数名后面的圆括号不能省略。不能省略。8第8页,本讲稿共53页4.3 函数的参数和函数的返回值函数的参数和函数的返回值o函数的形式参数函数的形式参数n函数的定义中使用的参数叫做函数的定义中使用的参数叫做形式参数形式参数,简称形参,简称形参n在整个函数体内都可以使用,离开该函数则不能使用在整个函数体内都可以使用,离开该函数则不能使用n形参形参只能是变量只能是变量,形参变量只有在被调用时才分配内存单元,形参变量只有在被调用时才
6、分配内存单元n形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量用该形参变量 int max(int max(int x,int yint x,int y)int z;int z;if(xy)if(xy)z=x;z=x;else elsez=y;z=y;return z;return z;9第9页,本讲稿共53页o函数的实际参数函数的实际参数n主调函数中对应予形式参数的量称为主调函数中对应予形式参数的量称为实际参数实际参数,简称实参简称实参 n实参可以是常量、变量、表达式、函数实参可以是常量、变量、表达式、函数
7、n进行函数调用时,实参必须具有确定的值进行函数调用时,实参必须具有确定的值 n实参和形参在数量上、类型上、顺序上应严格保实参和形参在数量上、类型上、顺序上应严格保持一致,否则会发生持一致,否则会发生“类型不匹配类型不匹配”的错误。的错误。10第10页,本讲稿共53页#include#includeint max(int x,int y);int max(int x,int y);/*/*函数声明函数声明*/*/int main()int main()int a,b,m;int a,b,m;scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);m=max(a,b);m=max(
8、a,b);printf(printf(最大值:最大值:n,m);n,m);return 0;return 0;int max(int max(int x,int yint x,int y)int z;int z;if(xy)if(xy)z=x;z=x;else elsez=y;z=y;return z;return z;11第11页,本讲稿共53页main()a=10b=20mmax()函数main()a=10b=20mmax()函数x=10y=20main()a=10b=20mmax()函数x=10y=20z=20main()a=10b=20m=20max()函数x=10y=20z=20ma
9、in()a=10b=20m=20max()函数调用前参数传递计算最大值返回函数值调用结束实际参数仅仅是将值实际参数仅仅是将值实际参数仅仅是将值实际参数仅仅是将值复制复制复制复制给形式参数,这是一个给形式参数,这是一个给形式参数,这是一个给形式参数,这是一个单向值传递单向值传递单向值传递单向值传递过程过程过程过程 12第12页,本讲稿共53页o例例4.3:用函数实现两个整数的交换:用函数实现两个整数的交换#include#includevoid swap(int x,int y);void swap(int x,int y);int main()int main()int a,b;int a,b
10、;scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);printf(printf(调用函数之前:调用函数之前:调用函数之前:调用函数之前:n);n);printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);swap(a,b);swap(a,b);printf(n);printf(n);printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);return 0;return 0;void swap(int x,int y)void swap(int x,int y)int t;int t;t=x;t=x;x
11、=y;x=y;y=t;y=t;printf(printf(调用函数内部:调用函数内部:n);n);printf(x=%d,y=%dn,x,y);printf(x=%d,y=%dn,x,y);从键盘上输入从键盘上输入从键盘上输入从键盘上输入1010 20 20 回车回车回车回车调用函数之前:调用函数之前:调用函数之前:调用函数之前:a=10 a=10,b=20b=20调用函数内部:调用函数内部:调用函数内部:调用函数内部:x=20 x=20,y=10y=10调用函数之后:调用函数之后:调用函数之后:调用函数之后:a=10 a=10,b=20b=2013第13页,本讲稿共53页14第14页,本讲稿
12、共53页o函数的返回值函数的返回值 n形式:形式:return 表达式;或表达式;或return(表达式);(表达式);n功能:计算表达式的值,并返回给主调函数功能:计算表达式的值,并返回给主调函数 pp函数返回值的类型由定义函数是的类型决定函数返回值的类型由定义函数是的类型决定函数返回值的类型由定义函数是的类型决定函数返回值的类型由定义函数是的类型决定pp函数中允许有多个函数中允许有多个函数中允许有多个函数中允许有多个returnreturnreturnreturn语句,但每次只能有一个语句,但每次只能有一个语句,但每次只能有一个语句,但每次只能有一个returnreturnreturnre
13、turn语句被执行语句被执行语句被执行语句被执行pp函数定义时,如果函数的类型为函数定义时,如果函数的类型为函数定义时,如果函数的类型为函数定义时,如果函数的类型为voidvoidvoidvoid,则该函数没有返回值,则该函数没有返回值,则该函数没有返回值,则该函数没有返回值15第15页,本讲稿共53页4.4 函数的调用函数的调用 o函数调用的一般形式函数调用的一般形式:函数名:函数名(实际参数列表)(实际参数列表)n对于无参数函数调用时,则没有实际参数列表。对于无参数函数调用时,则没有实际参数列表。n实际参数表中的参数可以是变量、常量和表达式等。实际参数表中的参数可以是变量、常量和表达式等。
14、n实际参数之间用逗号分隔实际参数之间用逗号分隔n实参的求值顺序是不确定的,不同的编译器略有不同实参的求值顺序是不确定的,不同的编译器略有不同max(amax(amax(amax(a,b)b)b)b)fun()fun()fun()fun()max(max(a,b),c)max(max(a,b),c)max(max(a,b),c)max(max(a,b),c)f(i,i+)f(i,i+)f(i,i+)f(i,i+)16第16页,本讲稿共53页o函数调用规范函数调用规范 17第17页,本讲稿共53页o函数调用方式函数调用方式 n作为表达式的一部分:作为表达式的一部分:c=2*max(a,b)n作为作
15、为C语言语句语言语句:max(a,b);n作为函数参数作为函数参数:max(max(a,b),c)18第18页,本讲稿共53页o例例4.5:函数调用方形式,求三个整数的最:函数调用方形式,求三个整数的最大公约数大公约数#include#include#include#includeint gcd(int x,int y);int gcd(int x,int y);int main()int main()int a,b,c,g;int a,b,c,g;scanf(%d%d%d,&a,&b,&c);scanf(%d%d%d,&a,&b,&c);if(a=0|b=0|c=0)if(a=0|b=0|c
16、=0)printf(printf(数据输入错误数据输入错误!n);!n);exit(0);exit(0);g=gcd(a,b);g=gcd(a,b);printf(printf(“最大公约数最大公约数%dn,gcd(g,c);%dn,gcd(g,c);return 0;return 0;int gcd(int x,int y)/*int gcd(int x,int y)/*函数定义函数定义*/*/int r;int r;dodor=x%y;r=x%y;x=y;x=y;y=r;y=r;while(r!=0);while(r!=0);return x;return x;输入输入输入输入44 323
17、2 88回车回车回车回车最大公约数是:最大公约数是:最大公约数是:最大公约数是:4419第19页,本讲稿共53页o例例4.6:求:求2100之间的所有素数之间的所有素数#include#include#include#includeint isprime(int n);int isprime(int n);int main()int main()int i;int i;for(i=2;i=100;i+)for(i=2;i=100;i+)if(isprime(i)if(isprime(i)printf(%4d,i);printf(%4d,i);return 0;return 0;int ispr
18、ime(int n)int isprime(int n)int k;int k;for(k=2;k=sqrt(n);k+)for(k=2;k=sqrt(n);k+)if(n%k=0)if(n%k=0)return 0;return 0;return 1;return 1;2 3 5 7 11 13 17 19 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 23 29 31 37 41 43 47 53 59 61 67 71 79 83 89 9759 61 67 71 79 83 89 9720第20页,本讲稿共53页o 函数的嵌套调用函数的嵌套调用
19、:在一个函数的定义中出:在一个函数的定义中出现对另一个函数的现对另一个函数的调用调用ppC CC C语言中的函数之间不存在上下级之间的关系语言中的函数之间不存在上下级之间的关系语言中的函数之间不存在上下级之间的关系语言中的函数之间不存在上下级之间的关系pp不能在一个函数内又定义另外一个函数不能在一个函数内又定义另外一个函数不能在一个函数内又定义另外一个函数不能在一个函数内又定义另外一个函数pp只能在一个函数的定义中出现对另一个函数的调用只能在一个函数的定义中出现对另一个函数的调用只能在一个函数的定义中出现对另一个函数的调用只能在一个函数的定义中出现对另一个函数的调用 21第21页,本讲稿共53
20、页o例例4.7:函数嵌套:函数嵌套调用,输入一个正调用,输入一个正数小,用牛顿迭代数小,用牛顿迭代法求法求 22第22页,本讲稿共53页#include#include#include#includedouble sqrt_root(double,double);double sqrt_root(double,double);double abs_value(double);double abs_value(double);int main()int main()double x,e;double x,e;scanf(%lf%lf,&x,&e);scanf(%lf%lf,&x,&e);if(x
21、=0|e=0)if(x=0|e=0)printf(printf(输入数据错误输入数据错误!n);!n);exit(0);exit(0);printf(printf(“%lf%lf:%lfn,x,%lfn,x,sqrt_root(x,esqrt_root(x,e););return 0;return 0;double abs_value(double y)double abs_value(double y)if(y0)if(y=e)=e)x0=(x0+x/x0)/2;x0=(x0+x/x0)/2;return x0;return x0;23第23页,本讲稿共53页4.4 函数递归调用函数递归调用
22、o定义定义:在函数体内间接或直接调用函数本身:在函数体内间接或直接调用函数本身o递归是一种递归是一种简化复杂问题求解简化复杂问题求解过程的手段过程的手段 o先将问题逐步简化,但在简化过程中先将问题逐步简化,但在简化过程中保持保持问问题的性质不变,直到问题最简题的性质不变,直到问题最简 int f(int x)int y,z;z=f(y);.return(2*z);int f1(int x)int y,z;z=f2(y);.return(2*z);int f2(int t)int a,c;c=f1(a);.return(3+c);24第24页,本讲稿共53页25第25页,本讲稿共53页o例例4.
23、8:用递归调用求:用递归调用求n!#include#includeunsigned int factorial(unsigned int);unsigned int factorial(unsigned int);int main()int main()unsigned int n,fac;unsigned int n,fac;scanf(%u,&n);scanf(%u,&n);fac=factorial(n);fac=factorial(n);printf(%u printf(%u的阶乘的阶乘=%un,n,fac);=%un,n,fac);return 0;return 0;unsigned
24、 int factorial(unsigned int n)unsigned int factorial(unsigned int n)unsigned int result;unsigned int result;if(n=0)if(n=0)result=1;result=1;elseelse result=n*factorial(n-1);result=n*factorial(n-1);return result;return result;输入输入输入输入33回车回车回车回车33的阶乘的阶乘的阶乘的阶乘=6=626第26页,本讲稿共53页o递归程序书写规范递归程序书写规范ifif(最简单
25、情形)(最简单情形)(最简单情形)(最简单情形)直接得到最简单情形下的解直接得到最简单情形下的解直接得到最简单情形下的解直接得到最简单情形下的解elseelse 将原始问题转化为稍微简单一些的一个或多个子问题将原始问题转化为稍微简单一些的一个或多个子问题将原始问题转化为稍微简单一些的一个或多个子问题将原始问题转化为稍微简单一些的一个或多个子问题 以递归方式逐个求解这些子问题以递归方式逐个求解这些子问题以递归方式逐个求解这些子问题以递归方式逐个求解这些子问题 以合理有效的方式将这些子问题的解组装成原始问题的解以合理有效的方式将这些子问题的解组装成原始问题的解以合理有效的方式将这些子问题的解组装成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 精选 PPT
限制150内