版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计与数据结构基础,Email: QQ: 1307573198,第4章(函数)(2) 我和我的小伙伴从不吵架作用域和存储类别,复习函数的调用过程,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,函数的嵌套调用,定义函数不允许嵌套,但调用函数可以嵌套,即在被调函数中又调用其它函数。,P82,例4.6,#include int f1(), f2(), f3(); void main() coutt
2、his is main()n; coutf1()endl; int f1(void) coutthis is f1()n; coutf3()endl; return 1; ,int f2(void) coutthis is f2()n; return 2; int f3(void) coutthis is f3()n; coutf2()endl; return 3; ,this is main(),逐级暂停,逐级调用,逐级返回,this is main() this is f1(),this is main() this is f1() this is f3(),this is main()
3、this is f1() this is f3() this is f2(),2,3,this is main() this is f1() this is f3() this is f2() 2,this is main() this is f1() this is f3() this is f2() 2 3,1,this is main() this is f1() this is f3() this is f2() 2 3 1,函数的声明,讲故事.,从前有座山,山里有座庙,庙里有,个老和尚讲故事,故事是什么呢?,“从前有座山,山里有座庙,庙里有,个老和尚讲故事,故事是什么呢?”,从前有座
4、山,山里有座庙,庙里有,个老和尚讲故事,故事是什么呢?,函数的递归调用,调用,函数1,函数1,调用,函数1,函数2,函数1,调用,函数直接或间接地自己调用自己,称为递归,int f(int x) f(y); ,递归的分析方法 与嵌套调用类似。 尽管每次调用的都是自身(同一函数),但要把每次所调用的函数都看作是不同的函数,这些函数都具有相同的参数、返回值和语句。,直接调用自己,间接调用自己,求阶乘,n! = n * (n-1) * (n-2) * * 3 * 2 * 1 (1!=1,0!=1),n! = n * (n-1)!,我要算4!,赵,钱,孙,李,4! =4*3! 钱,你去算3!,算好后告
5、诉我哦!, 要是有人问我1或0的阶乘,我就直接告诉他1。 要不我就再找个人,让他去算(n-1)的阶乘, 我再乘n就行了,我才不一个个乘哩,嘿嘿。,3! =3*2! 孙,你去算2!,算好后告诉我哦!,2! =2*1! 李,你去算1!,算好后告诉我哦!,1! 就是1啊。,2*1=2,3*2=6,4*6=24,long fact(int n) long r; if (n=0 | n=1) r=1; else return r; ,求阶乘的人(要算n的阶乘?) if (问1或0的阶乘) 结果=1; else 再找个人求(n-1)的阶乘; 结果=n*他算的(n-1)的阶乘; return 结果; ,fa
6、ct(n-1);,r = n *,求阶乘,#include long fact (int n); main() int n; coutn; coutn!=fact(n)endl; ,long fact(int n) long r; if (n=0 | n=1) r=1; else return r; ,long fact(int n) long r; if (n=0) r=1; else r=n*fact(n-1); return r; ,输入正整数n:_,输入正整数n:4,long fact(int n) long r; if (n=0 | n=1) r=1; else r = n * fa
7、ct(n-1); return r; ,n-1,n-1,n-1,2,6,24,long fact(int n) long r; if (n=0 | n=1) r=1; else r = n * fact(n-1); return r; ,long fact(int n) long r; if (n=0 | n=1) r=1; else r = n * fact(n-1); return r; ,输入正整数n:4 n!=24,1,long fact(int n) long r; if (n0) r=n*fact(n-1); else r=1; return r; ,递归程序,结构简练,可读性强。
8、但执行时其时间和空间上的开销都比较大。 为防止自调用无休止地进行,在函数内必须设置调用终止的条件,否则程序将无法终止,被称为死递归。,fact(n-1);,r = n *,递归练习,书 P115 练习4. 2(1),#include int function(int x); main() coutfunction(7)endl; int function(int x) int s; if (x=1 | x=2) return 2; s=x*function(x-2); return s; ,2,s=x*function(x-2);,s=x*function(x-2);,6,30,210,210
9、,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,计算an (自定义函数power 、系统函数pow),系统函数pow(a, n):求an double pow(double a, double n);,需要包含头文件: #include ,#include int power(int a, int n) int p=1; while(n0) p=p*a; n-; return p; main() c
10、outpower(3, 4)endl; ,自己编写的函数power(a, n),求an,不必#include ,coutpower(3, 4.5)endl;,an,81,#include #include main() coutpow(3, 4)endl; coutpow(3, 4.5)endl; ,81 140.296,81,81 81,#include ,函数参数的缺省,3,n使用 缺省值,n有缺 省值2,9,9,main() int k=3; coutpower(k)endl; coutpower(k, 4)endl; ,int power(int a, int n=2) int p=1
11、; while(n0) p=p*a; n-; return p; ,#include ,main() int k=3; coutpower(k)endl; coutpower(k, 4)endl; ,函数参数的缺省,3,n用实参值4,81,int power(int a, int n=2) int p=1; while(n0) p=p*a; n-; return p; ,9,9 81,n有缺省值2,#include ,main() int k=3; coutpower(k)endl; coutpower(k, 4)endl; ,int power(int a, int n=2) int p=1
12、; while(n0) p=p*a; n-; return p; ,函数参数的缺省,int power(int a, int n=2);,函数的声明,函数参数的缺省,可为参数指定一个默认的初值; 若有原型声明,缺省值只在声明中给出一次,定义时不能再给; 当有的参数有缺省值,有的没有缺省值时, 有缺省值的参数必须全部位于最右边; 可以每个参数都有缺省值。,void func(int y, int x=2, int z=10); void func(int x=2, int y, int z=10);,coutpower( )endl;,int power(int a=3, int n=2);,直
13、接求32=9,func(4, 5);,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,函数重载,#include int add (int x, int y) return x+y; ,整数加法,main() int a=3, b=4; double m=3.8, n=2.7; coutadd(3, 4)endl; ,coutadd(m, n)endl;,7,7 5,5,7,7,函数重载,#inclu
14、de int add (int x, int y) return x+y; ,整数加法,main() int a=3, b=4; double m=3.8, n=2.7; coutadd(3, 4)endl; ,coutadd(m, n)endl;,double add2(double x, double y) return x+y; ,coutadd2(m, n)endl;,7 6.5,6.5,double add (double x, double y) return x+y; ,浮点数加法,两个以上的函数使用相同的函数名,函数重载,根据实际调用时实参类型和个数的不同,系统自动选调对应参数
15、的函数,coutadd(m, n)endl;,函数重载,#include int add (int x, int y) return x+y; ,double add (double x, double y) return x+y; ,int add (int x, int y, int z) return x+y+z; ,整数加法,浮点数加法,三个整数加法,main() int a=3, b=4, c=5; coutadd(3, 4, 5)endl; ,double add (int x, int y) return (double)(x+y); ,形参必须有所不同。或者是形参个数不同,或者
16、是形参类型不同。 只有返回值类型不同是不可以的。,12,#include int add (int x, int y) return x+y; float add (float x, float y) return x+y; double add (double x, double y) return x+y; main() int i=100, j=200; float a=15.55, b=27.89; double x=6.3e10, y=8.05e12; coutInteger:add(i, j)n; coutFloat:add(a, b)n; coutDouble:add(x, y)
17、n; ,Integer: 300,函数重载练习(1)参数类型不同,P96 例4.19,Integer: 300 Float: 43.44,Integer: 300 Float: 43.44 Double: 8.113e+012,#include int max(int a, int b) return ab?a:b; int max(int a, int b, int c) return ab? (ac? a: c): (bc? b:c); main() int a,b,c; coutabc; coutab; cout二个数的最大值:max(a,b)endl; ,输入3个数: _,函数重载练习
18、(2)参数个数不同,P96 例4.20,输入3个数: 23 5 42,输入3个数: 23 5 42 三个数的最大值:42,输入3个数: 23 5 42 三个数的最大值:42 输入2个数:,输入3个数: 23 5 42 三个数的最大值:42 输入2个数: 12 9,输入3个数: 23 5 42 三个数的最大值:42 输入2个数: 12 9 二个数的最大值:12,以下关于重载函数的说法中,正确的是_。 A) 重载函数必须具有不同的返回值类型 B) 重载函数必须有不同的形参列表 C) 重载函数形参个数必须不同 D) 重载函数名可以不同,B,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,
19、4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,变量的作用域,作用域,变量在何范围内有效;,局部变量,截止到目前,我们接触的变量都属局部变量。,int f1(int a) int b,c; int f2(int x) int y,z; main() int m,n; ,全局变量,局部变量,a b c有效 x y z m n都无效,x y z有效 a b c m n都无效,m n有效 a b c x y z都无效, 只在本函数内有效 (本函数“块”内有效) 若未
20、赋初值,值为随机数 不同函数中可使用同名变量,形参和实参也可同名(形参也是函数内的变量) 在复合语句中定义变量,(只在复合语句“块”内有效),复合语句中的局部变量,在复合语句中定义变量也是局部的,它的范围更小(只在复合语句“块”内有效,有效范围是从定义它到复合语句的 为止)。,#include main() int i=2, j=3, k; k=i+j; int k=8; k=k+i; coutkendl; coutkendl; ,10,10 5,全局变量(也称外部变量),在函数外定义的变量。,全局变量,在函数外定义的变量。 作用域:从变量定义处开始,到本程序文件末尾均有效(其中所有函数都能用
21、)。 初始值自动为0。 全局变量可在多个函数中同时起作用,应尽量少用或不用全局变量。,#include int sum; void fun1( ) sum+=20; int a; void fun2( ) a=20; sum+=a; main() sum=0; fun1( ); a=8; fun2( ); coutsum=sum, a=a; ,sum=40, a=20,不能使用a,都能使用a,都能使,fun1如果要使用a void fun1() extern int a; a=1; sum+=20; ,声明以后再定义全 局变量a,extern指 同一变量,不开辟 新空间,全局变量练习,#inc
22、lude const int N=3; double a; /定义全局变量a void main() for(int i=0; iN; i+) a=a+xi; couta=aendl; double xN=0.1, 1.1, 2.1; /定义全局数组x ,全局变量a的有效范围,extern double xN;,全局数组xN的有效范围,x:,a=3.3,书P106 例4.27,全局变量的屏蔽“局部优先”,#include int a=3, b=5; max (int a, int b) int c; c=ab?a:b; return c; main() int a=8; couta=aendl
23、; coutb=bendl; coutmax=max(a, b)endl; ,int,a=8,8,5,a=8 b=5,8,a=8 b=5 max=8,全局变量屏蔽的屏蔽作用域分辨符(:),#include int a; main() int a=10; int a=3; :a=5; a=:a + a; cout:a=:a a=aendl; :a+; cout:a=:a a=aendl; ,: 直接引用全局变量;不受同名局部变量屏蔽的影响。,:a=5 a=8,:a=5 a=8 :a=6 a=10,凡是:a,都指,其他a要分区域判断 所指不同,作用域分辨符(:)练习,a=20 b=40.5,书 P
24、116. (2),#include double a; void main() int a=10; int a=20; double b; :a=20.5; b=:a+a; couta=a b=bendl; couta=:aendl; couta=:aendl; ,#include double a; void main() int a=10; int a=20; double b; :a=20.5; b=:a+a; couta=a b=bendl; couta=:aendl; couta=:aendl; ,凡是:a,都指,其他a要分区域判断 所指不同,a=20 b=40.5 a=20.5,a
25、=20 b=40.5 a=20.5 a=20.5,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,变量的生存期,生存期,变量从空间被开辟,到该空间被释放所经历的期间。,作用域,空间,时间,变量在何范围内有效。,全局变量,局部变量,存储类别,(可见性),变量的存储类别,CPU寄存器,auto,内存静态存储区,内存动态存储区,变量有数据类 型, 还有存储 类别 存储类别指明 了变 量存储的 位置,有3种,
26、static,register,auto int a;,int a;,或,auto a;,或,变量 a 位于内存动态存储区,static int b;,static b;,或,变量 b 位于内存静态存储区,register int c;,register c;,或,变量 c 位于CPU寄存器,auto 指定变量位于 内存动态存储区,static指定变量位 于内存静态存储区,register指定变量 位于CPU寄存器,都不写这三个关键字,就是auto;我们接触的变量大多是auto的,CPU寄存器数量有限,register 只是建议,编译系统可能并不采纳,仍按auto型处理。 实际没必要定义为re
27、gister ,因为编译系统有优化功能,当编译系统识别出某个变量要被频繁使用时,会自动按register处理。,(未在内存, 没有地址),不同存储类别的变量的特点,register型变量的速度要远远快于其他存储类型的变量。,存储类别程序例(1),#include f(int a) auto b=0; static c=3; b=b+1; c=c+1; return a+b+c; main() int a=2, i; for(i=0;i3;i+) coutf(a); ,7,7,8,78,9,789,全局变量和局部变量的存储类别, 全局变量: 只能是static型的,即只能位于内存静态存储区; 函
28、数中,或 中的局部变量: 可以是auto、static或register 型的; 函数的形参: 可以是auto或register型的,不能为static型。,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,一个C+程序可包含多个源程序文件(.cpp),main() . 函数1(); . int 函数1() . float 函数2() . void 函数3() . ,一个程序(不是3个程序),每个文件都
29、可被单独编译,但不一定能单独运行。,多文件共用同一全局变量和函数,extern,是声明,不是定义,不开辟空间 声明要使用其他文件中的全局变量或其他文件中的函数。,要使用其他文件中的全局变量或函数,需要先声明!,#include main() a=10; coutmain中a=aendl; fun( ); coutfun后main中a=a; ,#include a=20; coutfun中a=aendl; ,定义全局变 量a,开辟a 的空间,声明要使用其他文 件中的全局变量a, 不开辟新空间,main中a=10,声明要使用其他 文件中的函数fun,main中a=10 fun中a=20,main中
30、a=10 fun中a=20 fun后main中a=20,int a;/ 全局变量,void fun( ),extern void fun();,extern int a;,不允许其他文件使用的全局变量和函数,#include extern void fun(); main() fun(); ,#include extern int a; a=20; ,int a;/ 全局变量,void fun( ),全局变量:只能是static型的,加不加 static 都是 static 型的。但加 static 有另外的含义:它不允许被其他文件使用。,static,不允许使用file1的a,函数:定义前加
31、static也表示:它不允许被其他文件使用。 若定义前不加static或加extern,表示函数可被其他文件使用。,static,不允许使用file2的fun,static, 局部变量定义前加static,表示静态变量; 全局变量定义前或函数定义前加static,表示不允许被其他文件使用。,static和extern总结,static, 局部变量定义前加static,表示静态变量; 全局变量定义前或函数定义前加static,表示不允许被其他文件使用。,extern, 全局变量的声明或函数声明前加extern,表示该全局变量或函数是其他文件中定义的,或是本文件后面定义的,用于扩大作用范围(不开辟
32、新变量空间); 函数定义前加extern或不写,表示该函数允许被其他文件使用。, 声明:不分配内存,可出现多次 定义:分配内存、写出执行语句,只能出现一次。,声明和定义,尽量不要使用全局变量,否则会破坏函数的独立性;并可能导致变量值意外被其他函数所改变。,练习,设在某函数的函数体内有以下语句 int a; static int b; 则变量a,b的初值分别为 _ 。 A) 0、0 B) 0、不确定 C) 不确定、0D) 不确定、不确定,C,以下叙述中,错误的是_。 A)函数的形参、函数内部的变量都只具有块作用域; B)当函数内的局部变量和某全局变量发生命名冲突时,在函数内部应遵循局部优先的原则
33、; C)用static修饰的变量,具有静态的生存期,因此一定是全局变量; D)所有全局变量的生存期都与整个程序运行期一致。,C,本讲概要,6. 小结,2. 函数参数的缺省,3. 函数重载,4. 变量的作用域和存储类别,5. 编译预处理,1) 变量的作用域:全局变量、局部变量,2) 变量的生存期:存储类别,3) 含多个源程序文件的C+程序,1. 函数的嵌套调用和递归调用,编译预处理(预编译处理),以 # 开头的行,是编译预处理命令行 (不是语句)。,#include main() int a,b,c; a=10; b=20; c=a+b; coutc; ,#include main() int
34、a,b,c; a=10; b=20; c=a+b; coutc; ,C+源程序,可执行程序,编译,链接,目标程序,编译, 编译预处理命令单独占一行,前有#,后无; 先预处理,再编译:预处理是在编译之前的工作 预处理部分不编译,编译,编译器一般都是把两个阶段一起完成,我们 感觉不到预处理阶段的存在,包含文件(#include),宏定义(#define),条件编译(#if, #ifdef),包含文件(#include),也可写作,我的程序.cpp,#include main() . couthello!endl; . ,编译运行,表示计算机只到C+系统目录(C+安装目录下的include目录)中找
35、此文件; 表示计算机先到用户目录中找此文件,若没找到,再到C+系统目录中找。 系统提供的头文件一般用(但也可用 );用户自定义头文件一般用 。,将某文件(一般是.h头文件)嵌入到当前文件中,#include ,#include 头文件名.h,宏定义(#define),#define 宏名 替换文本,文本替换,不会计算,#include #include #define PI 3.14159 main( ) double r=2; double s; s=PI * r * r; coutPIendl; couts=sendl; coutsin(30*PI/180); ,#include #inc
36、lude main( ) double r=2; double s; s=3.14159 * r * r; cout3.14159endl; couts=sendl; coutsin(30*3.14159/180); ,3.14159 s=12.5664 0.5,编译,预处理完毕,不再有#define,编译,宏展开,宏定义(#define)练习,若有定义: #define M (y*y+3*y),则语句: s=3*M + 4*M; 宏展开(预编译处理)后变为,s=3*(y*y+3*y) + 4*(y*y+3*y);,若有定义: #define M y*y+3*y,则语句: s=3*M + 4*
37、M; 宏展开(预编译处理)后变为,s=3*y*y+3*y + 4*y*y+3*y;,文本替换,不会计算,宏定义(#define)练习,#include #define N 3+5 main() cout2*Nendl; ,编译,#include main() cout2*3+5endl; ,文本替换,不会计算,#include #define N 3+5; main() cout2*Nendl; ,编译,#include main() cout2*3+5;endl; ,#include #define PRINT cout*; main() PRINT ,编译,#include main() cout*; ,11,*,带参宏定义,#include #define F(x, y) 3*x+y main() coutF(1, 2); ,F( , ),3*x*y,编译,#include main() ,x,1,y,2,cout3*x+y;,cout3*1+2;,#include #define S(x) 4*(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理新技术与新方法
- 护理研究设计中的多案例研究
- 护理课件制作的软件选择
- 船舶气焊工安全素养考核试卷含答案
- 拖拉机燃油喷射系统装试工诚信强化考核试卷含答案
- 桌面游戏设计师成果转化竞赛考核试卷含答案
- 医疗器械购销员安全教育模拟考核试卷含答案
- 2026年新科教版高中高二化学下册第三单元盐类水解离子浓度卷含答案
- 纤维板工安全演练强化考核试卷含答案
- 2026年新科教版初中七年级历史上册第一单元原始农耕文明成就卷含答案
- 四川省达州市(2026年)辅警招聘公安基础知识考试题库及答案
- 2026年北京市丰台区初三下学期一模道德与法治试卷和答案
- 2026广西梧州苍海投资集团有限责任公司招聘总会计师1人笔试模拟试题及答案解析
- 《AQ3067-2026化工和危险化学品重大生产安全事故隐患判定准则》解读
- 农产品加工技术人员食品加工指导书
- 2026广东东莞市康复实验学校招聘18人备考题库及答案详解(各地真题)
- 企业信息安全程序指南(标准版)
- (陕西二模)2026年陕西省高三高考适应性检测(二)地理试卷(含答案)
- 2026北京市公安局监所管理总队招聘勤务辅警300人笔试参考题库及答案解析
- 企业内部控制风险案例解析
- 电气元件基础知识培训
评论
0/150
提交评论