第3章C程序设计教程与实验指导杨国兴函数.ppt

上传人:本田雅阁 文档编号:2110297 上传时间:2019-02-14 格式:PPT 页数:29 大小:250.02KB
返回 下载 相关 举报
第3章C程序设计教程与实验指导杨国兴函数.ppt_第1页
第1页 / 共29页
第3章C程序设计教程与实验指导杨国兴函数.ppt_第2页
第2页 / 共29页
第3章C程序设计教程与实验指导杨国兴函数.ppt_第3页
第3页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3章C程序设计教程与实验指导杨国兴函数.ppt》由会员分享,可在线阅读,更多相关《第3章C程序设计教程与实验指导杨国兴函数.ppt(29页珍藏版)》请在三一文库上搜索。

1、C+语言程序设计,杨国兴 张东玲 彭涛,中国水利水电出版社,第3章 函数,3.1 函数的递归调用 3.2 内联函数 3.3 函数重载 3.4 带默认参数值的函数 3.5 变量的存储类别 3.6 程序实例,3.1 函数的递归调用,一个函数在它的函数体内,直接或间接地调用它自身,称为递归调用。这种函数称为递归函数。 直接或间接调用函数自身的情况如图:,第3章 函数,直接调用,间接调用,这两种递归调用都是无中止地调用自身,显然是不正确的。为了 防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。,例3.1 用递归的方法求 n!,分析:计算n!的公式为: 1 n =1或 0 y = n*(n-

2、1)! n 1 可以将求n!转化为求(n-1)!,再继续转化为求(n-2)!,到1时应停止递归 #include using namespace std; long power(int n); void main() int n; long y; cout n; y=power(n); cout n “!=“ y endl; ,第3章 函数,long power(int n) long f; if(n1) f=n*power(n-1); else f=1; return f; ,例3.1的递归过程分析,第3章 函数,例3.2 Hanoi塔问题,有三根针A、B、C,A针上有n个盘子,盘子大小不等

3、,大的在下,小的在上,如图所示。要求将这n个盘子从A针移到C针,在移动过程中可以借助B针,每次只能移动一个盘子,并且在移动过程中三根针上的盘子都保持大盘在下,小盘在上。 分析:将n个盘子从A针移到C针可以分解为以下三个步骤: (1)将A针上的n-1个盘子借助C针移到B针上; (2)将A针上剩下的一个盘子移到C针上; (3)将B针上的n-1个盘子借助A针移到C针上。,第3章 函数,A,B,C,例3.2 Hanoi塔问题源程序,#include using namespace std; void Move(char x, char y); void Hanoi(int n, char one, c

4、har two, char three); void main() int n; cout n; cout “ y endl; ,第3章 函数,例3.2 Hanoi塔问题源程序(续),/函数Hanoi()将n-1个盘子从one针借助two针移到three针 void Hanoi(int n, char one, char two, char three) if(n=1) Move(one, three); else Hanoi(n-1, one, three, two); Move(one, three); Hanoi(n-1, two, one, three); ,第3章 函数,程序运行结果

5、: AC AB CB AC BA BC AC,运行演示,3.2 内联函数,内联函数与一般函数的区别在于它不是在调用时发生控制转移,而是在编译时将被调函数体嵌入到每一个函数调用处,节省了参数传递、控制转移等开销。对于一些规模较小、频繁调用的函数可声明为内联函数,能提高程序运行效率。 内联函数的定义: inline 类型说明符 函数名(参数及类型表) 函数体 注意:只有简单的函数才能成为内联函数,如函数体中不能有循环语句和switch语句等。 内联函数的定义必须出现在内联函数第一次被调用之前。,第3章 函数,例3.3 使用内联函数,#include using namespace std; inl

6、ine int Add(int a, int b) int x; x = a+b; return x; ,第3章 函数,程序运行结果:10+20=30 10+50=60 50+50=100,void main() int a, b, c; a = 10; b = 20; c = Add(a,b); cout a “ + “ b “ = “ c endl; c = Add(a,50); cout a “ + 50 “ “ = “ c endl; c = Add(50,50); cout “50 + 50 “ “ = “ c endl; ,3.3 函数重载,在C+中可以定义多个相同名字的函数,只要

