资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,C+,程序设计,第3章(1),函数的定义和调用,1,主要内容,函数概述,函数的定义,函数的调用和返回,函数的参数传递值传递,函数的参数传递引用传递,函数的原型声明,全局变量及其作用域,局部变量及其作用域,C+程序的内存布局,标识符的作用域块作用域、文件作用域、函数原型作用域、函数作用域,变量的存储类型和生存期,函数的调用机制,2,函数概述,关于C+函数:,C+程序的结构化特点:,就是整个程序由一个或多个函数组成,每个函数具有相对独立的功能,函数之间有明显的界面,程序整体具有清晰的模块结构,易于修改。,C+函数有两大类:,一类是系统预定义的,称为库函数或标准函数,这些库函数按照不同的功能进行分类,集中定义在不同的头文件中,用户只要在自己的程序中包含某个头文件,就可直接使用该头文件中定义的函数。另一类是用户自定义函数,用户可以根据需要将程序中某个具有相对独立功能的程序段定义为函数。,C+程序的基本模块:,就是函数,任何一个C+程序均由若干个函数组成,其中有且仅有一个主函数,它是程序执行的入口函数,VC+控制台编程是由用户定义的main()作为入口函数,Windows编程是由编译器定义的WinMain()作为入口函数。,3,函数概述,C+函数之间是并列平等的关系,在程序中的定义位置任意,一个函数可以调用其它函数,也可以被其他函数所调用,但主函数只能调用其他函数,而不能被调用。,函数定义的并列关系 函数调用的层次关系,void f1(),f1的函数体,void f2(),f2的函数体,void main(),main的函数体,void f3(),f3的函数体,void f4(),f4的函数体,void f5(),f5的函数体,main(),f1(),f2(),f3(),f4(),f6(),4,函数的定义,函数的定义:,格式:,返回值类型,函数名,(,类型1 形参1,,,类型2 形参2,,,,,类型n 形参n,),语句序列,说明:,返回值类型,可以是C+中任意基本数据类型、已定义的构造数据类型;,若函数没有返回值,则返回值类型定义为 void 型;,若函数返回值类型省略,表示返回值类型为 int 型。,函数体,函数头,5,函数的定义,函数名,按标识符命名规则命名,其后括号内定义的是函数的形式参数;,若该函数为无参函数,括号内的 void 通常省略不写,但括号不能省略!,形式参数表,列出所有形式参数的数据类型、参数名称;,各参数即使类型相同,也必须分别进行类型说明;,形参类型可以是C+中任意基本数据类型、已定义的构造数据类型。,函数参数的作用:,函数调用时,主调函数通过参数将数据传递给被调函数。,函数返回值的作用:,函数返回时,被调函数可将一个确定的值带回到主调函数。,若函数有返回值,则 return语句格式为:,return 表达式;,且 return 后面表达式值的类型必须与函数返回值类型相匹配!,若函数无返回值,则返回值类型定义为void,且return语句格式为:,return ;,6,函数的调用和返回,函数的调用:,格式:,函数名,(,实参1,,,实参2,,,,,实参n,),调用:,就是控制从主调函数转去执行被调函数的函数体。调用时,系统要将实参值按位置传递给对应的形参,因此,一般情况下实参与形参在个数、排列顺序上都必须一一对应,且类型匹配。,函数的返回:,就是控制从被调函数返回到主调函数的调用点。返回时,即在被调函数中执行到 return语句时,若有返回值带回,则先计算 return语句后面表达式的值,并转换成所规定的返回值类型,此时系统会在内存中建立一个临时变量,用来存放该返回值,待主调函数中包含该调用式的表达式语句从该临时变量中取值后,系统便撤消该临时变量。,7,【例】(定义求三个实数中最大数的函数max()。),#include,float,max(,float x,float y,float z,),/要将三个实数传递给max()函数,需定义三个形参。,float t=yz?y:z;,return,(xt?x:t),;,void main(),float a,b,c;,cout a b c;,cout “最大数:”,max(,a,b,c,),x y;,cout “调用前:x=”,x,“ty=”,y,endl;,swap(,x,y,);,cout “调用后:x=”,x,“ty=”,y,b?a:b;,float maxf(float a,float b ),return ab?a:b;,void main(void ),float x=3.4,y=5.6;,char c1=A,c2=B;,int i=20,j=30;,cout,maxi(x,y),t;,cout,maxf(x,y),t;,cout,maxi(c1,c2),t;,cout,maxf(c1,c2),t;,cout,maxi(i+j,45+y),t;,cout,maxf(i+j,45+y),endl;,运行:,float x=3.4,int a=3,float y=5.6,int b=5,float x=3.4,float a=3.4,float y=5.6,float b=5.6,char c1=A,int a=65,char c2=B,int b=66,char c1=A,float a=65,char c2=B,float b=66,表达式 i+j 值50,int型,int a=50,表达式 45+y 值50.6,float型,int b=50,表达式 i+j 值50,int型,float a=50,表达式 45+y 值50.6,float型,float b=50.6,11,函数的参数传递,引用传递,引用类型:,是C+中一种特殊的数据类型,,定义引用类型变量,其本质是给一个已定义的变量起一个别名,系统并不为引用类型变量分配内存空间,引用类型变量与其相关联的变量使用的是同一个内存空间。,引用类型变量的定义:,格式:,&,=,功能:,定义一个引用类型变量,必须同时对其进行初始化,使之与一个已定义过的同类型变量相关联,即给该已定义过的变量起一个别名。,【例】,#include,void main(),int x=5 ;,int,&,x1,=,x,;,int x2=x;,x1+=2,;,cout “x=”,x,“tx1=”,x1,“tx2=”,x2,endl;,5,7,x,x1,5,x2,运行:,x=7 x1=7 x2=5,12,函数的参数传递,引用传递,引用类型变量可以作为函数的形参,以实现参数的引用传递。,【例】,void swap(,int,&,a,int,&,b,),int t=a;a=b;b=t;,引用传递:,调用函数时,系统对引用类型的形参是,不分配,存储空间的,其本质是给对应的实参变量起一个别名。,进行,引用传递,时,调用式中对应的,实参只能是变量,。,引用传递时传递的是变量名,引用类型的形参变量与其相关联的实参变量使用的是同一个存储空间,若引用类型的形参变量的值发生变化,其相关联的实参变量的值也就随之变化,因此是,双向传递,。,13,【例】(值传递),#include,void swap(,int a,int b,),int t=a;a=b;b=t;,void main(),int x=5,y=10 ;,cout “调用前:x=”,x,“ty=”,y,endl;,swap(,x,y,);,cout “调用后:x=”,x,“ty=”,y,endl;,【例】(引用传递),#include,void swap(,int,&,a,int,&,b,),int t=a;a=b;b=t;,void main(),int x=5,y=10 ;,cout “调用前:x=”,x,“ty=”,y,endl;,swap(,x,y,);,cout “调用后:x=”,x,“ty=”,y,endl;,运行:,调用前:x=5 y=10,调用后:x=10 y=5,引用传递:,main():swap():,x,a,10,y,b,5,5,10,运行:,调用前:x=5 y=10,调用后:x=5 y=10,值传递:,main():swap():,x,a,10,y,b,5,5,10,5,10,14,函数的原型声明,函数的原型声明:,C+中,把函数的定义部分称为函数的定义性声明,而把对函数的引用性声明称为函数的原型声明。,当函数定义在前、调用在后时,可直接调用;当函数调用在前、定义在后时,在函数被调用前,必须对被调函数作原型声明,函数原型声明可放在主调函数中,也可放在所有函数之外。,函数原型声明的目的是告知编译系统,该函数的返回值类型、参数个数、顺序、各参数的类型,以便编译系统对其后该函数调用式是否有效进行语法检查。,函数原型声明的格式:,格式1:,函数头 +末尾加分号,返回值类型,函数名,(,类型1 形参1,,,类型2 形参2,,,,,类型n 形参n,);,格式2:,函数头(去掉形参变量名)+末尾加分号,返回值类型,函数名,(,类型1,,,类型2,,,,,类型n,);,15,【例】(输入一个8位二进制数,将其转换为十进制数输出。例:若输入11010001,,11010001,2,=1(2,7,)+1(2,6,)+0(2,5,)+1(2,4,)+0(2,3,)+0(2,2,)+0(2,1,)+1(2,0,)=209,10,,输出209。),#include,void main(),double,power (,double,int,),;,/power()函数的引用性声明,即原型声明,int value=0,k;,char c;,cout=0,;,i-,),cin c;,if (c=1 )value+=(int),power(,2,i,),;,/调用power()函数,cout “十进制数:”value endl;,double,power(,double x,int n,),/power()函数的定义性声明,double t=1;,while (n-)t*=x;,return t,;,运行:,请输入一个8位二进制数:,11010001,十进制数:209,16,当函数定义在前、调用在后时,可直接调用;,for(int i=1;iz?y:z;,作用:若程序中的某个变量要被多个函数所访问,可将其定义为全局变量。,存储类型 类型 变量名1=初值1 ,变量名2=初值2,;,存储类型 类型 变量名1=初值1 ,变量名2=初值2,;,for (int i=1;i=3;i+),【例】void swap(int ,【例】(求的值,arctan(x)用级数计算,直到某项绝对值不大于10,-15,为止。),#include,#include,void main(),double a,b;,double,arctan (,double x,),;,/arctan()函数的引用性声明,即原型声明,a=16*,arctan(,1/5.,),;,/调用arctan()函数,且如果写成1/5,结果就都是0,b=4*,arctan(,),;,/调用arctan()函数,且如果写成1/239,结果就都是0,cout “=”(a-b)1e-15,;,i+=2,),sum+=,sign*t/i,;t=t*x*x ;sign*=-1 ;,return sum,;,运行:,17,【例】(找出 11999 之间的数m,使之满足m、m,2,、m,3,均为回文数。,回文:各位数字左右对称的整数。例:11、11,2,=121、11,3,=1331,则输出11。),分析:从最低位开始,用除10取余的方法,依次取出该数的各位数字;,按反序重新构成新的数,若新数与原数完全相等,则原数为回文。,#include,void main(),bool,symm (,int n,),;,/symm()函数的引用性声明,即原型声明,for (int m=
展开阅读全文