函数和预处理PPT学习教案_第1页
函数和预处理PPT学习教案_第2页
函数和预处理PPT学习教案_第3页
函数和预处理PPT学习教案_第4页
函数和预处理PPT学习教案_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1函数和预处理函数和预处理第1页/共77页第2页/共77页函数名函数名是一个有效是一个有效c+标识符,标识符,其后面必须其后面必须跟一对圆括跟一对圆括号(),以号(),以区别于变量区别于变量名及其他用名及其他用户定义的标户定义的标识名。识名。函数类型函数类型即函数的返回即函数的返回值的类型,值的类型,如如果不需要函数果不需要函数有返回值有返回值,则,则只要定义函数只要定义函数的类型为的类型为void即可。即可。形式参数表形式参数表写在括号中写在括号中,各参数以逗,各参数以逗号隔开,每个号隔开,每个参数由参数类参数由参数类型和参数名表型和参数名表示。参数个数示。参数个数可以为,但可以为,但

2、圆括号不能省圆括号不能省略。略。函数体函数体由由在一对花括号在一对花括号中的若干条语中的若干条语句组成,句组成,用于用于实现这个函数实现这个函数执行的功能。执行的功能。注:注:C+不允许在一个函不允许在一个函数体中再定义另一个函数数体中再定义另一个函数第3页/共77页输入两整数输入两整数:9 5 9+ 5- 14 9- 5- 4 9* 5- 45第4页/共77页主调函数主调函数main()f();f();被调函数被调函数f()void f( )for(int i=0;i10;i+)cout(-);coutendl;函数名();函数名();void mainint m1,m2,sum;cout输

3、入两整数: m1m2;coutsetw(10)m1endl;cout+setw(9)m2endl; f();coutsetw(10)m1+m2endl;coutsetw(10)m1endl;cout-setw(9)m2endl; f()coutsetw(10)m1-m2endl;coutsetw(10)m1endl;cout*setw(9)m2endl; f()coutsetw(10)m1*m2endl;第5页/共77页void f(char c, int count)int i;for(i=0;icount;i+)coutc;coutb)max=a;elsemax=b;return max;

4、例:写一个函数,求两个例:写一个函数,求两个数的最大值数的最大值void main()int m,n,x;cinmn;x=max(m,n);cout“较大值较大值”xy)return x; return y; 后面的语句就不在执行void f (int n)if(n0)return;第8页/共77页其中,形参的变量名可以其中,形参的变量名可以省略。但要注意,函数说省略。但要注意,函数说明的内容应与函数的定义明的内容应与函数的定义相同。相同。例:例:int max(int x,int y);int max(int,int);函数原型函数原型第9页/共77页第10页/共77页例:例: 输入两个实数

5、,输出其中较大的数。其中求两个实数中的较输入两个实数,输出其中较大的数。其中求两个实数中的较大数用函数完成。大数用函数完成。#includefloat max(float , float );void main()float a, b;cout输入两个实数:输入两个实数:ab;couta和和b中较大数为中较大数为max(a, b) =y?x:y);main( )函函数数调用调用max(2.5,4.7 )函数函数max(2.5,4.7 )return 4.7 主程序后续主程序后续语句语句第11页/共77页注意:注意:实参与形参的个数应该相等,类型应一致,且按顺序实参与形参的个数应该相等,类型应一

6、致,且按顺序一一对应传递数据。一一对应传递数据。在在c+中,调用一个函数的方式可以有很多,例如:中,调用一个函数的方式可以有很多,例如:1.作为一个语句不使用返回值作为一个语句不使用返回值max(3,4); 2.作为表达式的一部分作为表达式的一部分int c=5*max(2,10); 3.作为函数的实参作为函数的实参int c=0;c=max(max(c,4),10); 第12页/共77页第13页/共77页第14页/共77页#includefloat max(float ,float );void main()float a,b;cout输入两个实数:输入两个实数:ab;c o u t x 和

7、和 y 中 较 大 数 为中 较 大 数 为max(a,b) = y ? x : y );xyab第15页/共77页运行结果:运行结果:a=2,b=10该函数的参数是按值传递该函数的参数是按值传递的,不对实参产生影响。的,不对实参产生影响。如果想要实参值改变,不如果想要实参值改变,不能用传值方法。能用传值方法。形参形参及变及变量局量局部有部有效效第16页/共77页第17页/共77页本程序执行结果如本程序执行结果如下:下:a=10 b=2这说明通过这说明通过指针变指针变量的形参可以实现量的形参可以实现函数的地址传递函数的地址传递(有关指针内容将在(有关指针内容将在第五章介绍)。第五章介绍)。第1