7、它们形参的个数或类型不完全一致即可,编译程序根据实参与形参的类型及个数自动确定调用哪一个同名函数,这就是函数重载,这些同名函数称为重载函数。 例3.4 定义两个函数,分别求两个整数及两个实数的最大值。 分析:在C语言中,要定义题中的函数,只能使用两个不同名函数实现,即定义 int max1(int x, int y) double max2(double x, double y) 在C+中,可通过定义两个重载函数实现,二者同名,如下: int max(int x, int y) double max(double x, double y),第3章 函数,例3.5 源程序,#include us

8、ing namespace std; int max(int x, int y); double max(double x, double y); void main() int a=10, b=20 ,c; double x=200.3, y=400.6, z; c = max(a,b); z = max(x,y); cout c “ “ z endl; ,第3章 函数,程序运行结果:int function float function 20,400.6,int max(int x, int y) cout y) return x; else return y; double max(do

9、uble x, double y) cout y) return x; else return y; ,3.4 带默认参数值的函数,3.4.1 带默认参数值的函数 在函数的声明或定义中可以预先给出默认的形参值,函数调用时,按从左到右的次序将实参和形参结合,如给出对应的实参,则采用实参值,否则采用预先给出的默认形参值 。 例3.6 使用带默认参数值的函数求x的n次方(n是正整数)。,第3章 函数,#include using namespace std; double power(double x=10.0, int n=2); void main() cout power(3, 5) endl

10、; cout power(3) endl; cout power() endl; ,double power(double x, int n) int i; double s=1.0; for(i=1; i=n; i+) s *= x; return s; ,3.4 带默认参数值的函数,3.4.1 带默认参数值的函数(续) 注意:默认形参值必须由右向左的顺序定义。如果某个参数有默认值,则其右面的参数必须都有默认值;如果某个参数没有默认值,则其左面的参数都不能有默认值。例如: int max(int a, int b=10, int c=20); /正确 int max(int a, int b

11、=10, int c); /错误 int max(int a=5, int b, int c=30); /错误 在后两种情况下,调用语句 x = max(20, 30); 会出错! 注意:在使用带默认参数值的函数时,只能在函数定义或函数声明中的一个位置给出默认值,不能在两个位置同时给出。还要保证在函数调用之前给出默认值。,第3章 函数,3.4 带默认参数值的函数,3.4.2 带默认参数值函数产生的二义性 例3.7程序,第3章 函数,#include using namespace std; int add(int x=5, int y=6); float add(int x=5, float

12、y=10.0); void main() int a; float b; a= add(10,20); b= add(10); cout “a= “ a endl; cout “b= “ b endl; ,int add(int x, int y) return x+y; float add(int x, float y) return x+y; ,b=add(10)语句产生二义性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数。,3.5 变量的存储类别,3.5.1 内部变量与外部变量 1. 内部变量 在一个函数内部定义的变量是内部变量(也称为局部变量),

13、它只在该函数范围内有效。 例如:,第3章 函数,void f1(int a) int b,c; void main() int m,n; ,int i,a; for(i=0; i10; i+) int b; ,注意:在不同的作用范围内允许声明同名的变量,3.5 变量的存储类别,3.5.1 内部变量与外部变量(续) 2. 外部变量 在函数外部定义的变量是外部变量(也称为全局变量),它不属于任何一个函数。它的作用范围是:从外部变量的定义位置开始,到本文件的结尾。 例如:,第3章 函数,int a,b; void f1( ) int x,y; void main() ,例3.8 使用全局变量和局部变

14、量,#include using namespace std; int i=1; /全局变量,文件作用域 void main() cout“全局变量 i=“iendl; /输出1 int i=5; /函数局部变量,块作用域 int i; /块局部变量,块作用域 i=7; cout“块局部变量 i=“iendl; /输出7 cout“全局变量 i=“:iendl; /输出1,:使用全局变量 cout“函数局部变量 i=“iendl; /输出5 cout“全局变量 i=“:iendl; /输出1,:使用全局变量 ,第3章 函数,程序运行结果:全局变量 i=1 块局部变量 i=7 全局变量 i=1

