C语言程序设计函数程序设计.pptx
《C语言程序设计函数程序设计.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计函数程序设计.pptx(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序设计(第3版)张磊编著 清华大学出版社第6 6章 数组程序设计u6.1 函数概述 u6.2 自定义函数示例u6.3 函数定义及调用 u6.4 函数嵌套和递归函数u6.5 数组作为函数的参数u6.6 函数应用举例第1页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.1函数概述 C C语言程序的特点:函数化结构语言程序的特点:函数化结构 函数分类:系统函数、用户函数函数分类:系统函数、用户函数 系统函数:系统函数:printf()printf()、scanf()scanf()、sqrt()sqrt()等等 用户函数:用户函数:在程序中编写的函数在程序中编写的函数,又称,又称
2、自定义函数自定义函数。用户函数的特例:用户函数的特例:main()main()函数函数 如果在程序中经常需要某种处理,就可以编写一个函数,在需如果在程序中经常需要某种处理,就可以编写一个函数,在需要这种处理时,就调用该函数。要这种处理时,就调用该函数。示例示例计算a!+b!+c!第2页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.26.2自定义函数示例自定义函数示例例例6-16-1编程计算表达式a!+b!+c!的值。l程序结构只有main()函数的阶乘程序#includevoid main()int a,b,c,i;long t,sum;printf(Input a,b,c:)
3、;scanf(%d,%d,%d,&a,&b,&c);for(t=1,i=1;i=a;i+)t=t*i;sum=t;for(t=1,i=1;i=b;i+)t=t*i;sum+=t;for(t=1,i=1;i=c;i+)t=t*i;sum+=t;printf(SUM=%ldn,sum);l使用自定义函数的阶乘程序#include void main()long f(int n);int a,b,c,i;printf(Input a,b,c:);scanf(%d,%d,%d,&a,&b,&c);printf(SUM=%ldn,f(a)+f(b)+f(c);longf(intn)longf(intn)
4、/*/*计算阶乘的函数计算阶乘的函数*/longt;longt;inti;inti;for(t=1,i=1;i=n;i+)for(t=1,i=1;i=n;i+)t*=i;t*=i;return(t);return(t);求求n!n!函数函数调用函数调用函数f()f()求求c!c!第3页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3函数的定义及调用6.3.1 函数的定义6.3.2 函数值和return命令6.3.3 函数调用第4页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.1函数定义 函数定义的一般格式函数定义的一般格式函数类型函数类型 函数名函数名(形式
5、参数表形式参数表)函数体函数体 形式参数表的格式形式参数表的格式数据类型数据类型 变量变量1,1,数据类型数据类型 变量变量2,2,数据类型数据类型 变量变量n n函数的值函数的值的类型的类型第5页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社例例6-26-2 定义连续输出定义连续输出5050个个*字符的函数。字符的函数。voidp_star50(void)voidp_star50(void)inti;inti;for(i=1;i=50;i+)for(i=1;i=50;i+)putchar(*);putchar(*);6.3.1函数定义无形参无形参有形参有形参例例6-36-3 定义
6、连续输出定义连续输出n n个个*字符的函数。字符的函数。voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;iy?x:y;return(m);return(m);float max(float x,float y)if(xy)returnx;returnx;elsereturny;returny;第8页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.2函数值和return命令例例6-56-5int sum(int n)int s,i;for(s=0,i=1;i=n;i+)s+=i;return(s)
7、;第9页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用1 1函数原型和函数声明函数原型和函数声明 函数原型函数原型函数原型是是定义函数时函数体以外的那些内容。函数原型是是定义函数时函数体以外的那些内容。一般形式:一般形式:函数类型函数类型 函数名函数名(数据类型数据类型11形参形参1,1,类型类型22形参形参2,2,类型类型nn形参形参n)n)简化形式:简化形式:函数类型函数类型 函数名(数据类型函数名(数据类型1,1,数据类型数据类型2,2,数据类型数据类型n n)函数声明函数声明函数声明是在主调函数的函数体说明部分描述被调函数原型。函数声明是在主调函数的函数体
8、说明部分描述被调函数原型。函数调用函数调用函数调用是对已定义函数的具体应用。函数调用是对已定义函数的具体应用。一般形式:一般形式:函数名函数名(实参表实参表)第10页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用/*program e6-6.c*/#includevoid main()voidp_star50(void);voidp_star50(void);int k;for(k=1;k=20;k+)p_star50();p_star50();putchar(n);例例6-66-6 调用调用p_star50()p_star50()函数,连续输出函数,连续输出20
9、20行行*字符串,每行字符串,每行5050个个*字符。字符。voidp_star50(void)voidp_star50(void)int i;for(i=1;i=50;i+)putchar(*);return;函数原型及函数声明函数调用第11页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用/*programe6-7.c*/*programe6-7.c*/#include#includevoidmain()voidmain()voidp_star(intn);voidp_star(intn);intk;intk;for(k=1;k=5;k+)for(k=1;k=5
10、;k+)p_star(k);p_star(k);putchar(n);putchar(n);例例6-76-7 调用调用p_star()p_star()函数,输出函数,输出*字符图案。字符图案。*voidp_star(intn)voidp_star(intn)inti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)putchar(*);putchar(*);return;return;函数原型及函数原型及函数声明函数声明函数调用函数调用函数定义函数定义函数实参函数实参函数形参函数形参第12页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用例例6
11、-86-8 调用求和函数调用求和函数sum()sum(),计算表达式,计算表达式/*programe6-8.c*/*programe6-8.c*/#include#includevoidmain()voidmain()intsum(int);intsum(int);printf(%dn,printf(%dn,sum(20)+sum(50);sum(20)+sum(50);intsum(intn)intsum(intn)ints,i;ints,i;for(s=0,i=1;i=n;i+)for(s=0,i=1;i=n;i+)s+=i;s+=i;return(s);return(s);第13页/共4
12、2页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用n n函数调用的三种形式函数调用的三种形式 当被调用函数为当被调用函数为voidvoid类型时,函数无返回值,函数类型时,函数无返回值,函数调用是一个独立的语句。调用是一个独立的语句。当被调用函数有返回值时,函数调用出现在表达式当被调用函数有返回值时,函数调用出现在表达式中,是表达式的一部分。中,是表达式的一部分。函数调用也可以作为一个函数的实参。函数调用也可以作为一个函数的实参。例例6-96-9 利用求两个数的最大数函数利用求两个数的最大数函数max()max(),求得三个数的最,求得三个数的最大数。大数。#include
13、void main()float max(float,float);float a,b,c;printf(a,b,c:);scanf(%f,%f,%f,&a,&b,&c);printf(Max=%fn,max(max(max(a,b)max(a,b),c);,c);float max(float x,float y)float m;m=xy?x:y;return(m);函数调用作为函数调用作为函数的实参函数的实参第14页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.3.3函数调用 注意注意函数调用时,实参和形参按照在参数表中的位置对应传值。例例6-106-10 编写输出n个连续
14、的任意字符的函数p_string(),并调用该函数输出一个5行的“*”三角形图案#include#includevoidmain()voidmain()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);voidvoidp_string(p_string(intn,charchintn,charch)inti;inti;for(i=1;i=n;i+)for(i=1;i=n;i+)p
15、utchar(ch);putchar(ch);return;return;按位置按位置对应对应 传送传送第15页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4函数嵌套和递归函数 6.4.1 6.4.1 函数嵌套函数嵌套 6.4.2 6.4.2 递归函数递归函数第16页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.1函数嵌套 函数嵌套是指在一个用户函数的函数体中,又出现了另外用函数嵌套是指在一个用户函数的函数体中,又出现了另外用户函数的调用。如函数户函数的调用。如函数a a调用函数调用函数b b,函数,函数b b又调用函数又调用函数c c等。等。#inclu
16、devoid main()long fac(int);long cmn(int,int);int m,n;printf(m,n=);scanf(%d,%d,&m,&n);printf(C(%d,%d)=%ldn,m,n,cmn(m,n)cmn(m,n);long fac(int k)/*定义求k!的函数*/int i;long t;for(i=1,t=1;i1n1时,其值为时,其值为sum(n-1)+nsum(n-1)+n。由此,定义递归函数:。由此,定义递归函数:longsum(intn)longsum(intn)if(n=1)if(n=1)return(1);return(1);elsee
17、lsereturn(sum(n-1)+n);return(sum(n-1)+n);第20页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社 6.4.2递归函数n n计算计算sum(3)sum(3)的处理过程的处理过程 高到低进行递推描述。高到低进行递推描述。调用调用sum(3)sum(3),将其描述为,将其描述为sum(2)+3sum(2)+3;调用调用sum(2)sum(2),将其描述为,将其描述为sum(1)+2sum(1)+2;调用调用sum(1)sum(1),问题已到最低层,有确定值:,问题已到最低层,有确定值:sum(1)=1sum(1)=1;由低到高逐级求得上层结果由低到
18、高逐级求得上层结果。由由sum(1)+2sum(1)+2求得求得sum(2)sum(2);由由sum(2)+3sum(2)+3求得求得sum(3)sum(3);完整程序代码完整程序代码完整程序代码完整程序代码#include#includevoid main()void main()long sum(int);long sum(int);int n;int n;printf(n=);printf(n=);scanf(%d,&n);scanf(%d,&n);printf(Sum=%dn,sum(n);printf(Sum=%dn,sum(n);long sum(int n)long sum(in
19、t n)if(n=1)if(n=1)return(1);return(1);else else return(sum(n-1)+n);return(sum(n-1)+n);第21页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.2递归函数2非公式递归问题有的问题不能直接用一个递归公式进行描述,但可以用递归方法进行描述,我们将其归类为非公式递归问题。例例例例6-146-146-146-14 汉诺塔问题。有三个柱和n个大小各不相同的盘子,开始时,所有盘子以塔状叠放在柱A上,要求按一定规则,将柱A上的所有盘子移动到柱B上,柱C为移动缓冲住。移动规则:一次只能移动一个盘子。任何时候不
20、能把盘子放在比它小的盘子的上面。第22页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.4.2递归函数n n汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程汉诺塔问题递归实现过程若只有一个盘子若只有一个盘子若只有一个盘子若只有一个盘子,则直接从,则直接从,则直接从,则直接从 A A A A 移到移到移到移到 B B B B,问题结束;,问题结束;,问题结束;,问题结束;若有若有若有若有n n n n(n1n1n1n1)个盘子)个盘子)个盘子)个盘子,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:,则须经过如下三个步骤:第一步:按照移动规则
21、,把第一步:按照移动规则,把第一步:按照移动规则,把第一步:按照移动规则,把A A A A上面的上面的上面的上面的 n-1 n-1 n-1 n-1 个盘子,移到个盘子,移到个盘子,移到个盘子,移到C C C C。第二步:将第二步:将第二步:将第二步:将A A A A上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱上仅有的一只盘子(也就是最大的一只)直接移到柱B B B B上。上。上。上。第三步:用第一步所述方法,将第三步:用第一步所述方法,将第三步:用第一步所述方法,将第三步:用第一步所述方法,将C C
22、C C柱上的柱上的柱上的柱上的n-1n-1n-1n-1个盘子移到个盘子移到个盘子移到个盘子移到B B B B柱上。与第一柱上。与第一柱上。与第一柱上。与第一步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。步一样,这一步实际上是由一系列更小的一次仅移一个盘子的操作组成。BA汉诺塔问题的递归算法:汉诺塔问题的递归算法:汉诺塔问题的递归算法:汉诺塔问题的递归算法:hanoi(nhanoi(nhanoi(nhanoi(n个盘个盘个盘个盘,AB,AB,AB,AB
23、,缓柱缓柱缓柱缓柱C)C)C)C)if(n=1)if(n=1)if(n=1)if(n=1)直接从直接从直接从直接从A A A A移到移到移到移到B B B B else else else else hanoi(n-1 hanoi(n-1 hanoi(n-1 hanoi(n-1个盘个盘个盘个盘,AC,AC,AC,AC,缓柱缓柱缓柱缓柱B)B)B)B)移动移动移动移动n n n n号盘子:号盘子:号盘子:号盘子:ABABABAB hanoi(n-1 hanoi(n-1 hanoi(n-1 hanoi(n-1个盘个盘个盘个盘,CB,CB,CB,CB,缓柱缓柱缓柱缓柱A)A)A)A)#include
24、#include void main()void main()int disks;int disks;void hanoi(int,char,char,char);void hanoi(int,char,char,char);printf(Number of disks:);printf(Number of disks:);scanf(%d,&disks);scanf(%d,&disks);printf(n);printf(n);hanoi(disks,A,B,C);hanoi(disks,A,B,C);void hanoi(int n,char A,char B,char void hano
25、i(int n,char A,char B,char C)C)if(n=1)if(n=1)printf(%c-%c ,A,B);printf(%c-%c ,A,B);return;return;elseelse hanoi(n-1,A,C,B);hanoi(n-1,A,C,B);printf(%c-%c ,A,B);printf(%c-%c ,A,B);hanoi(n-1,C,B,A);hanoi(n-1,C,B,A);BA第23页/共42页C语言程序设计(第3版)张磊编著 清华大学出版社6.5数组作为函数的参数 6.5.1 6.5.1 数组元素作为函数参数数组元素作为函数参数 6.5.2 6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 函数 程序设计
限制150内