第4章 过程抽象——函数.ppt
《第4章 过程抽象——函数.ppt》由会员分享,可在线阅读,更多相关《第4章 过程抽象——函数.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章 功能(过程)抽象函数主讲人:侯海良通信与控制工程系本章内容n n基于过程抽象的程序设计基于过程抽象的程序设计n n子程序的概念子程序的概念n nC+C+的函数的函数n n变量的局部性和变量的生存期变量的局部性和变量的生存期n n标识符的作用域标识符的作用域n n递归函数递归函数n n内联函数内联函数n n函数名重载函数名重载n n条件编译程序调试与多环境程序编制条件编译程序调试与多环境程序编制n n标准库函数标准库函数基于过程抽象的程序设计 n n人们在设计一个复杂的程序时,经常会用到功能人们在设计一个复杂的程序时,经常会用到功能分分解解和和复合复合两种手段:两种手段:功能分解功能分解
2、:在进行程序设计时,首先把程序的功能分解成:在进行程序设计时,首先把程序的功能分解成若干子功能,每个子功能又可以分解成若干子功能,等等,若干子功能,每个子功能又可以分解成若干子功能,等等,从而形成了一种自顶向下(从而形成了一种自顶向下(top-downtop-down)、逐步精化)、逐步精化(step-wisestep-wise)的设计过程。)的设计过程。功能复合功能复合:把已有的(子)功能逐步组合成更大的(子):把已有的(子)功能逐步组合成更大的(子)功能,从而形成一种自底向上(功能,从而形成一种自底向上(bottom-upbottom-up)的设计过程。)的设计过程。n n过程抽象过程抽象
3、:一个功能的使用者只需要知道相应功能:一个功能的使用者只需要知道相应功能是什么(是什么(what to dowhat to do),而不必知道它是如何做),而不必知道它是如何做(how to dohow to do)的。)的。子程序n n子程序是取了名的一段程序代码,在程序中通过名字来使用(调用)它们。n n子程序的作用:减少重复代码,节省劳动力减少重复代码,节省劳动力实现实现过程抽象过程抽象(功能抽象功能抽象)封装和信息隐藏的作用封装和信息隐藏的作用 子程序之间的数据传递n n一个子程序所需要的数据往往要从调用者(也是一个子程序所需要的数据往往要从调用者(也是一个子程序)那里获得,计算结果也
4、需要返回给一个子程序)那里获得,计算结果也需要返回给调用者。调用者。n n子程序之间的数据传递方式可以通过:子程序之间的数据传递方式可以通过:全局变量:所有子程序都能访问到的变量。(不好)全局变量:所有子程序都能访问到的变量。(不好)参数:形式参数(形参)和实在参数(实参)。参数:形式参数(形参)和实在参数(实参)。n n值传递:把实参的值复制一份给形参。值传递:把实参的值复制一份给形参。n n地址或引用传递:把实参的地址传给形参。地址或引用传递:把实参的地址传给形参。返回值机制:返回计算结果。返回值机制:返回计算结果。C+函数n n函数函数是是C+C+提供的用于实现子程序的语言成分。提供的用
5、于实现子程序的语言成分。n n函数的定义:函数的定义:()描述了函数返回值的类型,描述了函数返回值的类型,n n可以为任意的可以为任意的C+C+数据类型。数据类型。n n当返回值类型为当返回值类型为voidvoid时,它表示函数没有返回值。时,它表示函数没有返回值。用于标识函数的名字,用标识符表示。用于标识函数的名字,用标识符表示。描述函数的形式参数,由零个、一个或多描述函数的形式参数,由零个、一个或多个形参说明(用逗号隔开)构成,形参说明的格式为:个形参说明(用逗号隔开)构成,形参说明的格式为:为为一一个个 ,用用于于实实现现相相应应函函数的功能。数的功能。n n函数体内可以包含函数体内可以
6、包含returnreturn语句,格式为:语句,格式为:return return;return;return;n n当当函函数数体体执执行行到到returnreturn语语句句时时,函函数数立立即即返返回回到到调调用用者。如果有返回值,则把返回值带回给调用者。者。如果有返回值,则把返回值带回给调用者。n n如如果果returnreturn中中的的的的类类型型与与函函数数 不不一一致致,则则进进行行隐隐式式类类型型转转换换,基基本本原原则则为为:把把转成转成 。n n注意:在函数体中不能用注意:在函数体中不能用注意:在函数体中不能用注意:在函数体中不能用gotogoto语句转出函数体。语句转出
7、函数体。语句转出函数体。语句转出函数体。例1:用函数实现阶乘int factorial(int n)/求n的阶乘 int i,f=1;for(i=2;i=0)if(n=0)while(n 0)while(n 0)product*=x;product*=x;n-;n-;elseelsewhile(n 0)while(n 0)product/=x;product/=x;n+;n+;return product;return product;例2:编写求xn的函数函数mainn n每个每个C+C+程序都要定义一个名字为程序都要定义一个名字为mainmain的函数,的函数,C+C+程序的执行是从程序的
8、执行是从mainmain开始的。对于函数开始的。对于函数mainmain,其返回值类型为,其返回值类型为intint,例如:,例如:intint main()main().return-1;.return-1;.return 0;return 0;n n一般情况下,返回一般情况下,返回0 0表示程序正常结束;返回负数表示程序正常结束;返回负数(如(如1 1)表示程序非正常结束。)表示程序非正常结束。函数的调用 n n对于定义的一个函数,必须要调用它,它的函数体对于定义的一个函数,必须要调用它,它的函数体才会执行。才会执行。n n除了函数除了函数mainmain外,程序中对其它函数的调用都是从外
9、,程序中对其它函数的调用都是从mainmain开始的。开始的。mainmain一般是由操作系统来调用。一般是由操作系统来调用。n n函数调用的格式如下:函数调用的格式如下:()由零个、一个或多个表达式构成(逗号由零个、一个或多个表达式构成(逗号分割)分割)实参的个数和类型应与相应函数的形参相同。类型如果实参的个数和类型应与相应函数的形参相同。类型如果不同,编译器会试图进行隐式转换,转换规则是把实参不同,编译器会试图进行隐式转换,转换规则是把实参类型转换成形参类型类型转换成形参类型 。n n注意:不能用注意:不能用gotogoto语句从函数外转入函数体语句从函数外转入函数体函数调用的例子.int
10、int main()main()intint x;x;coutcout x;x;coutcout Factorial of x is Factorial of x is factorial(xfactorial(x)/)/调用阶乘函数调用阶乘函数 endlendl;return 0;return 0;.intint main()main()double a;double a;intint b;b;coutcout a b;a b;coutcout a a 的的 b b 次方是:次方是:power(a,bpower(a,b)endlendl;return 0;return 0;函数调用的执行过程
11、n n计计算算实实参参的的值值(对对于于多多个个实实参参,C+C+没没有有规规定定计计算次序算次序););n n把实参分别传递给被调用函数的形参;把实参分别传递给被调用函数的形参;n n执行函数体;执行函数体;n n函函数数体体中中执执行行returnreturn语语句句返返回回函函数数调调用用点点,调调用用点点获获得得返返回回值值(如如果果有有返返回回值值)并并执执行行调调用用之之后后的操作。的操作。n n可可以以把把有有返返回回值值的的函函数数调调用用作作为为操操作作数数放放在在表表达达式中参加运算式中参加运算 :x+x+power(x,ypower(x,y)*z*z 函数声明 n n程序
12、中调用的所有函数都要有定义。n n如果函数定义在其它文件(如:C+的标准库)中或定义在本源文件中使用点之后,则在调用前需要对被调用的函数进行声明。n n函数声明的格式如下:();/);/函数原型函数原型或或extern extern (););在函数声明中,在函数声明中,中中可以只列出形参的可以只列出形参的类类型而型而不写形参名不写形参名/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();/声明 ext
13、ern int g(int);/声明 extern int y;/声明 y=x+2;f();/调用 y=g(x);/调用 return 0;int y=0;/定义void f()/定义x=y+1;函数声明的作用是什么?函数声明的作用是什么?函数声明的作用是什么?函数声明的作用是什么?例5:用函数实现求小于n的所有素数。#include#include#include#include using namespace std;using namespace std;boolbool is_prime(intis_prime(int n);/n);/函数声明函数声明void void print_p
14、rime(intprint_prime(int n,n,intint count);/count);/函数声明函数声明intint mainmain()()intint i,n,counti,n,count=1;=1;coutcout n;/n;/从键盘输入一个正整数从键盘输入一个正整数if(n 2)return-1;if(n 2)return-1;coutcout 2 ,;/2 ,;/输出第一个素数输出第一个素数for(i=3;in;i+=2)for(i=3;in;i+=2)if(if(is_primeis_prime(i(i)count+;count+;print_primeprint_p
15、rime(i,count(i,count););coutcout endlendl;return 0;return 0;boolbool is_prime(intis_prime(int n)n)intint i,j,ki,j,k=sqrt(nsqrt(n););for(i=2,j=k;i=j;i+)for(i=2,j=k;i=j;i+)if(if(n%in%i=0)return false;=0)return false;return true;return true;void void print_prime(intprint_prime(int n,n,intint count)coun
16、t)coutcout n ,;n ,;if(count%6=0)if(count%6=0)coutcout endlendl;函数的参数传递函数的参数传递 n nC+提供了两种参数传递机制:值传递值传递n n把实参的值赋值给形参。把实参的值赋值给形参。地址或引用传递地址或引用传递n n把实参的地址赋值给形参。把实参的地址赋值给形参。n nC+默认的参数传递方式是值传递。值传递值传递n n在函数调用时,采用类似变量初始化的形式把实参的值传给形参。n n函数执行过程中,通过形参获得实参的值,n n函数体中对形参值的改变不会影响相应实参的值。值参数传递的例子值参数传递的例子/函数函数mainmain
17、调用函数调用函数powerpower计算计算a ab b#include#include using namespace std;using namespace std;double double power(doublepower(double x,x,intint n);n);intint main()main()double a=3.0,c;double a=3.0,c;intint b=4;b=4;c=c=power(power(a a,b b););coutcout a ,b ,c a ,b ,c=0)if(n=0)while(n 0)while(n 0)product*=x;pro
18、duct*=x;n-;n-;elseelsewhile(n 0)while(n 0)product/=x;product/=x;n+;n+;return product;return product;n n执行执行执行执行mainmain时,产生三个变量(分配内存空间)时,产生三个变量(分配内存空间)时,产生三个变量(分配内存空间)时,产生三个变量(分配内存空间)a a、b b和和和和c c:a:a:3.03.0b:b:44c:c:?n n调用调用调用调用powerpower函数时,又产生三个个变量函数时,又产生三个个变量函数时,又产生三个个变量函数时,又产生三个个变量x x、n n和和和和p
19、roductproduct,然后分别用,然后分别用,然后分别用,然后分别用a a、b b以及以及以及以及1.01.0对它们初始对它们初始对它们初始对它们初始化:化:化:化:a:a:3.03.0b:b:4 4c:c:?x:x:3.03.0n:n:4 4product:product:1.01.0n n函数函数函数函数powerpower中的循环结束后(函数返回前):中的循环结束后(函数返回前):中的循环结束后(函数返回前):中的循环结束后(函数返回前):a:a:3.03.0b:b:4 4c:c:?x:x:3.03.0n:n:0 0product:product:81.081.0n n函数函数函数
20、函数powerpower返回后:返回后:返回后:返回后:a:a:3.03.0b:b:44c:c:81.081.0变量的局部性变量的局部性n n在C+中,根据变量的定义位置,把变量分成:局部变量和全局变量。局部变量局部变量是指在复合语句中定义的变量,它们是指在复合语句中定义的变量,它们只能在定义它们的复合语句(包括内层的复合只能在定义它们的复合语句(包括内层的复合语句)中使用。语句)中使用。全局变量全局变量是指在函数外部定义的变量,它们一是指在函数外部定义的变量,它们一般能被程序中的所有函数使用(静态的全局变般能被程序中的所有函数使用(静态的全局变量除外)。量除外)。局部变量和全局变量的例子局部
21、变量和全局变量的例子intint x=0;/x=0;/全局变量全局变量void f()void f()intint y=0;/y=0;/局部变量局部变量x+;/OKx+;/OKy+;/OKy+;/OKa+;/a+;/ErrorError intint main()main()intint a=0;/a=0;/局部变量局部变量f();f();a+;/OKa+;/OKx+;/OKx+;/OKy+;/y+;/ErrorError while(x10)while(x10)intint b=0;/b=0;/局部变量局部变量 a+;/OKa+;/OKb+;/OKb+;/OKx+;/OKx+;/OK b+;
22、/b+;/ErrorErrorreturn 0;return 0;变量的生存期(存储分配)变量的生存期(存储分配)n n把程序运行时一个变量占有内存空间的时间段称为该变量的生存期。静态静态:从程序开始执行时就进行内存空间分配,直到程:从程序开始执行时就进行内存空间分配,直到程序结束才收回它们的空间。序结束才收回它们的空间。全局变量具有静态生存期全局变量具有静态生存期 。自动自动:内存空间在程序执行到定义它们的复合语句(包:内存空间在程序执行到定义它们的复合语句(包括函数体)时才分配,当定义它们的复合语句执行结束括函数体)时才分配,当定义它们的复合语句执行结束时,它们的空间将被收回。时,它们的空
23、间将被收回。局部变量和函数的参数一般局部变量和函数的参数一般具有自动生存期具有自动生存期。动态动态 :内存空间在程序中显式地用:内存空间在程序中显式地用newnew操作或操作或mallocmalloc库函数分配、用库函数分配、用deletedelete操作或操作或freefree库函数收回。库函数收回。动态变动态变量具有动态生存期量具有动态生存期。n n具有静态生存期的变量,如果没有显式初始化,系统将把具有静态生存期的变量,如果没有显式初始化,系统将把它们初始化成它们初始化成0 0。存储类修饰符存储类修饰符 n n在定义局部变量时,可以为它们加上存储类修饰符来显式地指出它们的生存期。autoa
24、uto:使局部变量具有自动生存期。局部变量的:使局部变量具有自动生存期。局部变量的默认存储类为默认存储类为autoauto。staticstatic:使局部变量具有静态生存期。它只在函:使局部变量具有静态生存期。它只在函数第一次调用时进行初始化,以后调用中不再进数第一次调用时进行初始化,以后调用中不再进行初始化,它的值为上一次函数调用结束时的值。行初始化,它的值为上一次函数调用结束时的值。registerregister:使局部变量也具有自动生存期,由编:使局部变量也具有自动生存期,由编译程序根据译程序根据CPUCPU寄存器的使用情况来决定是否存寄存器的使用情况来决定是否存放在寄存器中。放在寄
25、存器中。void f()void f()auto auto intint x=0;x=0;/auto/auto一般不写一般不写 static static intint y=1;y=1;register register intint z=0;z=0;x+;y+;z+;x+;y+;z+;coutcout x y z x y z=调用调用f f时,输出:时,输出:x=1,y=2,z=1x=1,y=2,z=1=调用调用f f时,输出:时,输出:x=1,y=3,z=1x=1,y=3,z=1Static Static 实例实例程序实体在内存中的安排程序实体在内存中的安排程序运行时各种数据在内存中的分配
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 过程抽象函数 过程 抽象 函数
限制150内