版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、cchap4利用函数实现制定功能1. 为什么需要函数函数的作用就是:使人把相对独立的某个功能抽象出来,使之成为一个独立的实体。无论将一个程序划分为多少个程序模块即函数,只能有一个main函数,程序运行总是从main函数开场到main函数完毕。21. 为什么需要函数函数包括两种:内置函数和自定义函数:例如,头文件里边的函数都是内置函数,你指定了头文件就可以直接调用;自定义函数需要你自己完成函数定义,函数申明,函数调用。在实际应用中,主函数写的很简单,它的作用就是调用各个函数,程序各局部功能都是由各个函数实现的。31. 为什么需要函数为什么要使用函数?1防止重复的编程。2使程序更加模块化,便于阅读
2、、修改。注意:所编写的函数应尽量少与主调函数发生联络,这样便于移植。参数(多个)函数值(唯一)函数体4if(ab) c=a;else c=b;举例: 找出两个数的最大数void main( ) int a,b,c; cinab; coutcy) z=x;else z=y;52. 定义函数的一般形式C+语言中,函数定义格式: (形参表) 函数体 有两种:外部函数extern通常被缺省内部函数static可以是C+中允许出现的各种类型,如:根本类型、构造变量和对象、指针和引用void等命名规那么同标识符可以是一个或多个参数,参数之间逗号分割,每个参数要给出参数名和类型说明函数的定义包括两局部:函数
3、头和函数体6double 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) ; cout“The max iscendl; 被调函数先定义定义之后再调用形参必须说明参数类型实参传递的是一个详细的值,括号中不必说明参数类型,但实参定义的类型一定和形参一致。函数设计思路73.函数参数和函数值函数参数包括:形式参数和实际参数,即形参与实参。函数的值是指函数的返回值。C+语言中,假设一个函数具有返回值,那么需要在该函数体内有如下
4、形式的返回语句: return ;83.函数参数和函数值float max(float x, float y) float z; z=(xy)? x : y ; return z; void main (void) float a,b, c; cinab; c=max (a , b) ; cout“The max iscab; c=max(a ,b); cout“The max iscy)?x:y; return z;控制转移控制归还调用函数函数调用执行过程最后执行输出语句134.函数调用参数传递函数调用的方式: 作为语句 printstar( ); 作为表达式 c=max(a,b); 作为另
5、一个函数的参数 max(a,max(b,c);144.函数调用参数传递函数调用时,将实参的值传递给被调用函数形参的过程,称为函数的参数传递。 函数参数的传递方式:按值传递按地址传递按引用传递15按值传递传值调用 方式:函数调用时,为形参分配单元,并将实参的值复制到形参中。调用完毕,形参单元被释放,实参单元仍保存并维持原值。特点:形参与实参占用不同的内存单元单向传递4.函数调用参数传递int max (int x,int y) int z; z=(xy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ;
6、cout“The max is cendl; ab23c3xy23z3此函数有返回值17例如include “iostream.hvoid 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此函数无返回值按地址传递传址调用 方式:函数调用时,将数据的存储地址作为参数传递给形参。特点:形参与实参占用同样的存储单元“双向传递实参和形参必须是地址值4.函数调用参数传递4.函数调用参数传递第一种情况:变量
7、的地址作为实参传递给被调用函数的形参,此时形参一定是指针来接收地址值。20include “iostreamusing 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); cout“aa“ b=“bendl;返回a10 xb20y200-180输出:a=200 b=-180214.函数调用参数传递第二种情况:数组名作为实参,此时被调用的函数形参可以是数组名,也可以是指针,此时函数传递的是数组在内存中的首地址,当实参中的数组地址传到形参
8、中,实参形参共用同一段内存。注意:在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;24b0b1a0a1ba416当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 in
9、t a8=1,3,5,7,9,11,13; int m=8; fun(a,m); couta7endl;1357911130b0b1b2b3b4b5b6b7a0a1a2a3a4a5a6a7ba14运行结果?494.函数调用参数传递#include using namespace std;void 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;用指针变量作函数形参接收数组地址1357911130pa
10、0pa1pa2pa3pa4pa5pa6pa7a0a1a2a3a4a5a6a7papa+1pa+2Pa+725练习:方法2:用数组264.函数调用参数传递按引用传递引用作为函数参数由于引用就是给一个变量起别名,所以,当使用引用作函数的参数时,就是将实参变量名赋给形参引用,形参名就等同实参变量名。特点:“双向传递实参和形参就是同一变量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“aa“ b=“bendl;返回相当于 int &x=ax是a的别名相对于 int &
11、y=by是b的别名x10ay20b200-180输出:a=200 b=-180281.void main(void ) printstar ( ); print_message ( ); printstar( );void printstar (void ) cout“* * * * * * * * * * *n; void print_message (void) cout“ How do you do! n; 练习运行结果?292.void fun(int a, int b) a=a*10; b=b+a; coutatbendl;void main(void) int a=2, b=3;
12、fun(a,b); coutatbendl;练习ab23ab23202320 232 330练习:3. 求一维数组的平均值,请将程序填完好#includeusing namepace std;void main() int i, a10; float , mv; for(i=0;i ; mv=mean( ); coutmvendl;float mean(int d10) int i; float avg=0.0; for(i=0;i10;i+) avg+= ; avg/=10; return avg ;aiiadi31int prime(int x)for(int i=2;ix/2;i+) i
13、f(x%i=0) return 0; return 1;void main(void) for(int i=100;i=200; i+) if(prime(i)=1) coutit; 练习4.计算100200之间的素数,用函数prime( )判断一个数是否是素数,假设是该函数返回1,否那么返回0。32int gys(int a, int b) int r; if(axy; coutgys(x,y)endl;33练习6.数组元素作函数实参,用法与一般变量作实参一样,是“值传递。例如:有两个数据系列分别为:int a8=26,1007,956,705,574,371,416,517;int b8=
14、994,631,772,201,262,763,1000,781;求第三个数据系列 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; co
15、utendl;35float average (float array ) int 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个学生成绩,求平均成绩数组名作为形参,与实参数组共占单元数组名作为实参,地址值传
16、给形参数组36score8score6score4score2score0array8array6array4array2array0scorearray37练习例5.12 一个班有n个学生,需要将每个学生的简单资料姓名和学号输入计算机保存,然后可以通过输入某一个学生的姓名查找其有关资料。当输入一个学生姓名后,程序就查找该班中有无此学生,假设有,那么输出他的姓名和学号,假设查找不到,那么输出“本班无此人。38练习设计思想 .调用求平均值函数average(数组名) 调用求最高成绩函数max(数组名) 调用求最低成绩函数min(数组名)调用统计各分数段人数函数count (数组名)主函数调用求平
17、均值函数average(数组名) .求平均值调用统计各分数段人数函数count (数组名)统计个分数段人数39#include #include using namespace std;int main()void input_data(string name50,string num50,int n); void search(string find_name,string name50,string num50 , int n); string find_name; string name50,num50; int n; coutn; input_data(name,num,n); cou
18、tfind_name; search(find_name,name,num,n); return 0;void input_data(string name50, string num50,int n) int i; for (i=0;in;i+) coutinput name and number of student i+1nameinumi; 41void search(string find_name,string name50,string num50, int n)int i; bool flag=false; for(i=0;in;i+) if(namei=find_name)
19、coutnamei numiendl; flag=true; break; if(flag=false) coutcant find this name;42运行结果:435. 函数的嵌套调用自学嵌套调用:一个函数调用另一个函数时,被调用函数又调用了其它函数。C+语言规定:C 函数不允许嵌套定义,但允许嵌套调用。445. 函数的嵌套调用自学int max ( int a, int b) int c; int min ( int a, int b) return ( ab? a : b); 嵌套定义 不允许,错455. 函数的嵌套调用自学调用 b 函数a 函数b 函数main 函数调用 a 函数
20、结束(2)(3)(4)(5)(6)(7)(8)(9)a函数结束b函数结束在main函数中调用a函数,在a函数中又调用b函数嵌套调用46例如:求1K+2K+3K+NK 的和int power(int m,int n)/mn int 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)496.递归调用自学递归调用的过程“递推阶段:现将原问题不断分解为新的子问
21、题,逐渐地从未知向的方向推测,最后到达的条件,即递归完毕条件。“回归阶段:该阶段从条件出发,按递推的逆过程,逐一求值回归,最后到达递推的开场处,完毕回归阶段,完成递归调用。506.递归调用自学实现递归调用的方法 求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;递归完毕条件进展递归调用516.递归调用自学递归调用的过程2!=2* 1!3!=3*2!1!=13!=
22、62!=2第一阶段“递推第二阶段“回推条件,即“递推完毕条件526.递归调用自学fac (3)n=3y=3*fac (2)fac (2)n=2y=2*fac (1)fac (1)n=1y=1return yreturn yy=2return yy=6536.递归调用自学int 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;结果是:?15546.递归调用自学void recur(char c) coutc;
23、if(c5) recur(c+1); cout=10) f(n/10); coutnendl;void main(void) f(123);结果是:112123567.内置函数函数调用时需要做的工作:执行调用函数之前的语句执行调用函数a的语句时,要记下刚刚执行的指令地址,保护现场信息,以便函数返回之后继续执行。之后程序运行转到a函数,同时进展参数传递执行被调用函数aa函数执行完,需要返回到先前记下的地址处,并根据记忆的信息“恢复现场,继续执行主函数中未执行的语句,直到完毕结论:调用函数需要花费一定的时间,假设频繁调用一个函数,会花费更长的时间,这样会降低程序执行的效率。577.内置函数内置函数
24、也称内联函数,其引入的原因是:减小函数的频繁调用次数,进步程序的运行效率在遇到调用内联函数的地方,用函数体中的代码来交换函数的调用运行机制与宏定义类似587.内置函数内联函数的定义方法inline 函数类型 函数名(参数表)函数体关键字596.内置函数#include inline int cube_int(int n); void main() for(int i(1);i=5;i+) int p=cube_int(i);couti*;couti*;couti=px;/输入2coutsin(x,x)endl;coutsin(x,10)endl; 1. 参数类型上不同的重载函数sin(x,x)
25、sin(x,10)结果:?657.函数的重载#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);void print(int n) coutn*nendl; void print(double n) coutn+nendl; 例如:运行结果644225966#includeiostream.h#includemath.hint add(int a,int b,int
26、 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)endl; 2. 参数个数上不同的重载函数3个参数2个参数结果:3+5=83+5+8=1667#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_m
27、ax=id1d2d3; d=max(d1,d2,d3); coutd_max=da) a=b; return a;double max(double a,double b,double c)if(ba) a=b; if(ca) a=c; return a;689.函数的模板函数重载实现了函数名多用,但在程序中,仍然需要分别定义每个函数,尽管每个函数的函数体根本类似。函数模板是指建立一个通用函数,其函数类型和形参类型不详细指定,用一个虚拟的类型来代表,这个通用函数称为函数模板。699.函数的模板但凡函数体一样的函数都可以用定义的模板来代替。定义函数模板的一般形式:template 通用函数定义或
28、template 通用函数定义70int main()int i1=185,i2=-76,i3=567,i; double d1=56.87,d2=90.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)
29、if(ba) a=b; if(ca) a=c; return a;调用函数时,编译系统自动将函数名max与模板max相匹配,将实参类型取代模拟类型T结果:i_max=567g_max=6734567110.有默认参数的函数一般情况下,在函数调用时,形参从实参那里获得值,因此实参的个数要和形参一样。但有时需要对同一个函数实现屡次调用,每次调用需要传递一样的参数,为了方便、灵敏,C+提供了带有默认参数的函数。7210.有默认参数的函数在函数定义或函数原型说明时,在函数的形式参数表中,给假设干个形式参数规定默认值,那么称这些参数为默认参数,又称可选参数。 使用原那么:函数调用时,假设不给出实参,那么
30、取默认值作为实参值。7310.有默认参数的函数例如int s(int i1,int j2) return i+j;void main( ) couts=s(2,2)endl; couts=s( )endl; 运行结果s=4s=3给实参了,就用实参值没有给实参,就用默认参数值74例:分析以下程序的输出结果。#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=
31、3a=4,b=5,c=3a=7,b=8,c=9 第1次调用没有参数使用默认值第2次调用1个参数,将9赋给a,其他变量用默认值第3次调用2个参数,将4赋给a,5赋给b,c变量用默认值第4次调用3个参数,分别赋给a,b,c75默认参数说明:假设函数有多个参数,那么具有默认值的参数必须排在那些没有默认值的参数的右边。即默认值的指定,必须从参数表的右边开场,指定默认值的参数右边不允许有没指定的参数默认值。10.有默认参数的函数int s(int i,int j2) return i+j; void main( ) couts=s(2,2)endl; couts=s(1)endl; 运行结果s=4s=3
32、默认参数说明: 当函数的多个参数具有默认值时,调用函数所给的实在参数与形式参数匹配是按照从左到右的顺序进展,没有给定的实参,那么使用函数的默认值。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; 运行结果s=6s=7s=678默认参数说明: 当函数需要原型说明时,默认的参数值应设置在函数原型说明中,不应在函数定义中设置;假设没有函数原型说明,那么参数默认值可在定义中设置。 函数原型说明
33、可以说明屡次,也可以在各个函数原型中设置不同的参数具有默认值。10.有默认参数的函数例如#include void main( ) int s(int i=1,int j=2,int k=3 ); couts=s()endl; couts=s(2,2)endl; couts=s(2,2,2)endl; int s(int i=2,int j=3,int k=4); 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; 运行结果s=6s=7s=6s=9s=8s=6函数
34、原型说明函数原型说明801.定义一个void型函数意味着该函数运行后A通过return返回一个用户所希望的函数值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; 练习8
35、34. 运行结果是?#includeiostream.h#includemath.hint add(int 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;/全局变量
36、int main() int local;/局部变量 return 0; 85(1) 局部变量局部变量的分类:动态变量auto:默认,存储在动态区存放器变量register:在cpu内部存储静态局部变量static:存储在静态区11.局部变量与全局变量自学86动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句完毕时,空间被程序收回。程序执行到静态局部变量时,为其在静态区开拓存储空间,该空间一直被保存,直到程序运行完毕。由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。11.局部变量与全局变量自学int fun(int a) int c; int b=3; c=a
37、+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x+3); coutyendl;动态局部变量x2ya2b3c54555888输出:变量b是动态局部变量,一旦分开其所在的函数,就会释放存储空间,数据伴随消失。34int 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+3); coutyendl;只赋一次初值x2ya2b3c5455a5c599输出:变量b是静态局部变量,在内存一旦开拓空间,就不会释放,空间值一直保存直到整个程序完毕9int f (int a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 事业单位法律岗面试易错题题库试卷及参考答案 202
- 事业单位法律岗历年真题试卷及参考答案
- 2026事业单位财会岗面试高频考题题库及参考答案
- 事业单位土木工程岗面试全真模拟试卷及参考答案2026
- 2026年湖南财经工业职业技术学院高职单招笔试化学历年参考题库含答案解析
- 2026年湖南工艺美术职业学院高职单招笔试综合素质历年参考题库含答案解析
- 2026年湖南信息职业技术学院高职单招笔试职业技能测验历年参考题库含答案解析
- 2026年湖北交通职业技术学院高职单招笔试物理历年参考题库含答案解析
- 2026年淄博职业学院高职单招笔试职业技能测验历年参考题库含答案解析
- 2026年浙江经济职业技术学院高职单招笔试职业技能测验历年参考题库含答案解析
- 北京安全员C证考试题库及详细答案(完整版)
- 2026-2027学年广东六校高三上学期10月考试语文试卷
- 2026年中储粮质量检验岗位面试常见问题及解答
- 第2课 俄国的改革 课件
- 2026秋新教材苏教版五年级上册数学第七单元 用字母表示数量关系(一) 教案(共7课时)
- 建筑幕墙高空作业方案
- 2026年辅警笔试的题库及答案
- 初中化学九年级《碳单质的多样性》创新教学设计
- 2026年长期照护题测试卷附答案
- 填埋场环境风险管控方案
- 创伤性心搏骤停心肺复苏救治专家共识(2025版)完整版 + 损伤控制操作路径
评论
0/150
提交评论