C语言程序设计函数刘课件.ppt

上传人(卖家):三亚风情 文档编号:2862678 上传时间:2022-06-05 格式:PPT 页数:95 大小:1.73MB
下载 相关 举报
C语言程序设计函数刘课件.ppt_第1页
第1页 / 共95页
C语言程序设计函数刘课件.ppt_第2页
第2页 / 共95页
C语言程序设计函数刘课件.ppt_第3页
第3页 / 共95页
C语言程序设计函数刘课件.ppt_第4页
第4页 / 共95页
C语言程序设计函数刘课件.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

1、C C语言程序设计语言程序设计2第四章第四章 函数函数4.14.1库函数库函数4.24.2自定义函数自定义函数4.34.3函数的参数传递与返回值函数的参数传递与返回值4.44.4递归函数递归函数4.54.5局部变量、全局变量与变量作用域局部变量、全局变量与变量作用域4.64.6函数综合应用函数综合应用3学习目标:学习目标: 理解函数在程序设计中的作用和地位理解函数在程序设计中的作用和地位 掌握函数的定义、原型声明和调用方法掌握函数的定义、原型声明和调用方法 熟练掌握函数的参数传递与返回值熟练掌握函数的参数传递与返回值 理解局部变量、全局变量、静态变量和变量的作用域理解局部变量、全局变量、静态变

2、量和变量的作用域 掌握递归函数的编写技术掌握递归函数的编写技术 理解和掌握结构设计和模块化程序设计方法理解和掌握结构设计和模块化程序设计方法 了解地址和指针的概念,了解地址做函数参数的特点和作了解地址和指针的概念,了解地址做函数参数的特点和作用用4问题:问题:如果程序的功能比较多,规模比较大,把所有代码都写如果程序的功能比较多,规模比较大,把所有代码都写在在mainmain函数中,就会使主函数变得庞杂、头绪不清,阅函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难读和维护变得困难有时程序中要多次实现某一功能,就需要多次重复编写有时程序中要多次实现某一功能,就需要多次重复编写实现此功能的

3、程序代码实现此功能的程序代码,这使程序冗长,不精炼这使程序冗长,不精炼5解决的方法:用解决的方法:用模块化程序设计的思路模块化程序设计的思路 采用采用“组装组装”的办法简化程序设计的过程的办法简化程序设计的过程 可以使用库函数可以使用库函数:事先编好一批实现各种不同功能的函数事先编好一批实现各种不同功能的函数,把它们把它们保存在函数库中保存在函数库中,需要时需要时直接用直接用 可以使用自己编写的函数:可以使用自己编写的函数:在设计一个较大的程序时,往往把它分在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实为若干个程序模块,每一个模块包括一个或多个函数

4、,每个函数实现一个特定的功能现一个特定的功能,函数的名字应反映其代表的功能函数的名字应反映其代表的功能 程序可由一个主函数和若干个其他函数构成程序可由一个主函数和若干个其他函数构成,主函数调用其他函主函数调用其他函数,其他函数也可以互相调用数,其他函数也可以互相调用,同一个函数可以被一个或多个函数同一个函数可以被一个或多个函数调用任意多次调用任意多次 在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,在程序设计中要善于利用函数,可以减少重复编写程序段的工作量,同时可以方便地实现模块化的程序设计同时可以方便地实现模块化的程序设计67导例:平方根表导例:平方根表1 1问题描述问题描述 输

5、出输出100100以内整数的平方根表,要求每行输出以内整数的平方根表,要求每行输出1010个。个。2 2问题分析问题分析C C 语言提供了一个库函数语言提供了一个库函数sqrt( ),使用时直接调用该,使用时直接调用该库函数就可以计算出平方根值。库函数就可以计算出平方根值。83 3算法描述算法描述(1 1)定义两个整型变量)定义两个整型变量m m,n n。(2 2)输出平方根表时,要注意格式。首先输出表头,输出)输出平方根表时,要注意格式。首先输出表头,输出0 09 9的整数。的整数。(3 3)然后按照格式要求输出平方根表,)然后按照格式要求输出平方根表,m m为行数为行数0 09 9,n n

