《Visual C++程序设计》-王永国-电子教案 第5章

上传人:E**** 文档编号:89436726 上传时间:2019-05-25 格式:PPT 页数:66 大小:432.50KB
返回 下载 相关 举报
《Visual C++程序设计》-王永国-电子教案 第5章_第1页
第1页 / 共66页
《Visual C++程序设计》-王永国-电子教案 第5章_第2页
第2页 / 共66页
《Visual C++程序设计》-王永国-电子教案 第5章_第3页
第3页 / 共66页
《Visual C++程序设计》-王永国-电子教案 第5章_第4页
第4页 / 共66页
《Visual C++程序设计》-王永国-电子教案 第5章_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《《Visual C++程序设计》-王永国-电子教案 第5章》由会员分享,可在线阅读,更多相关《《Visual C++程序设计》-王永国-电子教案 第5章(66页珍藏版)》请在金锄头文库上搜索。

1、第5章 函数,5.1 函数概述 5.2 函数的定义、调用与说明 5.3 函数间参数传递 5.4 内联函数 5.5 递归函数 5.6 函数重载 5.7 函数模板 5.8 作用域与存储类别 5.9 应用举例,5.1 函数概述,5.1.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=(

2、a+b+c)/2; s1=sqrt(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; ,函数是一个可以独立完成某个功能的语句块。使用时,可以用简单的方法为其提供必要的数据,执行这段程序后,能保存执行结果并将程序返回到原处继续执行。 C+中的函数如果从用户使用的角度,可以分为标准函数和用户自定义函数。所谓标准函数是系统已实现的并通过函数库形式提供的函数,如sqrt、

3、fabs、strlen等等。程序员在编写程序时可以直接使用标准函数,而不用定义它们。在C+中所有的标准函数都被放置在不同的函数库中,并有一个与之对应的头文件。例如,头文件iostream.h中包含了I/O函数;头文件cmath.h中包含了常用的数学函数等。使用标准函数不仅可以提高开发效率,而且又使程序具有很好的可移植性。然而标准函数毕竟有限,对于一些特殊的需要,用户需要自己编写函数用以解决专门的需要。本章将详细介绍C+中的用户自定义函数,但作为一种面向对象的语言,我们推荐在C+中采用面向对象的设计思想来编写程序。,5.1.2 基本知识,#include “math.h“ #include “i

4、ostream.h“ float area(float x,float y,float z) /定义求三角形面积函数 float l,s ; l = (x + y + z)/2; s = sqrt(l*(l-x)*(l-y)*(l-z); 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); coutsend

5、l; ,5.2 函数的定义、调用与说明,5.2.1 函数的定义,函数类型 函数名(形式参数类型表) 函数体 ,将两数的比较独立出来编一函数:,【例5.1】求三个整型数中最大的数。,int max(int x,int y) int z; if(xy) z=x; else z=y; return z; /将大的数返回 ,void main() int a,b,c,m; cinabc; m=max(a,b); m=max(c,m); coutmendl; ,【例5.2】编一程序,输出如右图形。,#include #include void pic(int n) for(int i=0;in;i+)

6、coutsetw(10-i); /cout.width(10-i);控制每行输出的起始位 for(int j=0;j2*i+1;j+)cout“*“; coutendl; void main() pic(4); pic(6); ,将n行构成的三角形独立出来编一函数:,说明: 函数类型指函数返回值的数据类型 对没有返回值的函数,函数类型定为void型(无类型或空类型)。 形式参数可以为空,但圆括号不能省略。 函数体由语句和其它分程序组成。 函数体中不允许再嵌套定义函数,非void型函数 函数体中必须有return语句,形式为: return 表达式 ; 或 return (表达式) ; 用于返回

7、函数值。表达式值的类型与函数类型最好一致。 void型函数 函数体中return语句可以不出现。若出现, 则不能带表达式。,5.2.2 函数调用,注意: 实参与形参的个数、位置与类型必须一致。它可以是同类型的常量、变量或表达式。 调用的形式可以是表达式,也可以是语句。 函数定义中的形参只有当发生函数调用时,才被分配内存单元。,形式:函数名(实在参数表) 函数调用的过程:,#include “iostream.h“ #include “iomanip.h“ void main() pic(4); /以语句形式调用 pic(6); ,void pic(int n) for(int i=0;in;i

8、+) coutsetw(10-i); for(int j=0;j2*i+1;j+) cout“*“; coutendl; ,函数调用和返回的过程:,输入数据,调用函数,输出,处理过程,函数结束或 函数值返回,注意:数据的输入、输出一般放在主函数中,保存:返回地址、当前现场,恢复:主调程序现场、返回地址,主函数,结束,自定义函数,【例5.3】 求正整数m,n的最大公约数和最小公倍数 。,注意:函数中参数传递是单向“传值”,且自右向左。,/求最大公约数 int gcd(int m,int n) while(int r=m%n) m=n;n=r; return(n); ,/求最小公倍数 int sc