8、8页/共77页int a,b=10;int &i=a;i=5; i=b;引用在声明时必须初始化引用在声明时必须初始化引用一旦声明引用一旦声明,就不能再成为其他变量的别就不能再成为其他变量的别名名引用与被引用的变量指向同一内存地址。引用与被引用的变量指向同一内存地址。a,i第19页/共77页例如:例如:void swap(int & x, int & y)第20页/共77页本程序执行结果如下:本程序执行结果如下:a=10 b=2函数函数swap中的中的int &x和和int &y就是形参的引用就是形参的引用说明。说明。第21页/共77页第22页/共77页f

9、un(1);fun(1,0); fun(1,1);第23页/共77页因为因为系统进行参数匹配时是依照从前往后(系统进行参数匹配时是依照从前往后(从左往右)的顺序,从左往右)的顺序,如果中间参数有默认值,它如果中间参数有默认值,它就无法判断哪些参数使用默认值。就无法判断哪些参数使用默认值。f(5);f(3,6);f(2,3,4);例例:以下函数定义以下函数定义不正确不正确: void f ( int p1=1,int p2,int p3=3 ) void f ( int p1=1,int p2=2,int p3 ) void f ( int p1, int p2=2, int p3)第24页/共

10、77页void f (int x, int y=0);void main()void f (int x, int y)第25页/共77页void f( int x, int y=0 ); void f( int x=1, int y ); /合法合法 void f (int x, int y=1); /不可不可 void main() void f (int x, int y=1);/可以可以 void f (int x, int y) 第26页/共77页本程序的运行结果如下本程序的运行结果如下 x=1,y=0 x=0,y=0 x=1,y=1第27页/共77页变量定义位置有效范围文件域 程序文

11、件中除函数和程序文件中除函数和类定义以外的部分类定义以外的部分从说明开始到文件结从说明开始到文件结束束局部域 块内。(函数,或复块内。(函数,或复合语句内部)合语句内部)从定义到块结束。从定义到块结束。(函数或复合语句)(函数或复合语句)类域类内。(类属性)类内。(类属性)类内类内第28页/共77页#includeint global; void f(int par)int flocal;if (global) int blocal; blocal=par; blocal=1; flocal=1; global=1; void main() int local=2; f(local);全局变量