6、为列为列数数0 09 9,则表内对应第,则表内对应第m m行第行第n n列的表值为列的表值为sqrt(msqrt(m* *10+n)10+n),每行每行1010个。个。91 11 110#include #include /数学类头文件数学类头文件int main() int m,n;for (n=0;n10;n+) printf(%7d, n); /输出表头输出表头 printf(n);for(m=0;m10;m+) printf(%d,m); for (n=0;n10;n+)printf(%7.4f ,sqrt(m*10+n); /调用库函数调用库函数sqrt()printf(n); 4

7、4程序实现程序实现 return 0; 116.6.程序分析程序分析 库函数库函数sqrtsqrt()()原型放在文件原型放在文件math.hmath.h文件中,所在若在程序文件中,所在若在程序中使用该函数,就需要在程序头加上语句中使用该函数,就需要在程序头加上语句#include #include 。 程序中语句段程序中语句段for (n=0;n10;n+) for (n=0;n10;n+) 是输出表头,输出列号是输出表头,输出列号:0 09 9;表头表示出;表头表示出0-90-9列的列号。列的列号。 用输出函数用输出函数printfprintf(“%7.4f”)(“%7.4f”)控制输出的

8、值为保留控制输出的值为保留4 4位小位小数的实数。数的实数。124.1.3库函数使用方法库函数使用方法库函数的定义已经在库函数的定义已经在C语言提供的标准函数库中,所以调用时语言提供的标准函数库中,所以调用时,需要在程序的前面利用编译预处理命令,需要在程序的前面利用编译预处理命令include将相应的函将相应的函数原型加入到程序中。数原型加入到程序中。#include指令的一般形式如下:指令的一般形式如下: #include 或或 #include“文件名文件名”例如:例如: #include13144.1.44.1.4常用的库函数常用的库函数常用的函数头文件,各自包含的函数类别如下:常用的函

9、数头文件,各自包含的函数类别如下:math.h: 包含与数学相关的函数包含与数学相关的函数 ctype.h:包含与字符处理有关的函数包含与字符处理有关的函数string.h:包含与字符串处理有关的函数包含与字符串处理有关的函数stdio.h : 包含与输入输出有关的函数包含与输入输出有关的函数stdlib.h : 包含与动态分配存储空间和数值转换有关的函数包含与动态分配存储空间和数值转换有关的函数 process.h:包含与过包含与过程程控制有关的函数控制有关的函数154.24.2自定义函数自定义函数4.2.14.2.1导例:阶乘累加和导例:阶乘累加和4.2.24.2.2导例:三色球问题导例:

10、三色球问题4.2.34.2.3函数的定义、声明和调用函数的定义、声明和调用4.2.44.2.4函数调用过程分析函数调用过程分析16导例:计算圆柱体积导例:计算圆柱体积 输入圆柱输入圆柱体体的高和半径,求圆柱的高和半径,求圆柱体体积积,volume=*r2*h。要求定义和调用函数要求定义和调用函数cylinder (r, h )计计算圆柱算圆柱体体的的体体积。积。 17/ /* * 计计算圆柱算圆柱体体积积 * */ /#include int main( void ) double height, radius, volume;double cylinder (double r, double

11、 h); /* 函数声明函数声明*/printf (Enter radius and height: );scanf (%lf%lf, &radius, &height); /* 调用函数,返回值赋给调用函数,返回值赋给volume */volume = cylinder (radius, height );printf (Volume = %.3fn, volume);return 0;18/* 定义求圆柱定义求圆柱体体积的函数积的函数 */double cylinder (double r, double h)double result;result =3.1415926 * r * r

12、* h; /* 计计算算体体积积 */return result; /* 返回结果返回结果 */ Enter radius and height: 3.0 10Volume = 282.74319#include int main( void ) double height, radius, volume;double cylinder (double r, double h); /* 函数声明函数声明*/printf (Enter radius and height: );scanf (%lf%lf, &radius, &height);volume = cylinder (radius,

13、height );printf (Volume = %.3fn, volume);return 0;double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; return result;Enter radius and height: 3.0 10Volume = 282.743问题: 函数是如何运行的?204.2.14.2.1导例:阶乘累加和导例:阶乘累加和1 1问题描述问题描述 从键盘输入从键盘输入1 1个整数,计算个整数,计算1 1n n的各个数的阶乘的的各个数的阶乘的累加和,即累加