9、t(int m,int n) return( m*n/gcd(m,n) ); ,#include “iostream.h“ void main() int m,n; cinmn; coutgcd(m,n)endl; coutsct(m,n)endl; ,分析:m、n的最小公倍数为: m*n/最大公约数。,函数嵌套调用的示意图:,注意:函数不可嵌套定义,但可以嵌套或递归调用!,形式:函数类型 函数名(形式参数类型表);,#include “iostream.h“ void main() int a,b,c; int max(int x,int y); /函数说明,也可int max(int,in

10、t); cinab; c=max(a,b); couty?x:y ; ,【例5.4】函数说明示例,可省略参数名,注意: 函数调用在前,定义在后,则必须对函数进行说明,函数说明可以放在函数调用之前所在的函数内,也可以放在源文件开头、函数的外部。 函数说明和函数定义在返回类型、函数名和参数表上必须要完全一致。,5.2.3 函数说明(函数原型),float *fun(float x,float y); char *strcat(char *strDest,const char *strSource);,在说明或定义返回值为指针的函数时,只须在函数名前加一指针类型说明符即可。,即函数的返回值可以是变量

11、的地址、数组名或指针变量等。如:,5.2.4 函数返回值为指针,【例5.11】拼接两个字符串s1和s2,将拼接后的字符串存于s1中返回。,char *strcat1(char *s1,const char *s2) char *p=s1; while(*p+); -p; while(*p+=*s2+) ; return(s1); ,思考:若不定义为返回指针值的函数,则程序应如何修改?,void main() char *p1,*p2; p1=new char20; p2=new char5; cinp1p2; coutstrcat1(p1,p2)endl; ,注意:不能返回一个局部变量(在函数

12、内定义的变量)的地址,#include “iostream.h“ int *fun(int x) int y=x*x; return ,p指向的对象已经不存在,5.3 函数间参数传递,参数是调用函数与被调用函数之间交换数据的通道。在C+中,函数的参数不仅可以是基本类型的变量,还可以是指针、数组名和对象名。 此外,C+还提供了默认参数机制,从而可以简化复杂函数的调用。,5.3.1参数的传递方式,1传值方式 传值方式是将实参值的副本传递(拷贝)给被调用函数的形参。传值方式调用的特点:形参的改变不会影响实参的值。传值方式是C+默认的参数传递方式,此前列举的函数中,都是传值参数的实例。,形参:变量 实

13、参:常量、变量和表达式,#include “iostream.h“ void swap(int a,int b) int temp; temp=a;a=b;b=temp; void main() int x,y; cinxy; swap(x,y); cout“x=“x“ y=“yendl; ,【例5.5】分析下面程序,能否交换两个变量的值?,【例5.6】m是一个3位的正整数,将满足m、m2、m3均为回文数的正整数输出。所谓回文数是指顺读与倒读数字相同,如4、151、34543。 分析:将正整数的每位数取出,构造一个逆序的正整数,若该数与原来的相同,即为回文数。,bool pd(int x) i

14、nt m=x,n=0,k; while(x!=0) /构造一逆序数 k=x%10; n=n*10+k; x/=10; return m=n; ,2传址方式,传值调用方式被调函数只能向主调函数传递一个返回值,如果希望形参的改变能影响实参值或者程序需要从函数返回多个值怎么办?解决的办法可以通过传址调用。 (1)形参为指针变量,形参:指针变量 实参:变量的地址、指针变量或数组名 特点:形参的改变能影响实参值,调用时将实参值(地址)传给形参,也就是使实参和形参指向同一存储单元。,【例5.8】交换两个变量的值,#include “iostream.h“ void swap(int * ,int * );

15、 void main() int a,b;cinab; swap( ,【例5.9】随机生成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,x; for(int i=0;i10;i+) x=rand()%100+1; ai=x; fun(a, ,【例5.10】字符串的复制,#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_

展开阅读全文
相关资源
相关搜索

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

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