15、函数局部变量 i=5 全局变量 i=1,3.5 变量的存储类别,3.5.2 变量的存储类别 变量在内存中的存储方式可以分为两大类,即静态存储方式与动态存储方式。 静态存储方式是指在程序运行期间,分配固定的存储空间。全局变量和静态局部变量是静态存储方式。 动态存储方式是在程序执行过程中,根据需要动态地分配存储空间。局部变量是动态存储方式。 1. 静态变量 定义形式: static 数据类型 变量名 特点:程序运行过程中变量始终存在,每次调用函数结束的值都被保留下来。 仅初始化一次,每次调用它所在的函数时,不再重新初始化。若不指定初值,自动指定初值为0。,第3章 函数,例8.9 输出14的阶乘,#

16、include using namespace std; int fact( int n); void main() int i; for(i=1; i=4; i+) cout i “! = “ fact(i) endl; int fact(int n) static int f=1; /仅在第一次调用函数时执行一次 f *= n; return f; ,第3章 函数,程序运行结果: 1!=1 2!=2 3!=6 4!=24,3.5 变量的存储类别,3.5.2 变量的存储类别(续) 2. 自动变量 定义形式: auto 数据类型 变量名 特点:定义变量时,若不指定static或auto,则默认

17、为自动变量。自动变量是动态存储方式。 每次调用它所在的函数时,都要重新分配存储空间,并初始化。函数调用结束,存储空间就释放。 若不初始化,则初值是不确定的。,第3章 函数,例3.10 静态变量与动态变量的使用,#include using namespace std; void other(void); int i=1; / i 为全局变量,具有静态生存期。 void main(void) static int a; / a为静态局部变量,具有全局寿命,局部可见。 int b=-10; / b, c为动态局部变量,具有局部生存期。 int c=0; cout“-MAIN-n“; cout“ i

18、: “i“ a: “a“ b: “b“ c: “cendl; c=c+8; other(); cout“-MAIN-n“; cout“ i: “i“ a: “a“ b: “b“ c: “cendl; i=i+10; other(); ,第3章 函数,例3.10 静态变量与动态变量的使用(续),void other(void) / a,b为静态局部变量,具有全局寿命,局部可见, / 只第一次进入函数时被初始化。 static int a=2; static int b; int c=10; / C为动态局部变量,每次进入函数时都初始化。 a=a+2; i=i+32; c=c+5; cout“-O

19、THER-n“; cout“ i: “i“ a: “a“ b: “b“ c: “cendl; b=a; ,第3章 函数,程序运行结果: -MAIN- i: 1 a: 0 b: -10 c: 0 -OTHER- i: 33 a: 4 b: 0 c: 15 -MAIN- i: 33 a: 0 b: -10 c: 8 -OTHER- i: 75 a: 6 b: 4 c: 15,例3.11 输出摄氏温度与华氏温度对照表,分析:编写一个函数求出指定摄氏温度对应的华氏温度值,在主函数中通过循环求出摄氏温度从099度对应的华氏温度值,并输出。转换公式为: F = 9/5*C +32 其中F表示华氏温度,C为

20、摄氏温度。程序如下: #include #include using namespace std; int Convert(int c) int f; f = (int) (9.0/5*c + 32); return f; ,第3章 函数,例3.11(续一),#void main() cout “ | 0 1 2 3 4 5 6 7 8 9“ endl; cout “-|-“ endl; for(int i=0; i10; i+) cout setw(2) i*10 “ | “; for(int j=0; j10; j+) cout setw(3) Convert(i*10+j) “ “; c

21、out endl; ,第3章 函数,例3.11(续二),程序运行结果:,第3章 函数,例3.12 用递归的方法计算从n个人中选取k个人的组合数,分析:从n个人中选取k个人的组合数 从n-1个人中选取k个人的组合数 + 从n-1个人中选取k-1个人的组合数 当n与k相等,或k等于0时,组合数为1,即有以下公式(comm表示组合数): 1 n=k或k=0 comm(n, k)= comm(n-1, k)+ comm(n-1, k-1) n!=k 且k0,第3章 函数,例3.12(续),#include using namespace std; int comm(int n, int k); void main(void) int n, k; cout n k; cout n) return 0; else if(n=k) | (k=0) return 1; else return comm(n-1, k) + comm(n-1, k-1); ,第3章 函数,程序运行结果: 请输入n和k的值:10 3 120,谢 谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1