c++课件第四章函数与预处理_第1页
c++课件第四章函数与预处理_第2页
c++课件第四章函数与预处理_第3页
c++课件第四章函数与预处理_第4页
c++课件第四章函数与预处理_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 函数与预处理4.1概述函数的功能是接收一些参数,执行代码,然后向调用者返回一个值。void类型的函数不返回任何值,但其它类型的函数要返回该类型的一个对象。因为语言让编译器在处理函数调用时执行更完全的检查功能,所以函数在使用之前一定要先用函数原型来声明。下面的例子说明sum()函数声明、调用和定义的过程。【例】sum()函数声明、调用和定义实例。#includevoid main()int a,b,c;int sum(int,int); / 用原型声明sum()函数a = 25;b = 36;c = sum(a,b); /调用sum函数coutcendl;int sum(int x,in

2、t y) /定义sum()函数int temp;temp = x+y;return temp;例4.1 在主函数中调用其它函数#include using namespace std;void printstar(void)cout*endl;void print_message(void)coutWelcometo C+!endl;int main()printstar();print_message();printstar();return 0;*Welcometo C+!*4.2 定义函数的一般形式4.2.1 定义无参函数的一般形式类型标识符 函数名(void)声明部分 语句4.2.2

3、类型标识符 函数名(形式参数表列)声明部分 语句4.3 函数参数和函数的值4.3.1 形式参数和实际参数在定义函数时指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,因此称它们为形式参数,在函数调用时,才为形参分配内存单元,以便实参的值传给形参;例4.2 调用函数时的数据传递#include using namespace std;int max(int x,int y) int z;z=xy?x:y;return (z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;please enter two in

4、teger numbers:2 3max=34.3.2 函数的返回值函数调用表达式的类型为在函数定义中为该函数指定的类型,如果其类型不为void的话,这个表达式值就是函数定义中的return语句所返回的值,否则类型为void,它表示一个无值表达式。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。函数的类型缺省时是int型:#include fun(int k)return k;void main()int f=88;coutfun(f)endl;884.4 函数调用4.4.1 函数调用一般形式 函数名(实参表列)实参表是用逗号隔开的一个表达式列表,在函数调用时,实参的值

5、传给形参;在实参表中,实参的个数必须和形参的个数相同,实参的类型必须和对应的形参的类型一致(或赋值兼容),实参与形参顺序对应。当在函数定义中没有指定形参时,调用表达式中的实参表为空,但函数调用运算符不能缺省。例如:int value();void main() coutvalue();int value() return 55*8;4.4.2 函数调用的方式1. 函数语句 2. 函数表达式 c=2*max(a,b);3. 函数参数 m=max(a,max(b,c);4.4.3对被调函数的声明和函数原型(1) 首先被调用的函数必须是已经存在的,但还需要(2) 如果使用库函数,得用#include

6、命令,将有关的头文件“包含”到本文件中来。(3) 如果使用用户自己定义的函数,调用在前,定义在后,则必须对被调用函数作声明。#include void main()float add(float x,float y);float a,b,c;coutab;c=add(a,b);coutsum=cendl;float add(float x,float y)return x+y;please enter a,b:123.68 456.45sum=580.134.5 内置函数在编译时将所调用的函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(有的教材称内联

7、函数或内嵌函数)。例4.4 函数指定为内置函数#include inline int max(int,int,int);void main()int i=10,j=20,k=30,m;m=max(i,j,k);coutmax=ma) a=b;if(ca) a=c;return a;max=304.6 函数的重载C+允许同一函数名定义多个函数,使用时根据参数的个数和参数的类型来决定调用哪个函数。这就是函数重载。例4.5 求3个数中最大的数(分别考虑整数、双精度数和长整数)#include using namespace std;void main()int max(int,int,int);do

8、uble max(double,double,double);long max(long,long,long);int i1,i2,i3;cini1i2i3;couti_max=max(i1,i2,i3)d1d2d3;coutd_max=max(d1,d2,d3)g1g2g3;coutg_max=max(g1,g2,g3)a) a=b;if(ca) a=c;return a;double max(double a,double b,double c)if(ba) a=b;if(ca) a=c;return a;long max(long a,long b,long c)if(ba) a=b;i

9、f(ca) a=c;return a;185 -76 567i_max=56756.87 90.23 -3214.78d_max=90.2367854 -912456 673456g_max=673456例4.6 #include using namespace std;void main()int max(int,int,int);int max(int,int);int a=8,b=-12,c=27;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)a) a=b;if(ca) a=c;return a;int max(int a,int

10、b)if(ab) return a;else return b;max(a,b,c)=27max(a,b)=84.7函数模板所谓的函数模板,实际上是建立一个通用的函数,其函数类型和形参的类型不具体指定,用一个虚拟的类型来代表,这个通用的函数就称为函数模板。在调用函数时系统会根据实参的类型来取代模板中虚拟类型,从而实现不同的函数功能。例4.7 将例4.5改为通过函数模板来实现。#include using namespace std;template/templateT max(T a,T b,T c)if(ba) a=b;if(ca) a=c;return a;void main()int i

