Visual-C--程序的设计第5章-PPT精选课件_第1页
Visual-C--程序的设计第5章-PPT精选课件_第2页
Visual-C--程序的设计第5章-PPT精选课件_第3页
Visual-C--程序的设计第5章-PPT精选课件_第4页
Visual-C--程序的设计第5章-PPT精选课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

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

2、1*(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; coutsabcdefg; s=area(a,b,c)+area(c,d,e) +area(e,f,g); coutsy) 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】编一

3、程序,输出如右图形。 #include #include void pic(int n) for(int i=0;in;i+) 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型函数函数

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

5、pic(6);void pic(int n) for(int i=0;in;i+) coutsetw(10-i); for(int j=0;j2*i+1;j+) cout*; coutmn;coutgcd(m,n)endl;coutsct(m,n)ab; c=max(a,b); coutcy?x:y ; 【例5.4】函数说明示例 可省略参数名注意:函数调用在前,定义在后,则必须对函数进行说明,函数说明可以放在函数调用之前所在的函数内,也可以放在源文件开头、函数的外部。 函数说明和函数定义在返回类型、函数名和参数表上必须要完全一致。5.2.3 函数说明(函数原型)float *fun(float

6、 x,float y);char *strcat(char *strDest,const char *strSource); 在说明或定义返回值为指针的函数时,只须在函数名前加一指针类型说明符即可。 即函数的返回值可以是变量的地址、数组名或指针变量等。如: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); 思考:若不定义为返回指针值的函数,则程序应如何修

7、改?void main()char *p1,*p2; p1=new char20; p2=new char5; cinp1p2; coutstrcat1(p1,p2)endl;注意:不能返回一个局部变量(在函数内定义的变量)的地址#include iostream.hint *fun(int x) int y=x*x; return &y;void main() int a=5, *p; p=fun(a); coutxy;swap(x,y);cout“x=x y=yab; swap(&a,&b); coutabendl;void swap(int *x,int *y)int temp=*x;

8、*x=*y; *y=temp; 【例5.9】随机生成10个1100之间的数放在一维数组中,求其平均值及最大的元素值 。#include iostream.h#include stdlib.hconst 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;i1

9、0;i+) x=rand()%100+1; ai=x; fun(a,&aver,&max);/注意实参的写法 coutavermaxendl;【例5.10】字符串的复制#include iostream.hvoid 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); coutaendlbab; copy_string(a,b)

10、; couta bendl; delete a; delete b;若该二语句删除,程序运行时将异常终止。 #include iostream.h int f(const int * p) int a=100; a=*p; return a;void main() int x=5; coutf(&x); *p=a; return *p;错误,不能修改const对象 为了防止被调函数对实参所指对象的修改,可将形参设为常指针。 若实参是常对象的地址,则形参必须定义为常指针。#include iostream.hint f(const int *p)int a=100; a=*p; return a

11、;void main() const int x=5; coutf(&x);形参不能定义为int *p(2) 数组名作参数 形参:数组名 实参:数组名或指针变量 特点:在被调函数中对形参数组的任何改变均会影响实参所指地址里的内容 。【例5.12】对含有n个元素的整型数组a,从大到小进行排序。 调用:sort(a,10);void sort(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】 求字

12、符串长度,并调用之。 int len(char s) int i=0; while(si!=0)i+; return i; 调用: coutxy; swap(x,y); cout x=xy=10&flag) /判断是否降序数 if(x/10%10=x%10) x/=10; else flag=0; return flag;函数在定义时预先给定一个缺省的形参值,调用时给出的优先。5.3.2 函数参数缺省 #include iostream.h#include math.hdouble s(double x , double eps=1e-6) int n=1; double w=0.0, t=1

13、.0 ; while(fabs(t)=eps) w+=t; t=t*x/(n+); return w; void main() couts1=s(2.0); couts2=s(3.0); couts3=y?x:y;void main() coutmyMax(3,6)endl; 关键字inline将函数myMax说明成内联函数。其使用方式和一般函数一样,只不过在程序执行时并不产生函数调用,而是在函数调用处将函数代码展开执行。内联函数的定义必须出现在内联函数第一次被调用之前。 当然,内联函数也有一定的局限性,就是函数中的代码不能太多,函数体内不能有循环语句和switch语句,结构也不能太复杂。 C

