第4章 过程抽象——函数课件

上传人:我*** 文档编号:141042244 上传时间:2020-08-03 格式:PPT 页数:86 大小:219KB
返回 下载 相关 举报
第4章 过程抽象——函数课件_第1页
第1页 / 共86页
第4章 过程抽象——函数课件_第2页
第2页 / 共86页
第4章 过程抽象——函数课件_第3页
第3页 / 共86页
第4章 过程抽象——函数课件_第4页
第4页 / 共86页
第4章 过程抽象——函数课件_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《第4章 过程抽象——函数课件》由会员分享,可在线阅读,更多相关《第4章 过程抽象——函数课件(86页珍藏版)》请在金锄头文库上搜索。

1、第四章 功能(过程)抽象函数,主讲人:侯海良 通信与控制工程系,本章内容,基于过程抽象的程序设计 子程序的概念 C+的函数 变量的局部性和变量的生存期 标识符的作用域 递归函数 内联函数 函数名重载 条件编译程序调试与多环境程序编制 标准库函数,基于过程抽象的程序设计,人们在设计一个复杂的程序时,经常会用到功能分解和复合两种手段: 功能分解:在进行程序设计时,首先把程序的功能分解成若干子功能,每个子功能又可以分解成若干子功能,等等,从而形成了一种自顶向下(top-down)、逐步精化(step-wise)的设计过程。 功能复合:把已有的(子)功能逐步组合成更大的(子)功能,从而形成一种自底向上

2、(bottom-up)的设计过程。 过程抽象:一个功能的使用者只需要知道相应功能是什么(what to do),而不必知道它是如何做(how to do)的。,子程序,子程序是取了名的一段程序代码,在程序中通过名字来使用(调用)它们。 子程序的作用: 减少重复代码,节省劳动力 实现过程抽象(功能抽象) 封装和信息隐藏的作用,子程序之间的数据传递,一个子程序所需要的数据往往要从调用者(也是一个子程序)那里获得,计算结果也需要返回给调用者。 子程序之间的数据传递方式可以通过: 全局变量:所有子程序都能访问到的变量。(不好) 参数:形式参数(形参)和实在参数(实参)。 值传递:把实参的值复制一份给形

3、参。 地址或引用传递:把实参的地址传给形参。 返回值机制:返回计算结果。,C+函数,函数是C+提供的用于实现子程序的语言成分。 函数的定义: () 描述了函数返回值的类型, 可以为任意的C+数据类型。 当返回值类型为void时,它表示函数没有返回值。 用于标识函数的名字,用标识符表示。 描述函数的形式参数,由零个、一个或多个形参说明(用逗号隔开)构成,形参说明的格式为: , 为一个,用于实现相应函数的功能。 函数体内可以包含return语句,格式为: return ; return; 当函数体执行到return语句时,函数立即返回到调用者。如果有返回值,则把返回值带回给调用者。 如果retur

4、n中的的类型与函数 不一致,则进行隐式类型转换,基本原则为:把转成 。 注意:在函数体中不能用goto语句转出函数体。,例1:用函数实现阶乘,int factorial(int n) /求n的阶乘 int i,f=1; for (i=2; i=n; i+) f *= i; return f; ,double power(double x, int n) /求x的n次幂 if (x = 0) return 0; double product=1.0; if (n = 0) while (n 0) product *= x; n-; else while (n 0) product /= x; n

5、+; return product; ,例2:编写求xn的函数,函数main,每个C+程序都要定义一个名字为main的函数,C+程序的执行是从main开始的。对于函数main,其返回值类型为int,例如: int main() . . return -1; . return 0; 一般情况下,返回0表示程序正常结束;返回负数(如1)表示程序非正常结束。,函数的调用,对于定义的一个函数,必须要调用它,它的函数体才会执行。 除了函数main外,程序中对其它函数的调用都是从main开始的。main一般是由操作系统来调用。 函数调用的格式如下: () 由零个、一个或多个表达式构成(逗号分割) 实参的个

6、数和类型应与相应函数的形参相同。类型如果不同,编译器会试图进行隐式转换,转换规则是把实参类型转换成形参类型 。 注意:不能用goto语句从函数外转入函数体,函数调用的例子,. int main() int x; cout x; cout Factorial of x is factorial(x) /调用阶乘函数 endl; return 0; ,. int main() double a; int b; cout a b; cout a 的 b 次方是: power(a,b) endl; return 0; ,函数调用的执行过程,计算实参的值(对于多个实参,C+没有规定计算次序); 把实参分