11、1=185,i2=-76,i3=567;couti_max=max(i1,i2,i3)endl;double d1=56.87,d2=90.23,d3=-3214.78;coutd_max=max(d1,d2,d3)endl;long g1=67854,g2=-912456,g3=673456;coutg_max=max(g1,g2,g3)endl;i_max=567d_max=90.23g_max=673456类型参数可以不只一个,如:template 4.8 有默认参数的函数例4.8 求两个或3个正整数中的最大数,用带有默认参数的函数实现。#include using namespace

12、std;void main()int max(int a,int b,int c=0);int a,b,c;cinabc;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)a) a=b;if(ca) a=c;return a;14 -56 135max(a,b,c)=135max(a,b)=14使用带有默认参数的函数时有两点注意:(1) 对于先使用后定义的函数,默认参数值必须在函数声明时给出,以通知编译系统。(2) 一个函数不能既作为重载函数,又作为有默认参数的函数。这样会产生二义性。#include using namespace std;

13、void main()int max(int a,int b,int c=0);int max(int,int);int a,b,c;cinabc;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)a) a=b;if(ca) a=c;return a;int max(int a,int b)if(ab) return a;else return b;error C2668: max : ambiguous call to overloaded function4.9 函数的嵌套调用例4.9 P106#include #include#incl

14、udeusing namespace std;double f(double);double xpoint(double,double);double root(double,double);void main()double x1,x2,f1,f2,x;docoutx1x2;f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);coutsetiosflags(ios:fixed)setprecision(7);coutA root of equation is x0)y1=y;x1=x;elsex2=x;while(fabs(y)=0.00001);r

15、eturn x;input x1,x2:2.5 6.7A root of equation is 4.99999984.10 函数的递归调用 递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身。递归要有终止条件。例如:int f(int x)int y,z;z=f(y);return(2*z);例4.10 P109#include using namespace std;int age(int);void main()coutage(5)endl;int age(int n)int c;if(n=1) c=10;else c=age(n-1)+2;return c;18例4.11

16、 用递归方法求n!#include using namespace std;long fac(int);void main()int n;long y;coutn;y=fac(n);coutn!=yendl;long fac(int n)long f;if(n0)coutn0,data error!endl;f=-1;elseif(n=0|n=1) f=1;else f=fac(n-1)*n;return f;please input an integer:1010!=3628800递归的缺点是空间复杂度大,优点是直观,符合人们常规习惯。4.11 局部变量和全局变量变量的作用域4.11.1 局

17、部变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。同样,在复合语句中定义的变量也只在本复合语句范围内有效。形式参数也仅在所在函数中有效。这些都称为局部变量。#includevoid main()for(int i=0; i100; i+) for(int j =0;j50 ; j+) /将被建立100次 ;/.coutj ; / j已消失,在此访问不合法int p,q=56;/全局变量,在此之后的所有函数中有效float f1(int a)/参数a在本函数中有效int b,c;/在本函数中有效.void main()float f2(int a);/参数a,只在本行有效int

18、m,n;/在main()函数中有效int p,q,m;/在本复合语句中有效.char f2(int x,int y)/参数x,y在本函数中有效4.11.2 全局变量在函数外定义的变量是外部变量,称为全局变量。P114。说明:(1)全局变量的作用是增加函数间数据联系的渠道。(2) 建议不在必要时不要使用全局变量。占空间它使函数的通用性降低了。会降低程序的清晰性。(3) 同名的局部变量屏蔽全局变量。通过使用作用域运算符:,可以在块作用域中被隐藏的文件作用域中的名字。例如:#includeint i; /文件作用域void main()i=5;int i; /块作用域i=7;:i=1;couti=i

19、endl; /输出7couti=i; /输出14.12 变量的存储类别存储期:静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间,动态存储方式是在程序运行期间,系统对变量动态分配空间。用户区程序区静态存储区动态存储区 存储类别是指数据在内存中的存储方法。4.12.2 自动变量在函数体中以下两种写法相同。auto int b,c=3;int b,c;4.12.3 用static声明静态局部变量例4.12 静态局部变量的值#include using namespace std;int f(int a)/初值不同auto int b=0;/在函数调用时分配在动态存储区,调用结束释放sta

20、tic int c=3;/在编译时进行赋初值,有全局寿命,b=b+1; /但只在本函数中有效c=c+1;return a+b+c;void main()int a=2,i;for(i=0;i3;i+)coutf(a) ;coutendl;7 8 9P118:对静态局部变量的说明例4.13 输出1到5阶乘值#include using namespace std;int fac(int);void main()int a=2,i;for(i=1;i6;i+)couti!=fac(i)endl;int fac(int n)static int f=1;f=f*n;return f;1!=12!=23!=64!=245!=1204.12.4 用register声明寄存器变量register int i,f=1;4.12.5 用extern声明外部变量用extern来声明全局变量,以扩展全局变量的作用域。1 在一个文件内声明的全局

温馨提示

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

最新文档

评论

0/150

提交评论