c++-chap-4-利用函数实现制定功能_第1页
c++-chap-4-利用函数实现制定功能_第2页
c++-chap-4-利用函数实现制定功能_第3页
c++-chap-4-利用函数实现制定功能_第4页
c++-chap-4-利用函数实现制定功能_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课件作者:刘葳第第4章章 利用函数实现制定功能利用函数实现制定功能11. 为什么需要函数函数的作用就是:使人把相对独立的某个功能抽象出来,使之成为一个独立的实体。无论将一个程序划分为多少个程序模块(即函数),只能有一个main函数,程序运行总是从main函数开始到main函数结束。21. 为什么需要函数函数包括两种:内置函数和自定义函数:例如,头文件里边的函数都是内置函数,你指定了头文件就可以直接调用;自定义函数需要你自己完成函数定义,函数申明,函数调用。在实际应用中,主函数写的很简单,它的作用就是调用各个函数,程序各部分功能都是由各个函数实现的。31. 为什么需要函数为什么要使用函数?(1)

2、避免重复的编程。(2)使程序更加模块化,便于阅读、修改。注意:所编写的函数应尽量少与主调函数发生联系,这样便于移植。4参数(多个)参数(多个)函数值函数值(唯一)唯一)函数体函数体5if(ab) c=a;else c=b;举例举例: 找出两个数的最大数找出两个数的最大数void main( ) int a,b,c; cinab; coutcy) z=x;else z=y;2. 定义函数的一般形式6C+语言中,函数定义格式: (形参表) 函数体 有两种:有两种:外部函数(外部函数(extern)通常被缺省)通常被缺省内部函数(内部函数(static)可以是可以是C+中允许出现的各种类型,如:中允

3、许出现的各种类型,如:基本类型、结构变量和对象、指针和引用基本类型、结构变量和对象、指针和引用void等等命名规则同标识符命名规则同标识符可以是一个或多个参数,参数可以是一个或多个参数,参数之间逗号分割,每个参数要给之间逗号分割,每个参数要给出参数名和类型说明出参数名和类型说明函数的定义包括两部分:函数的定义包括两部分:函数头函数头和和函数体函数体double max(double x, double y) double z; z=(xy)? x : y ; return z; void main (void) double a,b, c; cinab; c=max (a , b) ; cou

4、t“The max is”cendl; 被调函数先定义被调函数先定义定义之后再调用定义之后再调用形参必须说形参必须说明参数类型明参数类型实参传递的是一个具体的实参传递的是一个具体的值,括号中不必说明参数值,括号中不必说明参数类型,但实参定义的类型类型,但实参定义的类型一定和形参一致。一定和形参一致。函数设计思路函数设计思路73.函数参数和函数值函数参数包括:形式参数和实际参数,即形参与实参。函数的值是指函数的返回值。C+语言中,如果一个函数具有返回值,则需要在该函数体内有如下形式的返回语句: return ;83.函数参数和函数值float max(float x, float y) floa

5、t z; z=(xy)? x : y ; return z; void main (void) float a,b, c; cinab; c=max (a , b) ; cout“The max is”cab; cinab; c=max(a ,b); c=max(a ,b); cout“The max is”cendl; cout“The max is”cy)?x:y; z=(xy)?x:y; return z; return z;控制控制转移转移控制归还控制归还调用函数调用函数函数调用执行过程函数调用执行过程最后执行最后执行输出语句输出语句4.函数调用参数传递函数调用的方式: 作为语句 pr