12、全局变量全局域定义的变全局域定义的变量(定义在所有量(定义在所有函数之外的变量函数之外的变量)局部变量局部变量函数、块中定义函数、块中定义的变量的变量global/全局变量全局变量localparflocalblocal局部变量局部变量第29页/共77页global作用域flocal作用域作用域blocal作用域作用域local作用域作用域#incledeint global; /全局变量全局变量void f(int par)int flocal;if (global) int blocal; blocal=par; blocal=1; flocal=1; global=1; void mai

13、n() int local=2; f(local);第30页/共77页第31页/共77页#include int n=1; /n为全局变量为全局变量void Fun() int n=10; / n为函数内局部变量为函数内局部变量 cout “Fun:n=” n 0) int n=5; /n为块内局部变量为块内局部变量 cout “Block:n=”n endl; cout “Main:n= ”n endl; /n为全局变量为全局变量Fun:n=10Block:n=5Main:n=2第32页/共77页void initialize(int printNO, int state=0);void i

14、nitialize(int printNO, int state=1);/不可不可void main()void initialize(int printNO, int state=1);/可以可以void initialize(int printNO, int state)第33页/共77页struct stu;void f()stu s1;void main()stu s2;void f()struct stu;stu s1;void main()stu s2; /?第34页/共77页变量的存储空间变量的存储空间可以是可以是永久永久的(即的(即在程序运行期间该变在程序运行期间该变量一直存在

15、)量一直存在)也可以是也可以是暂时暂时的(的(即变量在程序运行到即变量在程序运行到达其定义处时才会产达其定义处时才会产生,而作用域结束时生,而作用域结束时,变量也随之消亡),变量也随之消亡)全局变量是永久全局变量是永久的,它们在程序的,它们在程序运行的过程中一直存在;运行的过程中一直存在;而而局部变量大多是临时局部变量大多是临时的,它们的,它们只在说明它们的作用域内发挥作只在说明它们的作用域内发挥作用,一旦程序控制离开了这一作用,一旦程序控制离开了这一作用域,这些局部变量所占空间就用域,这些局部变量所占空间就会释放。会释放。第35页/共77页第36页/共77页第37页/共77页例例49 给出以

16、下程序的执行结果:给出以下程序的执行结果:#includeint global1=0; /全局变量可以在程序中显式初始化全局变量可以在程序中显式初始化int global2; /全局变量也可以由系统隐式初始化为全局变量也可以由系统隐式初始化为0static int global3=1 ; /静态全局变量静态全局变量void main()int i ; /局部临时变量局部临时变量for(i=0;i3;i+) int temp=l; /局部临时变量,每次循环都会重新初始化局部临时变量,每次循环都会重新初始化 static int perm=l; /静态局部变量,只在第一次初始化静态局部变量,只在第

17、一次初始化 cout “temp=” temp “,perm=”perm endl; +temp; +permtemp=1,perm=1temp=1,perm=2temp=1,perm=3第38页/共77页第39页/共77页int var=10 ; /全局变量全局变量func() int var; /局部变量局部变量 var=: var; /将全局变量的值赋给局部变量将全局变量的值赋给局部变量第40页/共77页定义文件定义文件1中的中的全局变量全局变量可以由另一个文件可以由另一个文件(文件文件2)引用,但需引用,但需要在文件要在文件2中说明一下所要引用的变量,该变量对于文件中说明一下所要引用的

18、变量,该变量对于文件2来来说是外部变量。说是外部变量。注:如果在说明外部变量时不能给变量赋初值注:如果在说明外部变量时不能给变量赋初值第41页/共77页# i n c l u d e void f() int b; b=a*2; /错误错误 printf(%dn,b);int a=100; main() f(); a+; f();#include void f() int b; extern int a; b=a*2; printf(%dn,b); int a=100; main() f(); a+; f(); 在在f内部增内部增加加 e x t e r n i n t a ; 将全局变量将全

19、局变量a的作用域的作用域扩展到函数扩展到函数f的内部。的内部。第42页/共77页/* p1.c */#include int a10=0;void main()/* p2.c */#include extern int a10; /也可以这样写:也可以这样写:extern int a ;void getdata() int k; for(k=0;k10;k+) scanf(%d,&ak); 第43页/共77页第44页/共77页第45页/共77页堆区堆区 (动态数据动态数据)栈区栈区(函数局部数据)(函数局部数据)全局数据区全局数据区 (全局变量、静态变量全局变量、静态变量)代码区代码区

20、 (程序代码)(程序代码)操作系统为一个操作系统为一个C+C+程序的运行所分配的内存分为四程序的运行所分配的内存分为四个区域,如图程序在内存中的区域所示:个区域,如图程序在内存中的区域所示:代码区代码区:存放程序代码:存放程序代码全局数据区全局数据区:存放程序:存放程序的全局数据和静态数据的全局数据和静态数据,区分配时全部内存清,区分配时全部内存清0栈区栈区:存放程序中的局:存放程序中的局部变量,区分配时不处部变量,区分配时不处理理堆区堆区:存放与指针相关:存放与指针相关的动态数据,区分配时的动态数据,区分配时不处理不处理第46页/共77页静态生命期静态生命期指的是标识符从程序开始运行时存在,

21、即具有存指的是标识符从程序开始运行时存在,即具有存储空间,到程序运行结束时消亡,即释放存储空间储空间,到程序运行结束时消亡,即释放存储空间。具有静态生命期的标识符存放在具有静态生命期的标识符存放在全局数据区全局数据区,如,如全局变量、静态全局变量、静态局部变量。全局变量、静态全局变量、静态局部变量。具有静态生命期的标识符在未被用户初始化的情具有静态生命期的标识符在未被用户初始化的情况下,系统会况下,系统会自动将其初始化为自动将其初始化为0 0。 函数驻留在代码区,也具有静态生命期。所有函数驻留在代码区,也具有静态生命期。所有具有具有文件作用域文件作用域的标识符都具有静态生命期。的标识符都具有静

22、态生命期。变量的生命期第47页/共77页局部生命期局部生命期在在函数内部函数内部或或块块中定义的标识符具有局部生命期,中定义的标识符具有局部生命期,其生命期开始于执行到该函数或块的标识符声明处其生命期开始于执行到该函数或块的标识符声明处,结束于该函数或块的结束处。,结束于该函数或块的结束处。具有局部生命期的标识符存放在具有局部生命期的标识符存放在栈区栈区。具有局部生。具有局部生命期的标识符如果未被初始化,其命期的标识符如果未被初始化,其内容是随机的内容是随机的。 具有局部生命期的标识符必定具有局部作用域具有局部生命期的标识符必定具有局部作用域;但反之不然,;但反之不然,静态局部变量具有局部作用

23、域,但静态局部变量具有局部作用域,但却具有静态生命期。却具有静态生命期。第48页/共77页动态生命期动态生命期具有动态生命期的标识符具有动态生命期的标识符由特定的函数调用或运算由特定的函数调用或运算来创建和释放来创建和释放,如调用,如调用malloc()malloc()或用或用newnew运算符为变运算符为变量分配存储空间时,变量的生命期开始,而调用量分配存储空间时,变量的生命期开始,而调用free()free()或用或用deletedelete运算符释放空间或程序结束时,运算符释放空间或程序结束时,变量生命期结束。变量生命期结束。具有动态生命期的变量存放在具有动态生命期的变量存放在堆区堆区。

24、具有动态生命期的标识符如果未被初始化,其具有动态生命期的标识符如果未被初始化,其内容内容是随机的是随机的。(关于(关于newnew运算和运算和deletedelete运算将在后面章节介绍)运算将在后面章节介绍) 第49页/共77页自动自动变量变量静态变量静态变量 局部局部 全局全局寄存器寄存器变量变量外部变量外部变量(全局变量)(全局变量)程序结束前程序结束前一直保存;一直保存;(生命期)(生命期)多个函数共多个函数共享;(作用享;(作用域)域)初始化;初始化; 否否 否否不定不定有有 有有否否 可以可以 0 0 无无 否否不定不定 有有 可以可以 0变量的存储类型:变量定义时可以加上关键字,

25、标识变量变量的存储类型:变量定义时可以加上关键字,标识变量的存储类型,系统根据其定义分配释放存储空间。的存储类型,系统根据其定义分配释放存储空间。存储类型关键字存储类型关键字 类型名类型名 变量名表;变量名表;第50页/共77页第51页/共77页main( ).调调func().保存:返回地址保存:返回地址当前现场当前现场恢复:主调函数现恢复:主调函数现场场返回地址返回地址void func( ).第52页/共77页inline int abs(int x) if (x0) return x; else return x;void main( ) int m,m1=2,n,n1=-10; m=

26、abs(m1); n=abs(n1); 编译程序会自动用函数编译程序会自动用函数体代替函数调用体代替函数调用void main() int m,mt=2,n,n1=-10; / m=abs(m1);转换代码 if(m10) m=-m1; else m=m1; /n=abs(n1);转换代码 If (nl=1):”);scanf(“%d”,&n);h=f(n);printf(“%d!=%ld”,n,h);第56页/共77页设设3根柱子根柱子A、B、C,n个盘片个盘片盘片从盘片从A柱搬到柱搬到C柱柱构造递归关系:构造递归关系:f(n,a,b,c):移动:移动n个盘片,个盘片,从从a借助借助

27、b到到cf(n,a,b,c)与与f(n-1, )的递归的递归关系?关系?f(n-1,a,c,b)move(a,c)f(n-1,b,a,c)void move(char m,char n)printf(“%c%c”,m,n);void f( int n,char a,char b,char c)if(n=1)move(a,c);return;f(n-1,a,c,b);move(a,c);f(n-1,b,a,c);void main()f(3,A,B,C);第57页/共77页这就是说,进行函数重载时,要求这就是说,进行函数重载时,要求同名同名函数在参数个数上不同,或者参数类型函数在参数个数上不同,

28、或者参数类型上不同上不同。否则,将无法实现重载。否则,将无法实现重载。第58页/共77页#include int add(int x,int y)return x+y;double add (double x,double y)return x+y;complex add(complex c1,complex c2)complex c;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;return c;struct complexdouble real;double imaginary;第59页/共77页void main()int m=10, n=11;double x=1.1, y=1.2;cout add(m,n) endl;cout add(x,y) endl;/complex c1,c2,c3;c1.real=1.0;c1.imaginary=2.0;c2.real=3.0;c2.imaginary=4.0;c3=add(c1,c2);cout c3.real “”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论