14、+中之所以引入内联函数,这与宏函数固有缺陷有关。5.5 递归函数 用自身的结构来描述自身就称为递归(直接、间接)。最典型的例子是对阶乘运算: n!=n(n-1)! (n-1)!=(n-1)(n-2)! 1!=1 特点:原始问题可转化为解决方法相同的新问题;新问题的规模比原始问题小;新问题又可转化为解决方法相同的规模更小的新问题,直至终结条件为止。fac(2)=2*fac(1)fac(1)=1fac(4)=4*6fac(3)=3*2fac(2)=2*1fac(3)=3*fac(2)fac(4)=4*fac(3)【例5.15】编fac(n)=n! 的递归函数long fac(int n) if(n

15、=1) return(1); return (n*fac(n-1);递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。回归过程:不断从栈中弹出当前的参数,直到栈空。思考:若fac函数中没有语句 if(n=1) return(1);程序运行结果将如何?递推回归【例5.16】用递归函数实现将一个十进制整数转换成二至十六任意进制的字符 void convert(int m,int r) char b17=0123456789ABCDEF; if(m!=0) convert(m/r,r);cout0)px(x,n) =x n=1x*(1-px(x,n-1) n1#include iostrea

16、m.hdouble px(double x,int n) if (n=1) return (x); else return(x* (1-px(x,n-1);void main()double x; int n; coutxn; coutpx=px(x,n)endl;【例5.18】输入一个正整数,要求用递归方法实现以相反的顺序输出该数。#include iostream.hvoid printn(int n)if (0=n & n=9) coutn; else coutn%10; printn(n/10); void main() int num; coutnum; printn(num); c

17、outendl;5.6 函数重载引例:求不同类型数据的绝对值不足:易出错、难记忆函数重载:一组参数(个数或类型)不同的函数共用一个函数名。不同名函数实现同一类的操作#include #include void main()int x1=-1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutfabs(x2)endl; coutlabs(x3)endl; 【例5.20】#include int abs(int x)return x0?x:-x; double abs(double x)return x0?x:-x; long abs(long x)

18、return x0?x:-x; void main()int x1=1; double x2=2.5; long x3=3L; coutabs(x1)endl; coutabs(x2)endl; coutabs(x3)endl; 1. 参数类型不同的重载函数编译器会根据函数参数的类型来确定应该调用哪个函数2. 参数个数不同的重载函数可见:重载使得函数的使用更加灵活、方便。 它体现了C+对多态性的支持一个名字,多个入口 。 【例5.21】#include int min(int a,int b) return ab?a:b; int min(int a,int b,int c)int t=min

19、(a,b); return min(t,c);int min(int a,int b,int c,int d)int t1=min(a,b); int t2=min(c,d); return min(t1,t2);void main() coutmin(13,5,4,9)endl; coutmin(-2,8,0)*、:、?: 这五个运算符外,其他运算符都可以重载。由于很多符号是一元运算符和二元运算符公用的(如*既可以用于间接访问也可用于两数相乘),为了避免含混,不得为重载的运算符函数设置默认值,调用时也就不得省略实参。4)除了new和delete这两个较为特殊的运算符以外,任何运算符如果作为成

20、员函数时不得重载为静态函数。=、()、- 以及所有的类型转换运算符只能作为成员函数重载,而且是不能针对枚举类型操作数的重载。class与typename等价5.7 函数模板 函数模板用来定义一个通用函数,可以对不同类型的数据进行相同的处理,其作用与函数重载相似,但代码要简单许多。而使用函数重载则需编写多个函数。 利用函数模板定义的函数称为模板函数,形式:template 类型 函数名( 参数表)【例5.22】#include template T min(T a,T b)return ab?a:b; void main() coutmin(3,5)endl; coutmin(8.5,5.6)e

21、ndl;1)定义一个数据类型T2)使用模板函数时,模板中的类型参数T用实参的类型替换分析以下几种模板函数:template T fun1(T a,int b) /可含有模板参数表中未给出的数据类型 template /模板中可带有多个参数 void fun1(T1 a,T2 b,T3 c) template void fun1(int a,int b) /必须至少有一个参数的类型为模板的 /类型参数,即使函数体中出现也不可template void fun1(int a,int b) T i,j; 【例5.23】定义一个通用的函数,对n个数按递增排序。 #include iostream.h