6、intstar( ); 作为表达式 c=max(a,b); 作为另一个函数的参数 max(a,max(b,c);144.函数调用参数传递函数调用时,将实参的值传递给被调用函数形参的过程,称为函数的参数传递。 函数参数的传递方式:按值传递按地址传递按引用传递15按值传递传值调用 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中。调用结束,形参单元被释放,实参单元仍保留并维持原值。特点:形参与实参占用不同的内存单元单向传递4.函数调用参数传递17int max (int x,int y) int z; z=(xy)? x : y ; return z; void main (void )

7、 int a,b,c; cinab; c=max (a , b) ; cout“The max is” cendl; ab23c3xy23z3此函数有返回值此函数有返回值示例include “iostream.h”void xy(int x,int y) x=x*y; y=y-x;void main() int a,b; a=10,b=20; xy(a,b); cout“a ”a“ b=“bendl;输出:输出:a=10 b=20 x=10y=20运算后:运算后:x=200y=-180此函数无返回值此函数无返回值按地址传递传址调用传址调用 方式:函数调用时,将数据的存储地址作为参方式:函数调用

8、时,将数据的存储地址作为参数传递给形参。数传递给形参。特点:特点:形参与实参占用形参与实参占用同样的存储单元同样的存储单元“双向双向”传递传递实参和形参必须是地址值实参和形参必须是地址值4.函数调用参数传递4.函数调用参数传递第一种情况:变量的地址作为实参传递给被调用函数的形参,此时形参一定是指针来接收地址值。20include “iostream”using namespace std;void xy(int *x,int *y) *x=(*x)*(*y); *y=(*y)-(*x);void main() int a,b; a=10,b=20; xy(&a,&b); cou

9、t“a”a“ b=“bendl;21返回a10 xb20y200-180输出:输出:a=200 b=-1804.函数调用参数传递第二种情况:数组名作为实参,此时被调用的函数形参可以是数组名,也可以是指针,此时函数传递的是数组在内存中的首地址,当实参中的数组地址传到形参中,实参形参共用同一段内存。注意:在C+中,数组名被认为是数组在内存中存放的首地址。22void fun(int a2) for(int i=0;i2;i+) ai=ai*ai; void main(void) int b2=2,4; coutb0tb1endl; fun(b); coutb0tb1endl;24b0b1a0a1b

10、a416当i=0时,完成a0=a0*a0当i=1时,完成a1=a1*a1实参、形参均用数组实参、形参均用数组实参、形参均用数组实参、形参均用数组#include void fun(int b8,int n) for(int i=0;in-1;i+) b7+=bi;void main()static int a8=1,3,5,7,9,11,13; int m=8; fun(a,m); couta7endl;1357911130b0b1b2b3b4b5b6b7a0a1a2a3a4a5a6a7ba1 4运行结果?494.函数调用参数传递#include using namespace std;voi

11、d fun(int *pa,int n) for(int i=0;in-1;i+) *(pa+7)+=*(pa+i);void main() int a8=1,3,5,7,9,11,13; int m=8; fun(a,m); couta7endl;25用指针变量作函数形参接收数组地址1357911130pa0pa1pa2pa3pa4pa5pa6pa7a0a1a2a3a4a5a6a7papa+1pa+2Pa+7练习:261.编写求若干数据的和的函数方法2:用数组4.函数调用参数传递按引用传递引用作为函数参数由于引用就是给一个变量起别名,所以,当使用引用作函数的参数时,就是将实参变量名赋给形参引

12、用,形参名就等同实参变量名。特点:“双向”传递实参和形参就是同一变量27include void xy(int &x,int &y) x=x*y; y=y-x;void main() int a,b; a=10,b=20; xy(a,b); cout“a”a“ b=“bendl;28返回相当于相当于 int &x=ax是是a的别名的别名相对于相对于 int &y=by是是b的别名的别名x10ay20b200-180输出:输出:a=200 b=-1801.void main(void ) printstar ( ); print_message ( ); prin

13、tstar( );void printstar (void ) cout“* * * * * * * * * * *n”; void print_message (void) cout“ How do you do! n”; 练习29运行结果?2.void fun(int a, int b) a=a*10; b=b+a; coutatbendl;void main(void) int a=2, b=3; fun(a,b); coutatbendl;练习30ab23ab23202320 232 3练习:3. 求一维数组的平均值,请将程序填完整#includeusing namepace std;

14、void main() int i, a10; float , mv; for(i=0;i ; mv=mean( ); coutmvendl;31float mean(int d10) int i; float avg=0.0; for(i=0;i10;i+) avg+= ; avg/=10; return avg ;aiiadiint prime(int x) for(int i=2;ix/2;i+) if(x%i=0) return 0; return 1;void main(void) for(int i=100;i=200; i+) if(prime(i)=1) coutit; 练习3

15、24.4.计算计算100100200200之间的素数,用函数之间的素数,用函数prime( )prime( )判断一个数是否是素数,若判断一个数是否是素数,若是该函数返回是该函数返回1 1,否则返回,否则返回0 0。int gys(int a, int b) int r; if(axy; coutgys(x,y)endl;练习练习6.数组元素作函数实参,用法与一般变量作实参相同,是“值传递”。例如:有两个数据系列分别为:int a8=26,1007,956,705,574,371,416,517;int b8=994,631,772,201,262,763,1000,781;求第三个数据系列

16、c ,要求c中的数据是a b中对应数的最大数。 34int max(int m,int n) int r; if(mn) r=m; m=n; n=r; return m;void main(void) int a8=26,1007,956,705,574,371,416,517; int b8=994,631,772,201,262,763,1000,781; int c8; for(int i=0;i8;i+) ci=max(ai,bi);/对应元素的最大数 for(i=0;i8;i+)coutcit; coutendl;3536float average (float array ) in

17、t i; float aver, sum=array0; for (i=1; i10; i+) sum=sum+arrayi; aver=sum/10; return aver;void main(void) static float score10=100,90,45,63,69,78,95,74.69,61; float aver; aver=average(score); cout“aver=“avern;有一个一维数组,内放10个学生成绩,求平均成绩数组名作为形参,与实参数组共占单元数组名作为实参,地址值传给形参数组37score8score6score4score2score0arr

18、ay8array6array4array2array0scorearray练习练习7.字符串运算举例例5.12 一个班有n个学生,需要将每个学生的简单资料(姓名和学号)输入计算机保存,然后可以通过输入某一个学生的姓名查找其有关资料。当输入一个学生姓名后,程序就查找该班中有无此学生,如果有,则输出他的姓名和学号,如果查找不到,则输出“本班无此人”。38练习练习设计思想39 .调用求平均值函数调用求平均值函数average(数组名数组名) 调用求最高成绩函数调用求最高成绩函数max(数组名数组名) 调用求最低成绩函数调用求最低成绩函数min(数组名数组名)调用统计各分数段人数函数调用统计各分数段人

19、数函数count (数组名数组名)主函数调用求平均值函数调用求平均值函数average(数组名数组名) .求平均值调用统计各分数段人数函数调用统计各分数段人数函数count (数组名数组名)统计个分数段人数#include #include #include #include using namespace std;using namespace std;intint main() main()void void input_datainput_data(string name50,string num50,(string name50,string num50,intint n); n);

20、void search(string void search(string find_name,stringfind_name,string name50,string num50 , name50,string num50 , intint n); n); string string find_namefind_name; ; string name50,num50; string name50,num50; intint n; n; coutcoutplease input number of this class:;n;n; input_datainput_data( (name,num

21、,nname,num,n);); coutcoutplease input name you want find:;find_namefind_name; ; search( search(find_name,name,num,nfind_name,name,num,n);); return 0; return 0; void void input_datainput_data(string name50, string num50,(string name50, string num50,intint n) n) intint i i; ; for ( for (i i=0;i=0;in;i

22、n;i+)+) coutcoutinput name and number of student i+1:;input name and number of student i+1namenamei inumnumi i; 4142void search(string void search(string find_name,stringfind_name,string name50,string num50, name50,string num50, intint n) n) intint i i; ; boolbool flag=false; flag=false; for( for(i

23、i=0;i=0;in;in;i+)+) if(name if(namei i=find_namefind_name) ) coutcoutnamenamei i num numi iendlendl; ; flag=true; flag=true; break; break; if(flag=false) if(flag=false) coutcoutcant find this name;cant find this name; 运行结果:运行结果:435. 函数的嵌套调用函数的嵌套调用自学自学嵌套调用:一个函数调用另一个函数时,被调用函数又调用了其它函数。C+语言规定:C 函数不允许嵌套定

24、义,但允许嵌套调用。445. 函数的嵌套调用自学45int max ( int a, int b) int c; int min ( int a, int b) return ( ab? a : b); 嵌套定义嵌套定义 不允许,错不允许,错5. 函数的嵌套调用自学46调用 b 函数a 函数b 函数main 函数调用 a 函数结束(2)(3)(4)(5)(6)(7)(8)(9)a函数结束b函数结束在在main函数中调用函数中调用a函数,在函数,在a函数中又调用函数中又调用b函数函数嵌套调用嵌套调用47例如:求1K+2K+3K+NK 的和int power(int m,int n)/mn int

25、 i,product=m; for(i=1;in;i+) product=product*m; return product;int sum_of_power(int n,int k)/nk的累加和的累加和 int i,sum=0; for(i=1;imk; coutsum_of_power(m,k)1)6.递归调用自学50递归调用的过程“递推”阶段:现将原问题不断分解为新的子问题,逐渐地从未知向已知的方向推测,最后达到已知的条件,即递归结束条件。“回归”阶段:该阶段从已知条件出发,按递推的逆过程,逐一求值回归,最后达到递推的开始处,结束回归阶段,完成递归调用。6.递归调用自学51实现递归调用

26、的方法 求n!float fac (int n) float y; if (n= =0)| (n= =1) y=1; else y=n*fac(n-1); return y;void main (void) float y; int n; coutn ; coutn“!=”fac(n)endl;递归结束条件递归结束条件进行递归调用进行递归调用6.递归调用自学递归调用的过程2!=2* 1!3!=3*2!1!=13!=62!=2第一阶段第一阶段“递推递推”第二阶段第二阶段“回推回推”已知条件,即已知条件,即“递推递推”结束条件结束条件526.递归调用自学53fac (3)n=3y=3*fac (2

27、)fac (2)n=2y=2*fac (1)fac (1)n=1y=1return yreturn yy=2return yy=66.递归调用自学54int sub(int);void main (void) int i=5; coutsub(i)endl;int sub (int n ) int a; if (n= =1) return 1; a=n+sub(n-1); return a;结果是:?156.递归调用自学55void recur(char c) coutc; if(c5) recur(c+1); cout=10) f(n/10); coutnendl;void main(voi

28、d) f(123);结果是:1121237.内置函数函数调用时需要做的工作:57执行调用函数之前的语句执行调用函数a的语句时,要记下刚刚执行的指令地址,保护现场信息,以便函数返回之后继续执行。之后程序运行转到a函数,同时进行参数传递执行被调用函数aa函数执行完,需要返回到先前记下的地址处,并根据记忆的信息“恢复现场”,继续执行主函数中未执行的语句,直到结束结论:调用函数需要花费一定的时间,如果频繁调用一个函数,会花费更长的时间,这样会降低程序执行的效率。7.内置函数内置函数也称内联函数,其引入的原因是:减小函数的频繁调用次数,提高程序的运行效率在遇到调用内联函数的地方,用函数体中的代码来替换函

29、数的调用(运行机制与宏定义类似)587.内置函数内联函数的定义方法59inline 函数类型函数类型 函数名函数名(参数表参数表)函数体函数体关键字6.内置函数#include #include inline inline intint cube_intcube_int( (intint n); n); void main() void main() for( for(intint i i(1);(1);i i=5;i+)=5;i+) intint p= p=cube_intcube_int( (i i) ); ;coutcouti i* *;coutcouti i* *;coutcouti

30、i=p=px;/x;/输入输入2 2coutcoutsin(sin(x,xx,x) )endlendl; ;coutcoutsin(x,10)sin(x,10)endlendl; ; 651. 1. 参数类型上不同的重载函数参数类型上不同的重载函数sin(x,x)sin(x,10)结果:结果:? ?7.函数的重载#include using namespace std;void print(int);void print(double);void main() print(8); print(A); print(2.987); print(12.78f); print(int)3.876);v

31、oid print(int n) coutn*nendl; void print(double n) coutn+nendl; 66示例:示例:运行结果运行结果6442255.97425.569# #includeiostream.hincludeiostream.h # #includemath.hincludemath.h int add(int a,int b,int c) return a+b+c; int add(int a,int b) return a+b; void main(void) cout3+5=add(3,5)endl; cout3+5+8=add(3,5,8)end

32、l; 672. 2. 参数个数上不同的重载函数参数个数上不同的重载函数3个参数个参数2个参数个参数结果:结果:3+5=83+5=83+5+8=163+5+8=16#include using namespace std;int main()int max(int a,int b); double max(double a,double b,double c); int i1,i2,i; cini1i2; i=max(i1,i2); couti_max=id1d2d3; d=max(d1,d2,d3); coutd_max=da) a=b; return a;double max(double

33、a,double b,double c)if(ba) a=b; if(ca) a=c; return a;9.函数的模板函数重载实现了函数名多用,但在程序中,仍然需要分别定义每个函数,尽管每个函数的函数体基本类似。函数模板是指建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数称为函数模板。699.函数的模板凡是函数体相同的函数都可以用定义的模板来代替。定义函数模板的一般形式:template 通用函数定义或template 通用函数定义7071int main()int i1=185,i2=-76,i3=567,i; double d1=56.87,d2=9

34、0.23,d3=-3214.76,d; long g1=67845,g2=-912456,g3=673456,g; i=max(i1,i2,i3); d=max(d1,d2,d3); g=max(g1,g2,g3); couti_max=iendl; coutd_max=dendl; coutg_max=gendl; return 0;#include using namespace std;template T max(T a,T b,T c)if(ba) a=b; if(ca) a=c; return a;调用函数时,编译系统自动将函数名max与模板max相匹配,将实参类型取代模拟类型T结

35、果:结果:i_maxi_max=567=567d_maxd_max=90.23=90.23g_maxg_max=673456=67345610.有默认参数的函数一般情况下,在函数调用时,形参从实参那里获得值,因此实参的个数要和形参相同。但有时需要对同一个函数实现多次调用,每次调用需要传递相同的参数,为了方便、灵活,C+提供了带有默认参数的函数。7210.有默认参数的函数在函数定义或函数原型说明时,在函数的形式参数表中,给若干个形式参数规定默认值,则称这些参数为默认参数,又称可选参数。 使用原则:函数调用时,若不给出实参,则取默认值作为实参值。7310.有默认参数的函数74int s(int i

36、1,int j2) return i+j;void main( ) couts=s(2,2)endl; couts=s( )endl; 运行结果s=4s=3给实参了,就用实参值没有给实参,就用默认参数值75例:分析下列程序的输出结果。例:分析下列程序的输出结果。#include void fun(int a=1,int b=2,int c=3) couta=a,;coutb=b,;coutc=c;coutendl;void main( ) fun();fun(9);fun(4,5);fun(7,8,9);运行结果运行结果a=1,b=2,c=3a=9,b=2,c=3a=4,b=5,c=3a=7,

37、b=8,c=9 第第1次调用没有参次调用没有参数使用默认值数使用默认值第第2次调用次调用1个参数,将个参数,将9赋给赋给a,其他变量用默认值,其他变量用默认值第第3次调用次调用2个参数,将个参数,将4赋给赋给a,5赋给赋给b,c变量用默认值变量用默认值第第4次调用次调用3个参数,分个参数,分别赋给别赋给a,b,c默认参数说明:如果函数有多个参数,则具有默认值的参数必须排在那些没有默认值的参数的右边。即默认值的指定,必须从参数表的右边开始,指定默认值的参数右边不允许有没指定的参数默认值。10.有默认参数的函数int s(int i,int j2) return i+j; void main( )

38、 couts=s(2,2)endl; couts=s(1)endl; 默认参数说明: 当函数的多个参数具有默认值时,调用函数所给的实在参数与形式参数匹配是按照从左到右的顺序进行,没有给定的实参,则使用函数的默认值。10.有默认参数的函数#include int s(int i=1,int j=2,int k=3) return i+j+k; void main( ) couts=s()endl; couts=s(2,2)endl; couts=s(2,2,2)endl; 78默认参数说明: 当函数需要原型说明时,默认的参数值应设置在函数原型说明中,不应在函数定义中设置;若没有函数原型说明,则参

39、数默认值可在定义中设置。 函数原型说明可以说明多次,也可以在各个函数原型中设置不同的参数具有默认值。10.有默认参数的函数#include void main( ) couts=s()endl; couts=s(2,2)endl; couts=s(2,2,2)endl; couts=s()endl; couts=s(2,2)endl; couts=s(2,2,2)endl; int s(int i,int j,int k) return i+j+k; 函数原型说明函数原型说明函数原型说明函数原型说明801.定义一个void型函数意味着该函数运行后()A)通过return返回一个用户所希望的函数

40、值B)返回一个系统默认值C)没有返回值D)返回一个不确定的值练习812.运行结果是?#include void fun(int a=4,int b=12,int c=13) couta,b,cendl;void main( ) fun(8); 练习823.运行结果是?int m (int x,int y) int z; z=(xy)? x : y ; return z; void main (void ) int a=6,b=4,c; c=m (a , b) ; coutcendl; 练习834. 运行结果是?#includeiostream.h#includemath.hint add(in