14、和,即1+21+2!+3+3!+n!+n!。2 2问题分析问题分析 实现各个数的阶乘的累加和,需要先计算每个数的实现各个数的阶乘的累加和,需要先计算每个数的阶乘,然后累加到一起。阶乘,然后累加到一起。21sum=0; for ( i = 1; i = n; i+ ) item =i!; sum=sum+item; 可用一个函数可用一个函数factorial()factorial()专门来专门来计计算每个数的阶乘,然后算每个数的阶乘,然后用一个循环用一个循环语语句来句来计计算算1 1n n的各个阶乘的累加的结果。的各个阶乘的累加的结果。224 4程序实现程序实现#include double f

15、actorial (int i); /函数声明函数声明int main(void) int i, n; double sum=0; printf(“Enter 1 integers:”); scanf(%d,&n); for(i = 1; i =n; i+ ) sum = sum + factorial (i); /函数调用函数调用 printf(1!+%d! = %.0fn, n,sum); return 0;double factorial (int i) /函数定义函数定义 int j; double result = 1; for (j = 1; j= i;j+) result = r

16、esult *j ; return result ; /返回结果返回结果23一、函数的定义一、函数的定义函数定义的基本形式是:函数定义的基本形式是:函数类型函数类型 函数名(形参表)函数名(形参表) / /* *函数头,没有分号函数头,没有分号* */ / 函数实现过程函数实现过程 / /* *函数体函数体* */ / 形参表形参表 给出函数所有形参的名称和类型,它的格式为:给出函数所有形参的名称和类型,它的格式为: 类型类型1 1 形参形参1 1,类型,类型2 2 形参形参2 2,类型类型n n 形参形参n n4.2.34.2.3函数的定义、声明和调用函数的定义、声明和调用24函数类型函数类

17、型 函数名(形参表)函数名(形参表)/ /* * 函数首部函数首部 * */ / / /* * 函数函数体体 * */ / 函数实现过函数实现过程程 return 表达式;表达式; 把函数运算的结果回送给主函数把函数运算的结果回送给主函数只能返回一个值只能返回一个值函数返回值的类型函数返回值的类型没有分号没有分号double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result;25double cylinder (double r, double h) /* 函数首

18、部函数首部 */* 函数函数体体,写在一对大括号内,写在一对大括号内 */ double result;result =3.1415926 * r * r * h; /* 计计算圆柱算圆柱体体积积 */return result; /* 返回运算结果返回运算结果*/1 1、分析函数的定义、分析函数的定义函数类型函数类型函数名函数名形参表形参表与函数类型一致与函数类型一致26形参形参类型类型1 1 参数参数1 1 ,类型,类型2 2 参数参数2 2 ,类型,类型n n 参数参数n n参数之间用逗号分隔,每个参数前面的类型都必须分别写明参数之间用逗号分隔,每个参数前面的类型都必须分别写明函数类型函

19、数类型 函数名(形参表)函数名(形参表) 函数实现过函数实现过程程 return 表达式;表达式;不能写成不能写成 double r, hdouble cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result;27double factorial (int i) /函数定义函数定义 int j;double result = 1; for (j = 1; j=d2) return d1; else return d2; 282.2.函数原型声明函数原型声明函数类型函数类型

20、函数名函数名( (形参表形参表) );double cylinder (double r, double h); double factorial (int n);void pyramid (int n); 函数必须先定义后调用,将主调函数放在被调函数的后面,函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。就像变量先定义后使用一样。 如果自定义函数在主调函数的后面,就需要在函数调用前,如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。加上函数原型声明。 函数声明:说明函数的类型和参数的情况,以保证程序编函数声明:说明函数的类型和参数的情况,以保

21、证程序编译时能判断对该函数的调用是否正确。译时能判断对该函数的调用是否正确。只写函数定义中的第只写函数定义中的第1 1行(函数首部),并以分号结束。行(函数首部),并以分号结束。292、函数的声明 函数类型函数类型 函数名(形参表);函数名(形参表); /以分号结束以分号结束 double factorial (int n); void ball(int x);303 3、函数的调用、函数的调用l 定义一个函数后,就可以通过定义一个函数后,就可以通过程序程序来调用这个函数。来调用这个函数。l 调用标准库函数时,在调用标准库函数时,在程序程序的最前面用的最前面用#include#include命