22、template void sort(TEM x,int n) int i,j,k; TEM w; for(i=0;in-1;i+) k=i; for(j=i+1;jxj)k=j; if(i!=k) w=xi;xi=xk;xk=w; void main()int i,a6=6,9,2,4,1,0; float b4=5.5,8.0,3.3,0; sort(a,6); sort(b,4); for(i=0;i6;i+) coutaiendl; for(i=0;i4;i+) coutbix; cout digit(x)endl;全局变量(外部变量):在函数外部定义的变量局部变量(内部变量):在函数

23、内部定义的变量,包括形式参数生存期:指变量的存在时间,是一个时间概念(在什么时间存在),由变量的存储类别(自动和静态的局部变量和全局变量)决定。初始化 :5.8.1 自动变量(auto)缺省的存储类别作用域:从定义点开始到所在的分程序结束,作用域不可以扩展 生存期:开始执行分程序就生成,分程序执行结束就消亡初始化:可以初始化,缺省值为随机值。【例5.23】自动变量示例。#include iostream.h int f(int x)x+; int y=5; /auto int k=5; y+; return x+y; void main()int k=2; coutf(k)endl; cout

24、f(k+1)endl; 注意:只有内部变量存储类别才能auto5.8.2 静态局部变量(static)作用域:从定义点开始到所在的分程序结束。作用域不可以扩展。生存期:在程序执行过程中始终存在,直到整个程序运行结束。初始化:在开始执行程序时初始化,缺省值为0或0 。只初始化一次。 一个函数可能被调用多次,前一次调用的结果带到下一次去。#include iostream.hint fac(int n) static int f=1; f=f*n; return(f);void main() auto int i; for(i=1;i=5;i+) couti!=fac(i);【例5.25】计算15

25、的阶乘。5.8.3 全局变量 全局变量又称外部变量,是在函数外定义的变量。作用域:从定义点开始到所在的文件结束生存期:程序的整个执行周期初始化:可以初始化,缺省值为0或0 。作用域可以扩展: 向上扩展 横向扩展,扩展到另一个文件注意:扩展的地方不能初始化#include iostream.hint m=10; void f1(int n) n=2*n;m=m/3; int n; void f2() n=5;m+;n+; void main() int n=2; f1(n); f2(); coutmnendl; 【例5.26】外部变量示例注意:外部变量的作用域只限于定义处到文件结束,定义点之前的

26、函数或其它文件中的函数不可以引用该外部变量。 可以使用extern声明符来扩展外部变量的作用域 外部变量与局部变量同名,起作用的是局部变量1. 作用域向定义点之前的函数扩展 #include extern int i;void fun() /extern int i; 错误 couti;void g()i+;int i=5;void main() int j=20; coutj; g(); fun();#include extern int i; /不能初始化void fun() / extern int i; couti;int i=5;void main() int j=20; coutj

27、; fun(); 2.作用域扩展到另一个文件/file1.cpp#include iostream.hextern max,min;void main() void maxmin(int x,int n); int a10=11,2,3,-4,5,6,7,8,0,20; maxmin(a,10); coutmax minendl;/file2.cppint max,min; void maxmin(int x,int n) max=x0;min=x0; for(int i=0;imax)max=xi; if(xix; for(n=6;n=x;n+=2) for(a=3;a=n/2;a+=2)

28、if(isprime(a) & isprime(n-a) coutn=a+n-a0。但这样处理的数据是从个位向前的,所以还要作反转处理。程序: #include iostream.h #include string.h void main() void itoc(int,char ); int n;char s100; cinn; itoc(n,s); coutsendl; void itoc(int n,char s) void reverse(char ); int i=0; int sign; if(sign=n)0); if(sign0) si+=-; si=0; reverse(s); void reverse(char s) int c,i,j; j=strlen(s)-1; for(i=0;ij;i+,j-) c=si;si=sj;sj=c; si+j+1=0;【例5.30】用梯形法求积分:分析:n等分积分区间a,b,每一个小梯型的面积和即近似为f(x)在a,b的积分值。即将求积分转化求和。#incl

温馨提示

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

评论

0/150

提交评论