41、t a,int b,int c) return a+b+c; int add(int a,int b) return a+b; void main(void) coutadd(3,5)“ ”; coutadd(3,5,8)endl; 练习84当变量在整个程序执行过程中均有效时,我们称之为全局变量。全局变量只能在所有函数体之外定义。只能在函数体内部起作用,出了函数体范围就不起作用的变量我们称之为局部变量。局部变量只能在函数体内部定义。11.局部变量与全局变量自学int global;/全局变量全局变量 int main() int local;/局部变量局部变量 return 0; 85(1)

42、局部变量局部变量的分类:动态变量(auto):默认,存储在动态区寄存器变量(register):在cpu内部存储静态局部变量(static):存储在静态区11.局部变量与全局变量自学86动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句结束时,空间被程序收回。程序执行到静态局部变量时,为其在静态区开辟存储空间,该空间一直被保留,直到程序运行结束。由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。11.局部变量与全局变量自学int fun(int a) int c; int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x+3); coutyendl;动态局部变量动态局部变量x2ya2b3c54555888输出:变量变量b是动态局部变量,一旦离是动态局部变量,一旦离开其所在的函数,就会释放存储开其所在的函数,就会释放存储空间,数据随同消失。空间,数据随同消失。3 4int fun(int a) int c; static int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论