(53)--第6章 函数程序设计--里应外合的函数.ppt





《(53)--第6章 函数程序设计--里应外合的函数.ppt》由会员分享,可在线阅读,更多相关《(53)--第6章 函数程序设计--里应外合的函数.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 函数程序设计函数程序设计 第第6 6章章 函数程序设计函数程序设计u6.1 函数概述 u6.2 自定义函数示例u6.3 函数定义及调用 u6.4 函数嵌套和递归函数u6.5 数组与函数u6.6 函数应用程序举例u6.7 变量的作用域和存储类型C C语言程序设计(第语言程序设计(第4 4版)版)ISBN9787302496014 ISBN9787302496014 清华大学出版社清华大学出版社 张磊编著张磊编著 6.16.1函数概述函数概述函数概述函数概述l lC C语言程序的特点:函数化结构语言程序的特点:函数化结构l l函数分类:系统函数、用户函数函数分类:系统函数、用户函数系统
2、函数:系统函数:printf()printf()、scanf()scanf()、sqrt()sqrt()等等用户函数:用户函数:在程序中编写的函数在程序中编写的函数,又称,又称自定义函数自定义函数。用户函数的特例:用户函数的特例:main()main()函数函数l l如果在程序中经常需要某种处理,就可以编写一个函数,在需要如果在程序中经常需要某种处理,就可以编写一个函数,在需要这种处理时,就调用该函数。这种处理时,就调用该函数。l l示例示例计算a!+b!+c!6.26.2用户函数用户函数用户函数用户函数示例示例示例示例例例例例6-16-1编程计算表达式a!+b!+c!的值。l l程序结构只有
3、程序结构只有程序结构只有程序结构只有main()main()函数的阶乘程序函数的阶乘程序函数的阶乘程序函数的阶乘程序#includevoid main()int a,b,c,i;long t,sum;printf(Input a,b,c:);scanf(%d,%d,%d,&a,&b,&c);for(t=1,i=1;i=a;i+)for(t=1,i=1;i=a;i+)t=t*i;t=t*i;sum=t;for(t=1,i=1;i=b;i+)for(t=1,i=1;i=b;i+)t=t*i;t=t*i;sum+=t;for(t=1,i=1;i=c;i+)for(t=1,i=1;i=c;i+)t=t
4、*i;t=t*i;sum+=t;printf(SUM=%ldn,sum);l l使用用户函数使用用户函数使用用户函数使用用户函数的阶乘程序的阶乘程序的阶乘程序的阶乘程序#include int main()long f(int n);int a,b,c;printf(Input a,b,c:);scanf(%d,%d,%d,&a,&b,&c);printf(SUM=%ldn,f(a)+f(b)+f(c);return 0;longf(intn)longf(intn)/*/*计算阶乘的函数计算阶乘的函数计算阶乘的函数计算阶乘的函数*/longt;longt;inti;inti;for(t=1,i
5、=1;i=n;i+)for(t=1,i=1;i=n;i+)t*=i;t*=i;return(t);return(t);求求n!函数函数调用函数调用函数f()求求c!6.36.3函数定义及调用函数定义及调用函数定义及调用函数定义及调用l6.3.1 函数定义l6.3.2 函数值和return命令l6.3.3 函数调用 6.3.16.3.1函数定义函数定义函数定义函数定义 l l函数定义的一般格式函数定义的一般格式函数类型函数类型函数类型函数类型 函数名函数名函数名函数名(形式参数表形式参数表形式参数表形式参数表)函数体函数体函数体函数体 l l形式参数表的格式形式参数表的格式数据类型数据类型数据类
6、型数据类型 变量变量变量变量1,1,数据类型数据类型数据类型数据类型 变量变量变量变量2,2,数据类型数据类型数据类型数据类型 变量变量变量变量n n函数值函数值的类型的类型 6.3.1函数定义函数定义例例例例6-26-2 定义连续输出定义连续输出定义连续输出定义连续输出n n个个个个*字符的函数。字符的函数。字符的函数。字符的函数。voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;iy?x:y;returnm;returnm;float max(float x,float y)if(xy)returnx;retu
7、rnx;elsereturny;returny;6.3.2函数值和函数值和return命令命令例例例例6-46-4int sum(int n)int s,i;for(s=0,i=1;i=n;i+)s+=i;return s;C C C C语言程序设计语言程序设计语言程序设计语言程序设计-理论、方法与实践(第理论、方法与实践(第理论、方法与实践(第理论、方法与实践(第2 2 2 2版)版)版)版)6.6.3.33.3函数调用函数调用函数调用函数调用在进行函数调用之前,须对被调用函数进行函数声明函数函数函数函数原型;原型;原型;原型;函数原型一般形式对已定义函数的具体应用一般格式函数函数函数函数名
8、名名名(实参表实参表实参表实参表)例如:f(a)发生函数调用时,函数中的形参将得到实参表中的数据,然后执行函数体语句,实现函数功能。函数调用函数声明函数函数函数函数类型类型类型类型 函数名函数名函数名函数名(数据类型数据类型数据类型数据类型11形参形参形参形参1,1,数据类型数据类型数据类型数据类型22形参形参形参形参2,2,数据类型数据类型数据类型数据类型nn形参形参形参形参n);n);简化形式简化形式简化形式简化形式函数类型函数类型函数类型函数类型 函数名(数据类型函数名(数据类型函数名(数据类型函数名(数据类型1,1,数据类型数据类型数据类型数据类型2,2,数据类型数据类型数据类型数据类
9、型n n)6.3.36.3.3函数调用函数调用函数调用函数调用 l函数调用注意事项 函数调用的实参个数必须与形参个数相同。实参与形参按照在参数表中的位置一一对应传值,实参与形参的名称是否相同对调用传值无任何影响。实参与形参对应位置上的数据类型应该一致。对于无参数函数,即形参表为void的函数,函数调用时实参表必须为空,不能有任何内容。函数定义函数定义函数定义函数定义voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)putchar(*);putchar(*);return;return;6.3.36.3
10、.3函数调用函数调用函数调用函数调用#include#includeintmain()intmain()voidp_star(intn);voidp_star(intn);intk;intk;for(k=1;k=5;k+)for(k=1;k=5;k+)p_star(k);p_star(k);putchar(n);putchar(n);return0;return0;例例例例6-56-5 调用调用调用调用p_star()p_star()函数,输出函数,输出函数,输出函数,输出*字符图案。字符图案。字符图案。字符图案。*函数原型及函函数原型及函数声明数声明函数调用函数调用函数实参函数实参函数形参函
11、数形参 6.3.36.3.3函数调用函数调用函数调用函数调用k值值p_star()调用调用实例实例参数传递参数传递执行结果执行结果1p_star(1)1传递给形参n执行执行p_star()的函数体,输出:的函数体,输出:*2p_star(2)2传递给形参n执行执行p_star()的函数体,输出:的函数体,输出:*3p_star(3)3传递给形参n执行执行p_star()的函数体,输出:的函数体,输出:*4p_star(4)4传递给形参n执行执行p_star()的函数体,输出:的函数体,输出:*5p_star(5)5传递给形参传递给形参n执行执行p_star()的函数体,输出:的函数体,输出:*
12、lp_star()函数调用的参数传递及执行情况函数调用的参数传递及执行情况 6.3.36.3.3函数调用函数调用函数调用函数调用例例例例6-66-6 调用求和函数调用求和函数调用求和函数调用求和函数sum()sum(),计算表达式,计算表达式,计算表达式,计算表达式#include#includeintmain()intmain()intsum(int);intsum(int);printf(%dn,printf(%dn,sum(20)+sum(50)sum(20)+sum(50););return0;return0;intsum(intn)intsum(intn)ints,i;ints,i;
13、for(s=0,i=1;i=n;i+)for(s=0,i=1;i=n;i+)s+=i;s+=i;return(s);return(s);函数定义函数定义函数调用函数调用 6.3.36.3.3函数调用函数调用函数调用函数调用n n函数调用的三种形式函数调用的三种形式函数调用的三种形式函数调用的三种形式 当被调用函数为当被调用函数为当被调用函数为当被调用函数为voidvoid类型时,函数无返回值,函数类型时,函数无返回值,函数类型时,函数无返回值,函数类型时,函数无返回值,函数调用是一个独立的语句。调用是一个独立的语句。调用是一个独立的语句。调用是一个独立的语句。当被调用函数有返回值时,函数调用出
14、现在表达式当被调用函数有返回值时,函数调用出现在表达式当被调用函数有返回值时,函数调用出现在表达式当被调用函数有返回值时,函数调用出现在表达式中,是表达式的一部分。中,是表达式的一部分。中,是表达式的一部分。中,是表达式的一部分。函数调用也可以作为一个函数的实参。函数调用也可以作为一个函数的实参。函数调用也可以作为一个函数的实参。函数调用也可以作为一个函数的实参。6.3.36.3.3函数调用函数调用函数调用函数调用#includeint main()float max(float,float);float a,b,c;printf(a,b,c:);scanf(%f,%f,%f,&a,&b,&c
15、);printf(Max=%fn,max(max(max(a,b)max(a,b),c);,c);return 0;float max(float x,float y)float m;m=xy?x:y;return(m);函数调用作为函函数调用作为函数的实参数的实参利用利用利用利用求两个数的最大数函数求两个数的最大数函数求两个数的最大数函数求两个数的最大数函数maxmax()(),求得三个数的最大数。,求得三个数的最大数。,求得三个数的最大数。,求得三个数的最大数。例例 6-76-76.3.36.3.3函数调用函数调用函数调用函数调用l l注意注意注意注意函数调用时,实参和形参按照在参数表中的
16、位置对应传值。例例例例6-86-8 编写输出n个连续的任意字符的函数p_string(),并调用该函数输出一个5行的“*”三角形图案#include#includeintmain()intmain()voidp_string(int,char);voidp_string(int,char);intk;intk;for(k=1;k=5;k+)for(k=1;k=5;k+)p_string(p_string(k,*k,*);putchar(n);putchar(n);return0;return0;voidvoidp_string(p_string(intn,charchintn,charch)i
17、nti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)putchar(ch);putchar(ch);return;return;按按按按位置对应位置对应位置对应位置对应 传送传送传送传送 6.46.4函数嵌套和递归函数函数嵌套和递归函数函数嵌套和递归函数函数嵌套和递归函数l l6.4.1 6.4.1 函数嵌套函数嵌套l l6.4.2 6.4.2 递归函数递归函数 6.4.1函数嵌套函数嵌套函数嵌套函数嵌套是在一个用户函数的函数体中,出现另外用户函数的调用。如函数a调用函数b,函数b又调用函数c等。6.4.16.4.1函数嵌套函数嵌套函数嵌套函数嵌套#includevo
18、id p_star(int);void p_all(int);int main()p_all(5);return 0;void p_star(int n)void p_star(int n)int i;for(i=1;i=n;i+)putchar(*);void void p_all(int m)p_all(int m)int i;for(i=1;i=m;i+)p_star(ip_star(i););putchar(n);在一行上连续输出n个*字符 输出m行*三角形图案 函数嵌套调用函数调用,main()是主调函数函数嵌套示例程序输出*图案例例例例6-96-9函函数数嵌嵌套套是在一个用户函数的
19、函数体中,出现另外用户函数的调用。*6.4.16.4.1函数嵌套函数嵌套函数嵌套函数嵌套l函数嵌套调用图示函数嵌套调用图示main()函数调用p_all()函数p_all()函数调用p_star()函数p_star()函数main()main()函数函数函数函数调用调用调用调用p_all()p_all()函数函数函数函数p_all()p_all()函数函数函数函数调用调用调用调用p_star()p_star()函数函数函数函数p_star()p_star()函数函数函数函数共被调用了5次 6.4.2递归函数递归函数递归函数递归函数是由递归定义产生的,若在是由递归定义产生的,若在定义一个函数的过
20、程中直接或间接地定义一个函数的过程中直接或间接地调用了被定义的函数本身,那么这种调用了被定义的函数本身,那么这种定义就是递归定义,所定义的函数称定义就是递归定义,所定义的函数称为递归函数为递归函数。C C C C语言程序设计语言程序设计语言程序设计语言程序设计-理论、方法与实践(第理论、方法与实践(第理论、方法与实践(第理论、方法与实践(第2 2 2 2版)版)版)版)6.4.26.4.2递归函数递归函数递归函数递归函数公式递归问题。能够使用一个递归公式描述的问题归类为公式递归问题。非公式递归问题。有的问题不能直接用一个递归公式进行描述,但可以用递归方法进行描述,我们将其归类为非公式递归问题。
21、递归函数递归函数递归函数递归函数是由递归定义产生的,若在定义一个函数的过程中直接或间接地调用了被定义的函数本身,那么这种定义就是递归定义,所定义的函数称为递归函数。1什么是递归函数2分类讨论递归函数 6.4.26.4.2递归函数递归函数递归函数递归函数公式递归1能够使用一个递归公式描述的问题归类为公式递归问题。公式递归问题实现起来比较容易,只要给出了递归公式,就能直观地编写递归函数。求解公式递归问题归结为两个步骤 用递归公式描述问题。将递归公式函数化。6.4.26.4.2递归函数递归函数递归函数递归函数公式递归例例6-106-10pp用递归函数计算累加用递归函数计算累加用递归函数计算累加用递归
22、函数计算累加和和和和1+2+3+n1+2+3+n 用用用用递归公式描述问题递归公式描述问题递归公式描述问题递归公式描述问题 将递归公式函数将递归公式函数将递归公式函数将递归公式函数化化化化long long sum(int n)sum(int n)if(n if(n=1)=1)return(1 return(1););else else return(sum(n-1)+return(sum(n-1)+n);n);递归递归递归递归调用调用调用调用 6.4.26.4.2递归函数递归函数递归函数递归函数#include#includeint main()int main()long sum(int)
23、;long sum(int);int n;int n;printf(n=);printf(n=);scanf(%d,&n);scanf(%d,&n);printf(Sum=%ldn,sum(n);printf(Sum=%ldn,sum(n);return 0;return 0;long long sum(int n)sum(int n)if(n=1)if(n=1)return(1);return(1);else else returnreturn(sum(n-1)sum(n-1)+n);n);递归递归递归递归调用调用调用调用 6.4.26.4.2递归函数递归函数递归函数递归函数非公式递归2 2
24、p有的问题不能直接用一个递归公式进行描述,但可以用递归方法进行描述,将其归类为非公式递归问题。p汉诺塔问题有三个柱和n个大小各不相同的盘子,开始时,所有盘子以塔状叠放在柱A上,要求按一定规则,将柱A上的所有盘子移动到柱B上,柱C为移动缓冲住。移动规则:一次只能移动一个盘子。任何时候不能把盘子放在比它小的盘子的上面。6.4.26.4.2递归函数递归函数递归函数递归函数n n汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程若只有一个盘子若只有一个盘子若只有一个盘子若只有一个盘子,则直接从,则直接从,则直接从,则直接从 A A A A 移到移到移到移到 B B
25、 B B,问题结束;,问题结束;,问题结束;,问题结束;若有若有若有若有n n n n(n1n1n1n1)个盘子)个盘子)个盘子)个盘子,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:第一步:按照移动规则,把第一步:按照移动规则,把第一步:按照移动规则,把第一步:按照移动规则,把A A A A上面的上面的上面的上面的 n-1 n-1 n-1 n-1 个盘子,移到个盘子,移到个盘子,移到个盘子,移到C C C C。第二步:将第二步:将第二步:将第二步:将A A A A上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 53-第6章 函数程序设计-里应外合的函数 53 函数 程序设计 里应外合

限制150内