22、命令包含相应的头文件。令包含相应的头文件。l 调用自定义函数时,调用自定义函数时,程序程序中必须有与调用函数相对中必须有与调用函数相对应的函数定义。应的函数定义。31函数调用的一般形式为:函数调用的一般形式为: 函数名(实际参数表)函数名(实际参数表); factorial ( i );实际参数与形式参数的数据类型和个数一一对应,以分号结束实际参数与形式参数的数据类型和个数一一对应,以分号结束函数调用的形式函数调用的形式32for(i = 1; i =n; i+ ) sum = sum + factorial (i); /函数调用函数调用 函数的调用函数的调用double factorial

23、(int i) /函数定义函数定义 int j;double result = 1; for (j = 1; j= i;j+)result = result *j ; return result ; /返回结果返回结果33例例 求两个数中的最大值求两个数中的最大值#include void main( ) int a,b,c,max(int x, int y); scanf(“%d,%d”,&a,&b); c=max(a, b); printf(“Max is %d”,c);int max(int x, int y) int z; if(xy)z=x; else z=y; return(z);

24、 形参形参实参实参定义函数时,形参定义函数时,形参调用函数时,实参调用函数时,实参 函数的调用函数的调用34函数调用的形式函数调用的形式 对于实现对于实现计计算功能的函数,函数调用通常出现在两算功能的函数,函数调用通常出现在两种情况:种情况:赋值赋值语语句句volume = cylinder(radius, height );输出函数的实参输出函数的实参printf(“%f”, cylinder(radius, height ) );35函数调用的过程函数调用的过程计计算机在执行算机在执行程序程序时,从主函数时,从主函数mainmain开始执行,开始执行,如果遇到某个函数调用,主函数被暂停执行

25、,转如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数,然后再从原先暂停的位置继续执行。函数遇函数遇returnreturn返回主函数返回主函数36分析函数调用的过程分析函数调用的过程#include int main( void ) double height, radius, volume;double cylinder (double r, double h); printf (Enter radius and height: );scanf (%lf%lf, &radi

