第五部分函数演示教学

上传人:yulij****0329 文档编号:138609506 上传时间:2020-07-16 格式:PPT 页数:58 大小:411KB
返回 下载 相关 举报
第五部分函数演示教学_第1页
第1页 / 共58页
第五部分函数演示教学_第2页
第2页 / 共58页
第五部分函数演示教学_第3页
第3页 / 共58页
第五部分函数演示教学_第4页
第4页 / 共58页
第五部分函数演示教学_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《第五部分函数演示教学》由会员分享,可在线阅读,更多相关《第五部分函数演示教学(58页珍藏版)》请在金锄头文库上搜索。

1、第五章 函数,5.1 函数的定义、调用与说明 5.2 函数间参数传递 5.3 递归函数 5.4 函数参数缺省 5.5 函数重载 5.6 函数模板 5.7 作用域与存储类,5.1.1 引例 已知五边形的各条边的长度,计算其面积 计算多边形面积,可将多边形分解成若干个三角形,计算三角形面积的公式如下:,5.1 函数的定义、调用与说明,用前面所学的知识实现:,#include math.h #include iostream.h void main() float a,b,c,d,e,f,g,p1,p2,p3,s1,s2,s3,s; cinabcdefg; p1=(a+b+c)/2; s1=sqrt

2、(p1*(p1-a)*(p1-b)*(p1-c); p2=(c+d+e)/2; s2=sqrt(p2*(p2-c)*(p2-d)*(p2-e); p3=(e+f+g)/2; s3=sqrt(p3*(p3-e)*(p3-f)*(p3-g); s=s1+s2+s3; coutsendl; ,用函数实现:,#include math.h #include iostream.h float area(float x, float y, float z) /定义求三角形面积函数 float c,s ; c = (x + y + z)/2; s = sqrt(c*(c-x) * (c-y) * (c-z)

3、; return s; void main() /主函数 float a,b,c,d,e,f,g,s; cinabcdefg; s=area(a,b,c)+area(c,d,e) +area(e,f,g); coutsendl; ,特点: 函数具有相对独立的功能 函数与函数之间通过参数(输入)和返回值(输出)来联系 使用函数有利于代码重用,提高开发效率,【例5.2】编一程序,输出如右图形。,void pic(int n) for(int i=0;in;i+) cout.width(10-i); /控制每行输出的起始位 for(int j=0;j2*i+1;j+)cout*; coutendl;

4、 void main() pic(4); pic(6); ,将n行构成的三角形独立出来编一函数:,非void型函数 函数体中必须有return语句,形式为:return 表达式 ; 或 return (表达式) ; 用于返回函数值。表达式值的类型与函数类型最好一致。 void型函数 函数体中return语句可以不出现。若出现,则不能带表达式。,说明: 函数类型指函数返回值的数据类型 函数体由语句和其它分程序组成。 形式参数可以为空,但圆括号不能省略。 函数体中不允许再嵌套定义函数 对没有返回值的函数,函数类型定为void型(无类型或空类型)。,5.1.3 函数调用,形式:,函数名(实在参数表)

5、,注意: 实参与形参的个数、位置与类型必须一致。它可以是同类型的常量、变量或表达式。 调用的形式可以是表达式,也可以是语句。 函数定义中的形参只有当发生函数调用时,才被分配内存单元。,函数调用的过程:,#include iostream.h #include iomanip.h void main() pic(4); /以语句形式调用 pic(6); ,void pic(int n) for(int i=0;in;i+) cout.width(10-i); for(int j=0;j2*i+1;j+) cout*; coutendl; ,函数调用和返回的过程:,主函数,输入数据,调用函数,输出

6、,自定义函数,处理过程,函数结束或 函数值返回,注意:数据的输入、输出一般放在主函数中,保存:返回地址、当前现场,恢复:主调程序现场、返回地址,结束,【例5.3】 求正整数m,n的最大公约数和最小公倍数 。 分析:m、n的最小公倍数为: m*n/最大公约数。,注意: 函数中参数传递是单向“传值”。,int gcd(int m,int n) /求最大公约数 while(int r=m%n) m=n;n=r; return(n); ,int sct(int m,int n) /求最小公倍数 return( m*n/gcd(m,n) ); ,#include iostream.h“ void mai

7、n() int m,n; cinmn; coutgcd(m,n)endl; coutsct(m,n)endl; ,函数嵌套调用的示意图:,5.1.4 函数说明(函数原型),形式: 函数类型函数名(形式参数类型表);,#include iostream.h void main() int a,b,c; int max(int x,int y); /函数说明,也可int max(int,int); cinab; c=max(a,b); couty?x:y ; ,【例5.4】函数说明示例,省略参数名,注意: 函数调用在前,定义在后,则必须对函数进行说明,函数说明可以放在函数调用之前所在的函数内,也可

8、以放在源文件开头、函数的外部。 函数说明和函数定义在返回类型、函数名和参数表上必须要完全一致。,5.2 函数间参数传递,5.2.1 传值参数 特点:形参的改变不会影响实参的值 【例5.5】m是一个3位的正整数,将满足m、m2、m3均为回文数的正整数输出。所谓回文数是指顺读与倒读数字相同,如4、151、34543。 分析:将正整数的每位数取出,构造一个逆序的正整数,若该数与原来的相同,即为回文数。,bool palindrome(int x) int m=x,n=0,k; while(x!=0) /构造一逆序数 k=x%10; n=n*10+k; x/=10; return m=n; ,实参:常

9、量、变量和表达式。 形参:变量,#include iostream.h void swap(int x,int y) int temp; temp=x;x=y;y=temp; void main() int a,b; cinab; swap(a,b); couta=a b=bendl; ,【例5.6】分析下面程序,能否交换两个变量的值?,5.2.1 指针参数 1形参为指针变量 特点:形参的改变能影响实参值 【例5.7】交换两个变量的值,形参:指针变量 实参:变量的地址、指针变量或数组名,#include iostream.h void swap(int * ,int * ); void mai

10、n() int a,b;cinab; swap(,【例5.8】随机生成10个1100之间的数放在一维数组中,求其平均值及最大的元素值 。,程序:,#include iostream.h #include stdlib.h const int N=10; void fun(float *p,float *p1,int *p2) float sum,max1; sum=max1=*p+; for(int i=1;iN;i+) if (max1*p) max1=*p; sum=sum+*p;p+; *p1=sum/N; *p2=max1; void main() float a10,aver,max

11、,x; for(int i=0;i10;i+) x=rand()%100+1; ai=x; fun(a, ,【例5.9】字符串的复制,#include iostream.h void copy_string(char *from, char *to) while(*from!=0) *to+=*from+; *to=0; void main() char a=I am a teacher., b=You are a student.; coutaendlbendl; copy_string(a,b); coutaendlbendl; ,程序:,注意:若对应的实参是指针变量,则该指针应有确定的指

12、向。,void main() char *a,*b; a=new char40; b=new char20; cinab; copy_string(a,b); couta bendl; delete a; delete b; ,若该二语句删除,程序运行时将异常终止。,2形参为常指针 防止被调函数对实参所指对象的修改,#include iostream.h int f(const int * p) int a=100; a=*p; return a; void main() int x=5; coutf( ,*p=a; return *p;,错误,不能修改const对象,注意:若实参是常对象的地

13、址,则形参必须定义为常指针。,#include iostream.h int f(const int *p) int a=100; a=*p; return a; void main() const int x=5; coutf( ,形参不能定义为int *p,3函数返回值为指针 即函数的返回值可以是变量的地址、数组名或指针变量等。 如:,float *fun(float x,float y); char *strcat(char *strDest,const char *strSource);,在说明或定义返回值为指针的函数时,只须在函数名前加一指针类型说明符即可。,【例5.10】拼接两个字

14、符串s1和s2,将拼接后的字符串存于s1中返回。,char *strcat1(char *s1,const char *s2) char *p=s1; while(*p+); -p; while(*p+=*s2+) ; return(s1); ,思考:若不定义为返回指针值的函数,则程序应如何修改?,注意:不能返回一个局部变量(在函数内定义的变量)的地址,#include iostream.h int *fun(int x) int y=x*x; return ,p指向的对象已经不存在,5.2.2 引用参数,#include iostream.h void swap(int ,void sort

15、(int x,int n) int i,j,k,w; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+)if(xkxj)k=j; if(i!=k)w=xi;xi=xk;xk=w; ,数值型数组的元素个数一般须传给形参,【例5.13】 求字符串长度,并调用之。,int len(char s) int i=0; while(si!=0)i+; return i; ,调用: coutlen(str);,字符型数组的元素个数一般不用传给形参,注意: 形参和实参的类型应保持一致。 函数头里的参数,要一个一个地分别说明或 列出。 下面是几种函数头正确与错误的写法:,int m(int x4,int y),int m(int x,int y),5.2.4 对象参数,【例5.14】 统计字符串str1中出现子串sub的个数,实参为CString对象,则形参可以是: (1) CString 参数,对形参的改变不影响实参; (2) CString i=str1.Find(sub); while(i=0) count+; k=str1.GetLength(); str1=str1.Mid(i+1,k-i); i=str1.Find(sub); return count; ,5.3 递归函数,用自身的结构来描述自身就称为递归。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号