《第4章过程抽象——函数.ppt》由会员分享,可在线阅读,更多相关《第4章过程抽象——函数.ppt(67页珍藏版)》请在第壹文秘上搜索。
1、第四章第四章 过程抽象函数过程抽象函数本章内容n4.1 子程序n4.2 C+的函数n4.3 变量的局部性和变量的生存期n4.4 函数的嵌套调用n4.5 递归函数n4.6 宏定义n4.7 内联函数n4.8 带缺省值的形式参数n4.9 函数名重载基于过程抽象的程序设计 n人们在设计一个复杂的程序时,经常会用到功能分解和复合两种手段:功能分解:在进行程序设计时,首先把程序的功能分解成若干子功能,每个子功能又可以分解成若干子功能,等等,从而形成了一种自顶向下(top-down)、逐步精化(step-wise)的设计过程。功能复合:把已有的(子)功能逐步组合成更大的(子)功能,从而形成一种自底向上(bo
2、ttom-up)的设计过程。n过程抽象:一个功能的使用者只需要知道相应功能是什么(what to do),而不必知道它是如何做(how to do)的。4.1 子程序n子程序是取了名的一段程序代码,在程序中通过名字来使用(调用)它们。n子程序的作用:减少重复代码,节省劳动力实现过程抽象(功能抽象)封装和信息隐藏的作用 语言功能的扩充 4.2 C+函数 函数函数:完成相对独立功能的子程序完成相对独立功能的子程序.标准库函数标准库函数 (由系统定义,用户可直接调用(由系统定义,用户可直接调用)自定义函数自定义函数 (用户需要时用户需要时,自己定义自己定义)C语言函数语言函数4.2.1 C+标准库函
3、数n为了方便程序设计,C+语言的每个实现往往会提供一个标准库,其中定义了一些语言本身没有提供的功能:常用的数学函数字符串处理函数以及输入/输出,等等n在C+标准库中,根据功能对定义的程序实体进行了分类,把每一类程序实体的声明分别放在一个头文件中。n在C+中,把从C语言保留下来的库函数,重新定义在名空间std中;对相应的头文件进了重新命名:*.h-c*一些标准数学函数(cmath或math.h)nint abs(int n);/int型的绝对值nlong labs(long n);/long int型的绝对值ndouble fabs(double x);/double型的绝对值ndouble s
4、in(double x);/正弦函数ndouble cos(double x);/余弦函数ndouble tan(double x);/正切函数ndouble asin(double x);/反正弦函数ndouble acos(double x);/反余弦函数ndouble atan(double x);/反正切函数ndouble ceil(double x);/不小于x的最小整数(返回值为以/double表示的整型数)ndouble floor(double x);/不大于x的最大整数(返回值为以 /double表示的整型数)ndouble log(double x);/自然对数ndoubl
5、e log10(double x);/以10为底的对数ndouble sqrt(double x);/平方根ndouble pow(double x,double y);/x的y次幂4.2.1 C+标准库函数库函数使用举例#include /相应的头文件#include /相应的头文件using namespace std;/重新定义在名空间std中;void main()double pi=3.1415926535;double x,y;x=pi/2;y=sin(x);cout sin(x )=y endl;y=cos(x);cout cos(x )=y endl;4.2.2 自定义 C+函
6、数1.函数的定义:();描述了函数返回值的类型,n可以为任意的可以为任意的C+数据类型。数据类型。n当返回值类型为当返回值类型为void时,它表示函数没有返回值。时,它表示函数没有返回值。用于标识函数的名字,用标识符表示。描述函数的形式参数,由零个、一个或多个形参说明(用逗号隔开)构成,形参说明的格式为:4.2.2 自定义 C+函数 为一个,用于实现相应函数的功能。n函数体内可以包含return语句,格式为:return;return;n当函数体执行到return语句时,函数立即返回到调用者。如果有返回值,则把返回值带回给调用者。n如果return中的的类型与函数 不一致,则进行隐式类型转换,
7、基本原则为:把转成。n注意:在函数体中不能用注意:在函数体中不能用goto语句转出函数体。语句转出函数体。4.2.2 自定义 C+函数double max(double x,double y)if(x y)return x;elsereturn y;函数定义举例:求两个浮点数中较大数4.2.2 自定义 C+函数n每个C+程序都要定义一个名字为main的函数,C+程序的执行是从main开始的。对于函数main,其返回值类型为int,例如:int main().return-1;.return 0;n一般情况下,返回0表示程序正常结束;返回负数(如1)表示程序非正常结束。2.函数main3.函数的
8、调用 n对于定义的一个函数,必须要调用它,它的函数体才会执行。n函数调用的格式如下:()实参的个数和类型应与相应函数的形参相同。类型如果不同,编译器会试图进行隐式转换,转换规则是把实参类型转换成形参类型。n注意:不能用goto语句从函数外转入函数体4.2.2 自定义 C+函数4.2.2 自定义 C+函数3.函数调用举例-1#include using namespace std;float max(float x,float y)/必须分别定义必须分别定义 float z;z=xy?x:y;return(z);void main()float a,b;int c;cinab;c=max(a,b
9、);coutMax is cendl;函数声明 n程序中调用的所有函数都要有定义。n如果函数定义在其它文件(如:C+的标准库)中或定义在本源文件中使用点之后,则在调用前需要对被调用的函数进行声明。n函数声明的格式如下:();/函数原型或extern ();在函数声明中,中可以只列出形参的类型而不写形参名4.2.2 自定义 C+函数4.2.2 自定义 C+函数3.函数调用举例-2#include#include using namespace std;float max(float,float);/函数声明void main()float a,b;int c;cinab;c=max(a,b);c
10、outMax is cy?x:y;return(z);/file2.cppint g(int i)/定义 extern int x,y;/声明 int z;/定义 z=x+y;return z+i;/file1.cppint x=0;/定义int main()/定义 extern void f();/声明 extern int g(int);/声明 extern int y;/声明 y=x+2;f();/调用 y=g(x);/调用 return 0;int y=0;/定义void f()/定义x=y+1;4.函数调用的执行过程n计算实参的值(对于多个实参,C+没有规定计算次序);n把实参分别传
11、递给被调用函数的形参;n执行函数体;n函数体中执行return语句返回函数调用点,调用点获得返回值(如果有返回值)并执行调用之后的操作。4.2.2 自定义 C+函数【example4_5】用函数实现求小于n的所有素数。#include#include using namespace std;bool is_prime(int n);/函数声明void print_prime(int n,int count);/函数声明int main()int i,n,count=1;cout n;/从键盘输入一个正整数if(n 2)return-1;cout 2 ,;/输出第一个素数for(i=3;in;i
12、+=2)if(is_prime(i)count+;print_prime(i,count);cout endl;return 0;4.2.3 函数的参数传递 nC+提供了两种参数传递机制:值传递n把实参的值赋值给形参。把实参的值赋值给形参。地址或引用传递n把实参的地址赋值给形参。把实参的地址赋值给形参。nC+默认的参数传递方式是值传递。值传递n在函数调用时,采用类似变量初始化的形式把实参的值传给形参。n函数执行过程中,通过形参获得实参的值。n函数体中对形参值的改变不会影响相应实参的值。值参数传递的例子#include#include using namespace std;void swap(
13、int a,int b)int t;t=a;a=b;b=t;couta=a,b=bendl;void main()int x=3,y=4;coutx=x,y=yendl;swap(x,y);coutx=x,y=yendl;执行执行main时,产生时,产生2个变量(分个变量(分配内存空间)配内存空间)x和和y:x:3 y:4 调用调用swap函数时,又产生函数时,又产生3个变量个变量a、b和和t:a:3 b:4 t:?函数函数swap中的交换结束后中的交换结束后(函数返回前):(函数返回前):a:4 b:3 t:3函数函数swap返回后:返回后:x:3 y:44.3 变量的作用域及存储分配1.局
14、部变量和全局变量根据变量的定义位置,把变量分成:局部变量和全局变量。局部变量是指在复合语句中定义的变量,它们只能在定义它们的复合语句(包括内层的复合语句)中使用。全局变量是指在函数外部定义的变量,它们一般能被程序中的所有函数使用(静态的全局变量除外)。4.3 变量的作用域及存储分配int x=0;/全局变量全局变量void f()int y=0;/局部变量局部变量x+;/OKy+;/OKa+;/Error全局变量和局部变量的区别全局变量和局部变量的区别全局变量局部变量定义位置函数体外函数体外函数体内函数体内作用域从定义处到本从定义处到本源文件结束源文件结束从定义处到本函数从定义处到本函数结束结
15、束举例所有在函数体所有在函数体外外(1)(1)所有在函数体所有在函数体内(内(2 2)形式参数)形式参数注意和局部变量同和局部变量同名的处理名的处理【举例1:全局变量应用】#include#include using namespace std;int a,b;/a,b为全局变量为全局变量void f1()int t1,t2;t1=a*2;t2=b*3;b=100;coutt1=t1,t2=t2endl;void main()a=2;b=4;/此此a,b是全局变量,赋值是全局变量,赋值 f1();/调用函数调用函数f1()couta=a,b=bendl;【举例2:全局变量和局部变量同名】#in
16、clude#include using namespace std;int a=2,b=4;/a,b为全局变量为全局变量void f1()int t1,t2;t1=a*2;t2=b*3;b=100;coutt1=t1,t2=t2endl;void main()int b=4;/同名局部变量同名局部变量 f1();couta=a,b=bendl;全局变量与局部变量同名时,则全局变量与局部变量同名时,则在局部变量的作用范围内,外部在局部变量的作用范围内,外部变量不起作用。变量不起作用。2.2.变量的生存期(存储分配)变量的生存期(存储分配)(1)把程序运行时一个变量占有内存空间的时间段称为该变量的生存期。静态:从程序开始执行时就进行内存空间分配,直到程序结束才收回它们的空间。全局变量具有静态生存期。自动:内存空间在程序执行到定义它们的复合语句(包括函数体)时才分配,当定义它们的复合语句执行结束时,它们的空间将被收回。局部变量和函数的参数一般具有自动生存期。动态:内存空间在程序中显式地用new操作或malloc库函数分配、用delete操作或free库函数收回。动态变量具有动态生存期。n具有