26、us, &height);volume = cylinder (radius, height );printf (Volume = %.3fn, volume);return 0; double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; return result; 调用调用函数函数实参实参形参形参执行函数中的语句执行函数中的语句返回调用它的地方返回调用它的地方37参数传递参数传递函数函数定义定义时的参数被称为时的参数被称为形式参数形式参数(简称(简称形参形参)double cylind

27、er (double r, double h);函数函数调用调用时的参数被称为时的参数被称为实际参数实际参数(简称(简称实参实参)volume = cylinder (radius, height);参数传递:参数传递:实参实参形参形参在参数传递过在参数传递过程程中,实参把值复制给形参。中,实参把值复制给形参。形参和实参形参和实参一一对应一一对应:数量一致,类型一致,顺:数量一致,类型一致,顺序序一致一致形参形参:变量,用于接受实参传递过来的值:变量,用于接受实参传递过来的值实参实参:常量、变量或表达式:常量、变量或表达式单向传递单向传递38函数结果返回函数结果返回完成确定的运算,将运算结果返

28、回给主调函数。完成确定的运算,将运算结果返回给主调函数。函数结果返回的形式:函数结果返回的形式:return return 表达式;表达式;return (return (表达式表达式) );39在执行函数调用时,实参把值计算出来,拷贝 给相应位置的形参;函数执行完后,通过 return( ),可返回一个结果值。 实参与形参实参与形参 有多个实参时有多个实参时 形参的改变形参的改变个数相同、类型一致个数相同、类型一致 后面的先后面的先计计算算 不影响实参不影响实参 变量的值变量的值 只能返回一个结果,只能返回一个结果, 类型与函数定义时一致类型与函数定义时一致 要调用函数,要调用函数,必须先要

29、声明!必须先要声明!小结:小结:404.3 4.3 函数的参数传递与返回值函数的参数传递与返回值4.3.14.3.1导例:爬动的蠕虫导例:爬动的蠕虫4.3.24.3.2导例:日导例:日K K蜡烛图蜡烛图4.3.34.3.3函数的参数传递函数的参数传递4.3.44.3.4函数的返回值函数的返回值41从函数是否有参数和返回值的角度,可以将函数分为从函数是否有参数和返回值的角度,可以将函数分为: :有参数有返回值函数有参数有返回值函数有参数无返回值函数有参数无返回值函数 无参数有返回值函数无参数有返回值函数无参数无返回值函数无参数无返回值函数42导例:判断素数的函数导例:判断素数的函数求求10010

30、0以内的全部素数,每行输出以内的全部素数,每行输出1010个。素数就是只能被个。素数就是只能被1 1和自身整除的正整数,和自身整除的正整数,1 1不是素数,不是素数,2 2是素数。是素数。要求定义和调用函数要求定义和调用函数prime (m)prime (m)判断判断m m是否为素数,当是否为素数,当m m为为素数时返回素数时返回1 1,否则返回,否则返回0 0。 算法描述:算法描述:对对2 2100100之间的每个数进行判断,若是素数,之间的每个数进行判断,若是素数,则输出该数。则输出该数。for(m = 2; m = 100; m+) if (m是素数是素数) printf(%d , m)

31、; prime(m) != 0有参数有返回值函数有参数有返回值函数43例5-4 源程序#include #include int main(void) int count, m; int prime (int m); count = 0; for(m = 2; m = 100; m+) if ( prime(m) != 0 ) printf(%6d, m ); count+; if (count %10 = 0) printf (n); printf (n);int prime (int m) int i, n; if ( m = 1 ) return 0; n = sqrt (m); for

32、( i = 2; i = n; i+) if (m % i = 0) return 0; return 1; 44输出输出5 5之内的数字金字塔。之内的数字金字塔。/* 输出数字金字塔输出数字金字塔 */#include int main (void) void pyramid (int n);/* 函数声明函数声明 */pyramid(5);/* 调用函数,输出数字金字塔调用函数,输出数字金字塔 */return 0;void pyramid (int n) /* 函数定义函数定义 */int i, j;for (i = 1; i = n; i+)/* 需要输出的行数需要输出的行数 */ f

33、or (j = 1; j = n-i; j+) /* 输出每行左边的空格输出每行左边的空格 */printf( ); for (j = 1; j = i; j+) /* 输出每行的数字输出每行的数字 */ printf( %d , i); /* 每个数字的前后各有一个空格每个数字的前后各有一个空格 */ putchar (n); 1 2 2 3 3 3 4 4 4 45 5 5 5 5 for (i = 1; i = n; i+) for (j = 1; j = n-i; j+) printf(“ ”); 一行中的数字显示有参数无返回值函数有参数无返回值函数 for (i = 1; i = n

34、; i+) 一行的处理 一行中的空格处理; 一行中的数字显示45不返回运算结果的函数定义voidvoid 函数名(参数表)函数名(参数表) / /* * 函数首部函数首部 * */ / / /* * 函数函数体体 * */ / 函数实现过函数实现过程程 returnreturn; / /* * 可以省略可以省略return return * */ / 这类函数通常用于屏幕输出等这类函数通常用于屏幕输出等表示不返回结果表示不返回结果不能省略不能省略, 否则否则函数类型被默认定义为函数类型被默认定义为int46#include int main (void) int in( ); int n;/*

35、 函数声明函数声明 */n=in(); /* 函数调用函数调用 */ printf(“%d”,n);return 0;int in( ) int x; scanf(“%d”,&x); return x;无参数有返回值函数无参数有返回值函数47函数没有返回值函数没有返回值在声明函数的时候,函数名前使用了保留字在声明函数的时候,函数名前使用了保留字voidvoid。用函数调用语句调用。用函数调用语句调用。#include #include void main( )void main( ) void printstar( ); / void printstar( ); /* *函数声明函数声明* *

36、/ / void print_message( ); / void print_message( ); /* *函数声明函数声明* */ / printstar( ); printstar( ); print_message( ); print_message( ); printstar( ); printstar( ); void printstar( )void printstar( ) printf(“ printf(“* * * * * * * * * *n”);n”); void print_message( )void print_message( ) printf(“ How d

37、o you do!n”); printf(“ How do you do!n”); 输出:输出:* * * * * * * * * * * * * * * * * * How do you do!How do you do!* * * * * * * * * * * * * * * * * *无参数无返回值函数无参数无返回值函数484.3.34.3.3函数的参数传递函数的参数传递在调用函数时,实参与形参结合的具在调用函数时,实参与形参结合的具体体过过程程是:是: 计计算实参表达式的值;算实参表达式的值; 将实参的值按赋值转换规则转换成对应形参的数据类型;将实参的值按赋值转换规则转换成对应形参的

38、数据类型; 为形参分配存储空间;为形参分配存储空间; 将类型转换后的实参的值传递给对应的形参变量,然后执将类型转换后的实参的值传递给对应的形参变量,然后执行函数。行函数。49 C C语言语言中,函数的参数传递有两种方式,即传值和传地址。中,函数的参数传递有两种方式,即传值和传地址。 传值传值:简单地将实参的值复制一份给形参,一旦复制完成,:简单地将实参的值复制一份给形参,一旦复制完成,实参与其对应的形参便没有任何关系,这时在函数内对形实参与其对应的形参便没有任何关系,这时在函数内对形参的任何改变都不会影响到实参。参的任何改变都不会影响到实参。 传地址传地址:将实参地址传递给形参,在函数内对形参

39、所对应数:将实参地址传递给形参,在函数内对形参所对应数据的处理实际上就是处理对应的实参。简单地理解就是此据的处理实际上就是处理对应的实参。简单地理解就是此时实参和形参同一的,对形参的处理就是对对应的实参的时实参和形参同一的,对形参的处理就是对对应的实参的处理。处理。 C C语言语言中,当函数的参数为指针类型或数组类型时中,当函数的参数为指针类型或数组类型时 采用传地采用传地址的方式,其他类型采用传值方式。址的方式,其他类型采用传值方式。504.3.44.3.4函数的返回值函数的返回值 函数的调用本质上是一个表达式,它将返回特定类型数据的函数的调用本质上是一个表达式,它将返回特定类型数据的值(即

40、返回值),因此只要该值能出现的位置,都可以使值(即返回值),因此只要该值能出现的位置,都可以使用该函数调用表达式。用该函数调用表达式。从函数返回值的类型看,有两种类型:从函数返回值的类型看,有两种类型:是完成确定的运算,并由运算结果返回给主调函数,称为是完成确定的运算,并由运算结果返回给主调函数,称为有有返回值的函数返回值的函数;函数类型用返回值类型指定。;函数类型用返回值类型指定。是完成指定的工作,没有确定的运算结果需返回给主调函数是完成指定的工作,没有确定的运算结果需返回给主调函数,称为,称为无返回值的函数无返回值的函数。函数类型用。函数类型用voidvoid指定。指定。511 1、有返回

41、值函数、有返回值函数有返回值函数在函数定义时必须说明返回值有返回值函数在函数定义时必须说明返回值的类型,在函数的类型,在函数体体中由中由returnreturn语语句给出具句给出具体体的返回值。的返回值。有返回值有返回值returnreturn语语句的一般形式如下:句的一般形式如下: return return 表达式;表达式; 或或 return return (表达式);(表达式); 先求解表达式的值,再返回其值。通常表达式的结果类型先求解表达式的值,再返回其值。通常表达式的结果类型与函数的返回值类型一致与函数的返回值类型一致 returnreturn语语句的作用有两个:一是结束函数的运行

42、;二是带句的作用有两个:一是结束函数的运行;二是带着运算结果(表达式的值)返回主调函数。着运算结果(表达式的值)返回主调函数。52函数有返回值:函数有返回值:函数执行完毕后,返回一个相应类型的数值。函数执行完毕后,返回一个相应类型的数值。用用returnreturn语句返回该值:语句返回该值:return return 表达式;表达式;用函数调用表达式调用。用函数调用表达式调用。如:如:printf(“The average is %6.2f”, average(dataArray, n);ave= average(dataArray, n);532 2、无返回值函数、无返回值函数 无返回值函

43、数只完成某种特定的处理,函数执行后无须向调无返回值函数只完成某种特定的处理,函数执行后无须向调用者返回用者返回计计算结果。算结果。 无返回值函数在函数定义时必须将返回值的类型说明为无返回值函数在函数定义时必须将返回值的类型说明为voidvoid(即空类型),函数(即空类型),函数体体中的中的returnreturn语语句只结束函数的执行句只结束函数的执行。如果函数类型为。如果函数类型为voidvoid,则函数返回直接用,则函数返回直接用returnreturn语语句,句,不必跟上一个表达式。不必跟上一个表达式。 无返回值无返回值returnreturn语语句的一般形式如下:句的一般形式如下:

44、return ; return ; 在函数定义中也可以没有在函数定义中也可以没有returnreturn语语句,此时函数执行到最后句,此时函数执行到最后一条一条语语句。句。544.44.4递归函数递归函数4.4.14.4.1导例:假币问题(三分法)导例:假币问题(三分法)4.4.24.4.2导例:导例:FibonacciFibonacci数列数列4.4.34.4.3递归函数的执行过程递归函数的执行过程4.4.44.4.4递归函数的效率分析递归函数的效率分析554.4.24.4.2导例:导例:FibonacciFibonacci数列数列1 1问题描述问题描述从键盘输入一个整数从键盘输入一个整数n

45、 n,输出斐波那契数列(,输出斐波那契数列(fibonaccifibonacci)的前)的前n n项。要求每行打印项。要求每行打印1010个数后换行。个数后换行。2 2问题分析问题分析斐波那契数列为斐波那契数列为1 1,1 1,2 2,3 3,5 5,8 8,1313即从第三项开始,即从第三项开始,各项值都等于前两项值之和。斐波那契数列的定义为各项值都等于前两项值之和。斐波那契数列的定义为: : 1 n=0 1 n=0f(n)= 1 n=1f(n)= 1 n=1 f(n-1)+f(n-2) n1 f(n-1)+f(n-2) n156采用非递归方法,程序片段如下:采用非递归方法,程序片段如下:

46、first=1,second=1; scanf(%d,&n); for(i=0; in;i+) result=first+second; printf(%.0f,result); first=second; second=result; 57#include int fib(int k);main() int n,i,count=0; printf(Enter 1 integersn:); scanf(%d,&n); for(i=0;i1n1 fact(n)=n fact(n)=n* *fact(n-1) fact(n-1) 递归公式递归公式 60实现阶乘递归算法的递归函数实现阶乘递归算法的递

47、归函数 long fact(int n) if (n=0) return 1;else return n* fact(n-1); 61y=fact(3) 3*fact(2)2*fact(1)1*fact(0)111*112*123*26 递归函数的调用过程递归函数的调用过程 62递归程序的内部执行过程递归程序的内部执行过程函数的递归调用类似于多个函数的嵌套调用,只不过调用函数函数的递归调用类似于多个函数的嵌套调用,只不过调用函数和被调用函数是同一个函数。递归调用的内部执行过程如下:和被调用函数是同一个函数。递归调用的内部执行过程如下:运行开始时运行开始时,系统设立工作栈来保存每次调用的运行环境

48、,系统设立工作栈来保存每次调用的运行环境,包括形参、局部变量和返回地址;包括形参、局部变量和返回地址;递归调用前递归调用前,将调用函数的形参、局部变量以及调用后的返,将调用函数的形参、局部变量以及调用后的返回地址进栈;回地址进栈;调用结束后调用结束后,将栈顶数据出栈,恢复调用前的运行环境,使,将栈顶数据出栈,恢复调用前的运行环境,使相应的形参和局部变量恢复为调用前的值,然后从返回地址相应的形参和局部变量恢复为调用前的值,然后从返回地址指定的位置继续执行调用函数。指定的位置继续执行调用函数。634.4.44.4.4递归函数的效率分析递归函数的效率分析 递归函数如果很缓慢地逼近到递归结束条件,会使

49、性能大递归函数如果很缓慢地逼近到递归结束条件,会使性能大大下降。大下降。 递归增加了系统开销,递归增加了系统开销,时间时间上,执行调用与返回的额外工上,执行调用与返回的额外工作要占用作要占用CPUCPU时间。时间。空间空间上,随着每递归一次,栈内存就多上,随着每递归一次,栈内存就多占一块,即要分配相应的存储空间,并完成参数的传递、占一块,即要分配相应的存储空间,并完成参数的传递、函数的返回等,在程序的执行效率和所消耗的存储空间上函数的返回等,在程序的执行效率和所消耗的存储空间上,和非递归相比没有任何优势。,和非递归相比没有任何优势。 一般的递归都可以通过相应的方法转化为非递归的,所以一般的递归

50、都可以通过相应的方法转化为非递归的,所以不推荐使用递归,特别是不推荐使用递归层次较多的递归不推荐使用递归,特别是不推荐使用递归层次较多的递归。644.5 C4.5 C局部变量、全局变量与变量作用域局部变量、全局变量与变量作用域4.5.14.5.1导例:富翁与骗子导例:富翁与骗子4.5.24.5.2导例:简易库存存取货管理导例:简易库存存取货管理4.5.34.5.3局部变量和全局变量局部变量和全局变量4.5.44.5.4变量的作用域和生存期变量的作用域和生存期65分别输入分别输入2 2个复数的实部与虚部,用函数实现计个复数的实部与虚部,用函数实现计算算2 2个复数之和与之积。个复数之和与之积。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言程序设计函数刘课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|