7、别传递给被调用函数的形参; 执行函数体; 函数体中执行return语句返回函数调用点,调用点获得返回值(如果有返回值)并执行调用之后的操作。 可以把有返回值的函数调用作为操作数放在表达式中参加运算 :x+power(x,y)*z,函数声明,程序中调用的所有函数都要有定义。 如果函数定义在其它文件(如:C+的标准库)中或定义在本源文件中使用点之后,则在调用前需要对被调用的函数进行声明。 函数声明的格式如下: (); /函数原型 或 extern (); 在函数声明中,中可以只列出形参的类型而不写形参名,/file2.cpp int g(int i) /定义 extern int x,y; /声明

8、 int z; /定义 z = x + y; return z+i; ,/file1.cpp int 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; ,函数声明的作用是什么?,例5:用函数实现求小于n的所有素数。,#include #include using namespace std; bool is_pri

9、me(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+=2) if (is_prime(i) count+; print_prime(i,count); cout endl; return 0; ,bool is_prime(int n) int i,j,k=sqrt(n); for (i=2, j=k; i=j; i+) if (

10、n%i = 0) return false; return true; void print_prime(int n, int count) cout n ,; if (count % 6 = 0) cout endl; ,函数的参数传递,C+提供了两种参数传递机制: 值传递 把实参的值赋值给形参。 地址或引用传递 把实参的地址赋值给形参。 C+默认的参数传递方式是值传递。,值传递,在函数调用时,采用类似变量初始化的形式把实参的值传给形参。 函数执行过程中,通过形参获得实参的值, 函数体中对形参值的改变不会影响相应实参的值。,值参数传递的例子,/函数main调用函数power计算ab #inc

11、lude using namespace std; double power(double x, int n); int main() double a=3.0,c; int b=4; c = power(a,b); cout a , b , c endl; return 0; ,double power(double x, int n) if (x = 0) return 0; double product=1.0; if (n = 0) while (n 0) product *= x; n-; else while (n 0) product /= x; n+; return produ

12、ct; ,执行main时,产生三个变量(分配内存空间)a、b和c: a: 3.0 b: 4 c: ? 调用power函数时,又产生三个个变量x、n和product,然后分别用a、b以及1.0对它们初始化: a: 3.0 b: 4 c: ? x: 3.0 n: 4 product: 1.0 函数power中的循环结束后(函数返回前): a: 3.0 b: 4 c: ? x: 3.0 n: 0 product: 81.0 函数power返回后: a: 3.0 b: 4 c: 81.0,变量的局部性,在C+中,根据变量的定义位置,把变量分成:局部变量和全局变量。 局部变量是指在复合语句中定义的变量,

13、它们只能在定义它们的复合语句(包括内层的复合语句)中使用。 全局变量是指在函数外部定义的变量,它们一般能被程序中的所有函数使用(静态的全局变量除外)。,局部变量和全局变量的例子,int x=0; /全局变量 void f() int y=0; /局部变量 x+; /OK y+; /OK a+; /Error ,int main() int a=0; /局部变量 f(); a+; /OK x+; /OK y+; /Error while (x10) int b=0; /局部变量 a+; /OK b+; /OK x+; /OK b+; /Error return 0; ,变量的生存期(存储分配),

14、把程序运行时一个变量占有内存空间的时间段称为该变量的生存期。 静态:从程序开始执行时就进行内存空间分配,直到程序结束才收回它们的空间。全局变量具有静态生存期 。 自动:内存空间在程序执行到定义它们的复合语句(包括函数体)时才分配,当定义它们的复合语句执行结束时,它们的空间将被收回。局部变量和函数的参数一般具有自动生存期。 动态 :内存空间在程序中显式地用new操作或malloc库函数分配、用delete操作或free库函数收回。动态变量具有动态生存期。 具有静态生存期的变量,如果没有显式初始化,系统将把它们初始化成0。,存储类修饰符,在定义局部变量时,可以为它们加上存储类修饰符来显式地指出它们

15、的生存期。 auto:使局部变量具有自动生存期。局部变量的默认存储类为auto。 static:使局部变量具有静态生存期。它只在函数第一次调用时进行初始化,以后调用中不再进行初始化,它的值为上一次函数调用结束时的值。 register:使局部变量也具有自动生存期,由编译程序根据CPU寄存器的使用情况来决定是否存放在寄存器中。,void f() auto int x=0; /auto一般不写 static int y=1; register int z=0; x+; y+; z+; cout x y z endl; int main() f(); z+; f(); return 0; ,=调用f时,输出:x=1,y=2,z=1,=调用f时,输出:x=1,y=3,z=1,Static 实例,程序实体在内存中的安排,程序运行时各种数据在内存中的分配: 静态数据区用于全局变量、static存会储类的局部变量以及常量的内存分配 。(该区变量未初始化时会默认为0) 代码区用于存放程序的指令,对C+程序而言,代码区存放的是所有函数代码; 栈区用于auto存储类的局部变量、函数的形式参数以及函数调用时有关信息(如:函数返回地址等)的内存分配; 堆区用于动态变量的内存分配。,例7:编写一个能够产生随机数的函数 usingned int random() sta

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号