《函数及其应用精选PPT.ppt》由会员分享,可在线阅读,更多相关《函数及其应用精选PPT.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关于函数及其应用关于函数及其应用1第1页,讲稿共72张,创作于星期日 10.1 10.1 函函数的基本概念数的基本概念 一个较大的程序一般由若干个一个较大的程序一般由若干个程序模块程序模块(子程序子程序)组成组成,每一个模块每一个模块(子程序子程序)来完成一定的功能。在来完成一定的功能。在C语言中语言中,子子程序的作用是由函数来实现的。程序的作用是由函数来实现的。一个一个C程序可由一个程序可由一个主函数和若干个函数主函数和若干个函数构成,由主函数构成,由主函数调用其它函数,其它函数也可互相调用。同一个函数可以调用其它函数,其它函数也可互相调用。同一个函数可以被一个或多个函数调用任意多次。被一个
2、或多个函数调用任意多次。下图是一个程序中函数调用的示意图:下图是一个程序中函数调用的示意图:第2页,讲稿共72张,创作于星期日main()A()B()C()D()E()F()G()E()H()H()H()G()函数调用函数调用示意图:示意图:调用第3页,讲稿共72张,创作于星期日(1).一个源程序文件一个源程序文件由一个或多个函数组成由一个或多个函数组成.一个源程序一个源程序 文件是一个编译单位文件是一个编译单位,而不是以函数为单位进行编译而不是以函数为单位进行编译.说明说明:(2).一个一个C程序可由程序可由一个或多个源程序文件一个或多个源程序文件组成组成.这样可以分别进行编写这样可以分别进
3、行编写,编译编译,调试调试.一个源文件可以为一个源文件可以为 多个多个C程序公用程序公用.(3).所有函数是平行的所有函数是平行的,一个函数并不从属于另一个函一个函数并不从属于另一个函 数数,函数可以相互调用,但不能调用函数可以相互调用,但不能调用main()函数函数.第4页,讲稿共72张,创作于星期日(4).从从使用角度使用角度来分来分,函数可分为:函数可分为:数学函数数学函数 (#include math.h)字符函数字符函数 (#include ctype.h)库函数库函数 字符串函数字符串函数 (#include string.h)输入输出函数输入输出函数 (#include stdi
4、o.h)动态存储分配函数动态存储分配函数 (#include stdlib.h).自定义函数自定义函数:第5页,讲稿共72张,创作于星期日 从函数的从函数的形式形式来分;来分;无参函数无参函数:主调函数没有数据传给被调函数主调函数没有数据传给被调函数 有参函数有参函数:主调函数可以将数据传给被调函数主调函数可以将数据传给被调函数 空函数空函数:什么也不干,先占位置,以后扩展功能什么也不干,先占位置,以后扩展功能第6页,讲稿共72张,创作于星期日一一.函数定义的一般形式函数定义的一般形式:(自定义函数)(自定义函数)(1).无参函数的定义形式:无参函数的定义形式:类型标识符类型标识符 函数名函数
5、名()函数体函数体 函数定义一律函数定义一律不能加分号不能加分号(;)!说明:说明:类型标识符是指类型标识符是指函数返回值的类型函数返回值的类型.如果函数不要返回值,可写上如果函数不要返回值,可写上void.第7页,讲稿共72张,创作于星期日(2).有参函数定义:有参函数定义:类型标识符类型标识符 函数名函数名(形式参数表列形式参数表列)声明部分声明部分 语句语句 形式参数形式参数例例:intadd(intx,inty)intz;z=x+y;returnz;注注:返回值返回值z的类型的类型(int)应与类型标识符统一。应与类型标识符统一。第8页,讲稿共72张,创作于星期日1、函数参数与函数值;
6、、函数参数与函数值;(1)形参与实参:形参与实参:例:例:main()int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“max is%d”,c);int max(int x,int y)/*定义有参函数定义有参函数max*/int z;z=xy?x:y;return(z);x,y为形参a,b为实参10.2 函数的参数第9页,讲稿共72张,创作于星期日b.实参实参可以是常量、变量、或表达式可以是常量、变量、或表达式,但要求有确定值但要求有确定值.如如:max(3,a+b);c.实参与形参实参与形参的类型应一致,一的类型应一致,一 一对应。一对应。
7、说明说明:a.形参变量形参变量(上例中的上例中的x,y),在在未调用未调用时,并不占时,并不占 用存储单元,当进行函数用存储单元,当进行函数调用时调用时,形参才分配内存,形参才分配内存 单元,调用结束后,形参就释放掉。单元,调用结束后,形参就释放掉。第10页,讲稿共72张,创作于星期日d.实参对形参的数据传递是实参对形参的数据传递是单向传值单向传值,只能是由实参传,只能是由实参传 给形参,而不能相反进行。给形参,而不能相反进行。实参、形参在内存中实参、形参在内存中,占据不同单元。占据不同单元。2 a b 3 2 x 3 y 即使形参单元中的值发生即使形参单元中的值发生变化,变化,也不会影响也不
8、会影响实参单元实参单元的值的值.函数调用后,形参单元释放掉,函数调用后,形参单元释放掉,实参单元仍保留。实参单元仍保留。第11页,讲稿共72张,创作于星期日例例10.9 阅读一下程序,写出程序运行一下程序,写出程序运行结果果#includeintswap(intx,inty)inttemp;temp=x;x=y;y=temp;return0;intmain()inta,b;scanf(%d%d,&a,&b);swap(a,b);printf(%d,%dn,a,b);return0;Ch10_10_9.c 即使形参单元中的值发生即使形参单元中的值发生变化,变化,也不会影响也不会影响实参单实参单元
9、的值元的值.两变量进行交换两变量进行交换.第12页,讲稿共72张,创作于星期日2.函数的返回值与函数的返回值与return语句:语句:执行执行C语言程序就是调用一个个函数,函数被调用语言程序就是调用一个个函数,函数被调用 时,可以返回某一个值作为该函数的值时,可以返回某一个值作为该函数的值(供主函数使用供主函数使用)。需要返回值时,在函数中返回的地方使用需要返回值时,在函数中返回的地方使用return语句语句:return(表达式)表达式);这里表达式的值就是函数的返回值。这里表达式的值就是函数的返回值。第13页,讲稿共72张,创作于星期日说明:说明:a.return 语句后面的括号可省去:语
10、句后面的括号可省去:如:如:return(z);return z;return 后面可以是一个表达式后面可以是一个表达式.第14页,讲稿共72张,创作于星期日 b.当函数不需要带回返回值,当函数不需要带回返回值,C语言有二种方法处理语言有二种方法处理:.使用不带表达式的使用不带表达式的return语句,如语句,如:return;.连连return也不用,这是因为函数末尾也不用,这是因为函数末尾,隐含隐含一个一个return 语句语句,当遇到后面的大括号当遇到后面的大括号“”,就把控制权交给主调就把控制权交给主调 函数。函数。第15页,讲稿共72张,创作于星期日 为了明确表示不带回值,可用为了明
11、确表示不带回值,可用“void“定义。定义。如:如:void printstar();这样可以保证函数不带回任何值这样可以保证函数不带回任何值.c.若函数不指定带值返回,并不是不返回什么值,可能若函数不指定带值返回,并不是不返回什么值,可能 返回一个返回一个不定值不定值。因为不考虑使用,即使返回是不定值因为不考虑使用,即使返回是不定值,也无多大关系。也无多大关系。第16页,讲稿共72张,创作于星期日#includeintadd(intx,inty)intz;z=x+y;returnz;intmain()inta,b,c;scanf(%d%d,&a,&b);c=add(a,b);printf(c
12、=%dn,c);return0;例例:10.1函数值传递的例子函数值传递的例子.(P149)函数在被调用前函数在被调用前必须先必须先定义定义或或说明说明!Ch10_10_1.c第17页,讲稿共72张,创作于星期日例例:10.2函数地址传递的例子函数地址传递的例子.(P150)输入一个由数字组成的字符串输入一个由数字组成的字符串,转换成一个整数转换成一个整数.#includeintctoi(char*p)intsum=0;while(*p)sum=sum*10;sum=sum+(*p-0);p+;returnsum;intmain()charstr5;intx;printf(“stringis:
13、n);scanf(%s,str);x=ctoi(str);printf(“integeris%dn,x);return0;数组名作为数组名作为函数的参数函数的参数Ch10_10_2.c*p-0把一个字符把一个字符数字转成数字数字转成数字.第18页,讲稿共72张,创作于星期日3、函数的调用、函数的调用:(1).函数调用的方式:函数调用的方式:有以下三种函数调用方式:有以下三种函数调用方式:a.函数语句函数语句:函数作为一条语句函数作为一条语句,不要求函数带回值不要求函数带回值,完成一定的,完成一定的 功能、操作。如:功能、操作。如:printstar();b.函数表达式函数表达式:函数调用出现在
14、一个表达式中。函数调用出现在一个表达式中。如如:c=z*max(a,b);这时要求函数这时要求函数带回一个确定的值带回一个确定的值,以参加运算。以参加运算。第19页,讲稿共72张,创作于星期日 c.函数参数函数参数:如:如:printf(“%d”,max(a,b);max(a,b)作为作为 printf函数的一个参数。函数的一个参数。第20页,讲稿共72张,创作于星期日10.3 10.3 系统函数的应用系统函数的应用 C语言提供了十分丰富的库函数语言提供了十分丰富的库函数.这些这些函数函数可分为:可分为:1.数学函数数学函数,如如:sin(),sqrt()函数等函数等.它们的包含文件是它们的包
15、含文件是:“math.h”.2.字符串函数字符串函数,如如:gets(),strcmp()函数等函数等.它们的包含文件是它们的包含文件是:“string.h”.3.输入输出函数输入输出函数,它们的包含文件是它们的包含文件是:“stdio.h”.第21页,讲稿共72张,创作于星期日10.3.1 数学函数数学函数 常用的数学函数有常用的数学函数有:(1).sqrt():doublesqrt(doublex);计算计算;x应应=0(2).fabs():doublefabs(doublex);计算计算x的的绝对值绝对值 x(3).pow():doublepow(doublex,doubley);计算计
16、算xy的值的值 (4).exp():doubleexp(doublex);计算计算ex的值的值第22页,讲稿共72张,创作于星期日例例10.3求求z=xy+c的的值,在,在C语言中言中xy可可调用系用系统函数函数pow()函数来求得。函数来求得。#include#include/必必须加入数学加入数学库头文件文件intmain()doublex,y,z,c;printf(Pleaseinputxycn);scanf(%lf%lf%lf,&x,&y,&c);z=pow(x,y)+c;printf(z=%lfn,z);return0;C+另一注解方法另一注解方法第23页,讲稿共72张,创作于星期日
17、例例10.4 利用循利用循环的方法的方法产生生1100间的的10个随机数,并在个随机数,并在屏幕上屏幕上显示示.关于关于rand()随机函数随机函数:rand()会返回一随机数值会返回一随机数值,范围在范围在0至至RAND_MAX间间.第24页,讲稿共72张,创作于星期日#include#includevoidmain()printf(RAND_MAX=%ldn,RAND_MAX);说明说明:RAND_MAX是一宏定义值是一宏定义值.是系统最大的被是系统最大的被rand()返回的返回的值值.其值可用下列程序输出其值可用下列程序输出:视系统不同而不同视系统不同而不同(32767).第25页,讲稿
18、共72张,创作于星期日2.srand(seed)函数函数:srand()用来设置用来设置rand()产生随机数时的产生随机数时的随机数种子随机数种子。参。参数数seed必须是个整数必须是个整数,通常可以利用通常可以利用time(0)的返回值来当的返回值来当做做seed.如果每次如果每次seed都设相同值,都设相同值,rand()所产生的随机数值每所产生的随机数值每次就会一样。次就会一样。3.time()函数返回从函数返回从1970年开始经历时间的秒数。年开始经历时间的秒数。第26页,讲稿共72张,创作于星期日例例10.4利用系利用系统函数函数rand(),此函数,此函数产生生1100间的的10
19、个随机数,此函数在个随机数,此函数在头件件stdlib.h进行了声明行了声明.#include#include#includeintmain()inti,j;srand(time(0);for(i=0;i S2 函数返回值为函数返回值为0 S1 S2 函数返回值函数返回值0第31页,讲稿共72张,创作于星期日例例10.5 从从键盘输入两个字符串,把两个字符串入两个字符串,把两个字符串连接后接后输出到屏幕出到屏幕#include#includeintmain()chars180,s280;gets(s1);gets(s2);strcat(s1,s2);puts(s1);return0;gets(
20、)以回车结束输入以回车结束输入.ch10_5.c第32页,讲稿共72张,创作于星期日例例10.6从从键盘输入一个字符串,求入一个字符串,求这一字符串一字符串长度度#include#includeintmain()intx;charstr80;gets(str);x=strlen(str);printf(该字符串字符串长度:度:%dn,x);return0;ch10_6.c第33页,讲稿共72张,创作于星期日10.3.3 字符操作函数与字符操作函数与转换函数函数1.isalnum():函数原型函数原型:intisalnum(intch);检查检查ch是否为是否为字母或数字字母或数字.是字母或数字
21、返回是字母或数字返回1,否则返回否则返回0.2.isalpha():函数原型函数原型:intisalpha(intch);检查检查ch是否为是否为字母字母.是字母返回是字母返回1,否则返回否则返回0.第34页,讲稿共72张,创作于星期日3.islower():函数原型:intislower(intch);检查检查ch是否为是否为小写字母小写字母(az).是返回是返回1,否则返回否则返回0.4.isxdigit():函数原型:intisxdigit(intch);检查检查ch是否为一个是否为一个十六进制字符十六进制字符(09或或af或或AF).是返回是返回1,否则返回否则返回0.第35页,讲稿共
22、72张,创作于星期日5.atoi()函数原型函数原型:intatoi(char*str)函数功能函数功能:将将(一含有数字内容的一含有数字内容的)字符串转换成一个整数数值字符串转换成一个整数数值.头文件头文件:#include#includeintmain()intn;charstr=12345.78;n=atoi(str);printf(string=%sinteger=%dn,str,n);return0;第36页,讲稿共72张,创作于星期日例例10.7 从从键盘输入一些字符,入一些字符,输出其中的大写字符与十六出其中的大写字符与十六进制字符,当制字符,当输入字符入字符结束字符束字符#in
23、clude#includeintmain()charch;while(ch=getchar()!=)if(isupper(ch)|isxdigit(ch)printf(%3c,ch);printf(n);return0;ch10_7.c第37页,讲稿共72张,创作于星期日10.4 自定自定义函数函数C语言允言允许用用户自定自定义函数函数.例如例如:下面是一个自定下面是一个自定义函数函数,功能是求两个整数之和功能是求两个整数之和.intadd(intx,inty)intz;z=x+y;returnz;第38页,讲稿共72张,创作于星期日 关于对被调用函数的声明和函数原型关于对被调用函数的声明和函
24、数原型:在一个函数中调用另一个函数在一个函数中调用另一个函数(即被调函数即被调函数)需要具备哪些条件需要具备哪些条件?a.函数要存在函数要存在(库函数或自定义函数库函数或自定义函数).此外还要此外还要:b.如果是如果是库函数库函数,一般应在文件开头用一般应在文件开头用#include命令把命令把 相关函数的一些信息包括进去相关函数的一些信息包括进去.第39页,讲稿共72张,创作于星期日c.如果用户如果用户自己定义自己定义了一个函数,同时主调函数与被了一个函数,同时主调函数与被 调函调函数数在同一源文件中在同一源文件中:d.一般情况下,主调函数中要对被调用函数的作一一般情况下,主调函数中要对被调
25、用函数的作一声明声明.函数声明函数声明 即向编译系统声明将要调用此函数即向编译系统声明将要调用此函数,并将有关信息通知并将有关信息通知编译系统编译系统.第40页,讲稿共72张,创作于星期日例例:main()float a,b,c;scanf(“”%f,%f”,&a,&b);c=add(a,b);printf(“sum is%f”,c);float add(float x,float y)float z;z=x+y;return(z);对被调函数的声明对被调函数的声明float add(float x,float y);函数声明是一语句函数声明是一语句,要加分号要加分号 ;自定义自定义add函数
26、函数.C语言在进行编译时是语言在进行编译时是从上到下从上到下逐行进行的逐行进行的,如果没有对函数进如果没有对函数进行声明行声明,如上例如上例,当编译到当编译到“c=add(a,b);”时时,并不知道并不知道add是不是是不是函数名函数名,也无法判断实参也无法判断实参(a和和b)的的类型与个类型与个数正确与否数正确与否?第41页,讲稿共72张,创作于星期日(1).“定义定义”与与“声明声明”不是一回事不是一回事.“定义定义”:是指对函数功能的确定是指对函数功能的确定,包括指定函数名包括指定函数名,函数值类型函数值类型,形参及其类型形参及其类型,函数体等函数体等.它是一个它是一个完整的完整的,独立
27、的独立的函数函数 单位单位.说明说明:而而“声明声明”的作用的作用:则是把函数的名字则是把函数的名字,函数的类型函数的类型,以及形参的类型以及形参的类型,个个 数和顺序通知编译系统数和顺序通知编译系统,以便在调用该函数时系统按此以便在调用该函数时系统按此 检查检查.第42页,讲稿共72张,创作于星期日(2).其实其实,在在函数声明中函数声明中也可以不写形参名也可以不写形参名,而只写形参的而只写形参的 类型类型.如如:float add(float,float);(3).在在C语言中语言中,以上的函数声明称为以上的函数声明称为函数原型函数原型.使用函数原型的主要作用是使用函数原型的主要作用是:利
28、用它在程序的编译阶利用它在程序的编译阶 段段,对被调函数的合法性进行全面检查对被调函数的合法性进行全面检查.第43页,讲稿共72张,创作于星期日 函数原型的一般形式函数原型的一般形式:(a).函数类型函数类型 函数名函数名(参数类型参数类型1,参数类型参数类型2,.)(b).函数类型函数类型 函数名函数名(参数类型参数类型1 参数名参数名1,参数类型参数类型2 参数名参数名2,.)函数原型函数原型 第一种是基本的形式第一种是基本的形式,为了便于阅读为了便于阅读,也允许加上参数名也允许加上参数名.但编译但编译系统并不检查参数名系统并不检查参数名,因此参数名是什么都无所谓因此参数名是什么都无所谓.
29、第44页,讲稿共72张,创作于星期日(4).(4).对被调函数声明,在下列对被调函数声明,在下列三种情况三种情况下可省略:下可省略:说明说明:(a).a).如果函数的返回值是如果函数的返回值是整型整型,或字符型或字符型可以省去(可以省去(以以 前我们遇到的大多是这种情况前我们遇到的大多是这种情况)。)。系统自动按整型处理,建议加以说明为好。系统自动按整型处理,建议加以说明为好。(b).b).被调用函数的定义位置出现被调用函数的定义位置出现在主调函数之前在主调函数之前,可省可省 去声明去声明,这时编译系统已知道了已定义的函数类型这时编译系统已知道了已定义的函数类型,会自动处理会自动处理.如下例如
30、下例:第45页,讲稿共72张,创作于星期日 float add(float x,float y)/*定义定义add函数函数*/float z;z=x+y;return(z);main()float add(float x,float y);float a,b,c;scanf(“”%f,%f”,&a,&b);c=add(a,b);printf(“sum is%f”,c)此处不必对此处不必对add()作声明作声明(c).c).此外此外,在文件开头(在文件开头(所有函数定义之前所有函数定义之前),对函数进对函数进 行了函数的统一声明,可省去在主调函数中的声明。行了函数的统一声明,可省去在主调函数中的
31、声明。第46页,讲稿共72张,创作于星期日如如:char letter(char,char);/*这三行处于所有函数之前这三行处于所有函数之前,float f1(float,float);且在函数外部且在函数外部.*/int i2(float,float);main()/*main内内不必说明所调用函数类型不必说明所调用函数类型*/char letter(char c1,char c2)/*定义定义letter()函数函数*/.float f1(float x,float y)/*定义定义f1()函数函数*/.int i2(float j,float k)/*定义定义i2()函数函数*/.第4
32、7页,讲稿共72张,创作于星期日#includeintfun(intn)ints=1,i;if(n=0)s=1;elsefor(i=1;i=n;i+)s=s*i;returns;intmain()inta,b;scanf(%d,&a);b=fun(a);printf(%d的的阶乘乘为%dn,a,b);return0;例例10.8 从从键盘输入一个整数(入一个整数(0-16),求此数的),求此数的阶乘。乘。Ch10_10_8.c第48页,讲稿共72张,创作于星期日例例10.10 输入二个整数入二个整数,进行函数行函数调用用,问能否能否实现实参参a,b的交的交换。#includeintswap(i
33、nt*p3,int*p4)intm;m=*p3;*p3=*p4;*p4=m;return0;intmain()inta,b;int*p1,*p2;printf(Pleaseinputa,b:);scanf(%d,%d,&a,&b);p1=&a;p2=&b;swap(p1,p2);printf(a=%d,b=%dn,a,b);return0;8P1 a 3P2 8P33P4Ch10_10_10.c指针为参数指针为参数第49页,讲稿共72张,创作于星期日10.5 函数的函数的应用用例例10.11在在main函数中定函数中定义了一个整型数了一个整型数组并初始化,通并初始化,通过调用用自定自定义函数函
34、数sum把数把数组中中-1前的所有元素前的所有元素值相加相加.#include int sum(int b)int s=0,i=0;while(bi!=-1)s+=bi+;return s;int main()static int a=1,2,3,4,5,6,7,8,9,-1,6;printf(Total=%dn,sum(a);return 0;Ch10_10_11.c数组名作为函数的参数数组名作为函数的参数进行调用进行调用.第50页,讲稿共72张,创作于星期日例例10.14 输入一行英文字符,入一行英文字符,统计其中有多少其中有多少单词,单词之之间以空格以空格为分隔分隔#includeint
35、main()charstring81;intnum;gets(string);num=numword(string);printf(Thereare%dwordsn,num);return0;第51页,讲稿共72张,创作于星期日intnumword(char*str)inti,num=0,word=0;charch;for(i=0;(ch=stri)!=0;i+)if(ch=)word=0;elseif(word=0)word=1;num+;returnnum;num 统计单词个数统计单词个数,word用用来判断是否单词的标志来判断是否单词的标志.(1).当前字符为空格当前字符为空格:未出现新
36、单词未出现新单词,word=0,num 不不累加。累加。(2).当前字符为非空格当前字符为非空格(分两种情况分两种情况):a.前一字符为空格前一字符为空格(word=0),新词出新词出 现现,word=1,num 加加1.b.前一字符为非空格前一字符为非空格(word=1),未出未出 现新单词现新单词,num 不不加加1.You are students.第52页,讲稿共72张,创作于星期日 (1).(1).函数的嵌套调用:函数的嵌套调用:C C语言中的函数是平行的,语言中的函数是平行的,不允许嵌套定义不允许嵌套定义。所有函数的作用域都处于同一嵌套深度,即不允许在函数体中又所有函数的作用域都处
37、于同一嵌套深度,即不允许在函数体中又定义另一个函数定义另一个函数.但但允许嵌套调用允许嵌套调用函数函数,即在调用一个函数的过程中即在调用一个函数的过程中,又调用另一又调用另一个函数。个函数。10.6 函数的嵌套与函数的嵌套与递归调用用第53页,讲稿共72张,创作于星期日 main()a()main()a()函数函数 b()b()函数函数 调用函数调用函数a()a()调用函数调用函数b().b().结束结束 return returnreturn return 如如:第54页,讲稿共72张,创作于星期日例例 求三角形面求三角形面积 area2=s(s-a)(s-b)(s-c)s=(a+b+c)/
38、2smainarea#include#includevoidmain()floata,b,c;floatarea(floata,floatb,floatc);floats(floata,floatb,floatc);scanf(%f%f%f,&a,&b,&c);printf(%fn,area(a,b,c);floatarea(floata,floatb,floatc)floatss;ss=s(a,b,c);returnsqrt(ss*(ss-a)*(ss-b)*(ss-c);floats(floata,floatb,floatc)return(a+b+c)/2;对被调函数的声明对被调函数的声明
39、第55页,讲稿共72张,创作于星期日开始调用(2 2).函数的递归调用(函数的递归调用(recursiverecursive)调用一个函数的过程中调用一个函数的过程中,出现了直接或间接地调用出现了直接或间接地调用 该函数本身该函数本身,称之为函数的递归调用。称之为函数的递归调用。C语言的特点之一是允许函数的递归调用。语言的特点之一是允许函数的递归调用。递归调用可以简明递归调用可以简明,高效的解决问题高效的解决问题(问题的一方面问题的一方面)。a.直接递归调用;直接递归调用;int f(int x)int y,z;.z=f(y);return(z*z);第56页,讲稿共72张,创作于星期日b.间
40、接递归调用:间接递归调用:int f1(int x)int y,z;z=f2(y);return(z*z);int f2(int a)int c;c=f1(a);return(3+c);两种调用都是无休至的自我调用。两种调用都是无休至的自我调用。可以用可以用if语句来控制这种情况语句来控制这种情况.第57页,讲稿共72张,创作于星期日 通常用求一个数的通常用求一个数的阶乘阶乘为例来说明递归函数。为例来说明递归函数。1 (n=0,1)n!=n*(n-1)!(n1)例:例:10.18第58页,讲稿共72张,创作于星期日 float fac(int n)float f;if(n0)printf(“n
41、0,data error!”);exit(0);else if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);int main()int n;float y;printf(“input a integer number:”);scanf(“%d”,&n);y=fac(n);printf(“%d!=%f”,n,y);n n-1 下面设下面设 n=3,进行调用进行调用:ch10_10_18.c第59页,讲稿共72张,创作于星期日fac(int n)else if(n=1|n=0)f=1;else f=fac(n-1)*3;return(f);main().(n=3
42、)y=fac(n);.fac(int n).(n=2)else if(n=1|n=0)f=1;else f=fac(n-1)*2;return(f);fac(int n).(n=1)else if(n=1|n=0)f=1;else f=fac(n-1)*n;return(f);11*2第60页,讲稿共72张,创作于星期日 调用调用fac函数计算函数计算3的阶乘时的情况:的阶乘时的情况:f=fac(2)*3 1.这时函数将调用自己,因此仍然要理解为调用一个单这时函数将调用自己,因此仍然要理解为调用一个单 独的函数。独的函数。2.每一次当每一次当C语言中的任意函数被调用语言中的任意函数被调用(不管
43、是否递归不管是否递归),函数都将获得函数都将获得自己的一套局部变量和形式参数自己的一套局部变量和形式参数。3.函数递归时函数递归时,必须有个必须有个if语句,迫使函数返回,进而结语句,迫使函数返回,进而结 束递归束递归.第61页,讲稿共72张,创作于星期日 1.1.数组名作函数参数数组名作函数参数:如如:main()int array10;f1(array,10);f1(int arr,int n).array0,arr0array,arr函数的函数的应用用第62页,讲稿共72张,创作于星期日 实际上实际上,实参数组与形参数组共同占用一段内存空间实参数组与形参数组共同占用一段内存空间.在函数调
44、用过程中在函数调用过程中,如果形参数组如果形参数组arrarr的元素值发生变的元素值发生变化化,相应实参数组的元素也发生同样变化相应实参数组的元素也发生同样变化.array0,arr0array,arr第63页,讲稿共72张,创作于星期日2.2.用多维数组名作函数参数用多维数组名作函数参数:在被调用函数中对形参数组的定义时在被调用函数中对形参数组的定义时,可以指定每一维的大小可以指定每一维的大小,也可以省略第一维的大小说明也可以省略第一维的大小说明:如如intarray310;或或:intarray10;第64页,讲稿共72张,创作于星期日例例:有一个有一个3*4的数组的数组,求所有元素中的最
45、大值求所有元素中的最大值.ch10_10_18_1.c#includeintmax_value(intarray4)inti,j,max;max=array00;for(i=0;i3;i+)for(j=0;jmax)max=arrayij;return(max);intmain()inta34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max_valueis%dn,max_value(a);return1;第65页,讲稿共72张,创作于星期日例例2 21:1:建立一个数组建立一个数组a,a,有有1010个元素个元素,通过函数调用的方通过函数调用的方 法实现法实现数组
46、数组元素的逆序存放元素的逆序存放.#include void main()int i,a10,n;void reverse(int p,int n);printf(Input the size of array:);scanf(%d,&n);printf(Input%d numbers:,n);for(i=0;in;i+)scanf(%d,&ai);reverse(a,n);for(i=0;in;i+)printf(%d,ai);函数声明函数声明函数调用函数调用ch10_10_21_1.c第66页,讲稿共72张,创作于星期日 void reverse(int p,int n)/数组为形参参数数
47、组为形参参数 int i,j,t;for(i=0,j=n-1;ij;i+,j-)t=pi;pi=pj;pj=t;printf(“After reversion:n);首尾交换数组各元首尾交换数组各元素的位置素的位置.第67页,讲稿共72张,创作于星期日 说明说明:实现交换数组各元素的另一种方法实现交换数组各元素的另一种方法,用指针为形参用指针为形参.void reverse(int*p,int n)int*pj,t;for(pj=p+n-1;ppj;p+,pj-)t=*p;*p=*pj;*pj=t;printf(“After reversion:n);调用调用:reverse(a,n);rev
48、erse(a,n);ch10_10_21_2.c第68页,讲稿共72张,创作于星期日第69页,讲稿共72张,创作于星期日#include void bubble(int a,int n);void swap2(int*,int*);main()int a10;int i ;printf(input 10 numbers:n);for(i=0;i10;i+)scanf(%d,&ai);bubble(a,10);printf(the sorted numbers:n);for(i=0;i10;i+)printf(%d ,ai);以数组名以数组名a作为实参进作为实参进行函数调用行函数调用.ch10_
49、10_22.c函数声明函数声明第70页,讲稿共72张,创作于星期日void bubble(int a,int n)int i,j;for(i=0;i=n-1;+i)for(j=n-1;i aj)swap2(&aj-1,&aj);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;以数组元素的地址作为实参以数组元素的地址作为实参进行函数调用进行函数调用.使用指针交换两个元素的位使用指针交换两个元素的位置置.从后从后(右右)面开始比较面开始比较,把把小的移到前面小的移到前面.第71页,讲稿共72张,创作于星期日感感谢谢大大家家观观看看2023/4/9第72页,讲稿共72张,创作于星期日