函数和预处理学习教案_第1页
函数和预处理学习教案_第2页
函数和预处理学习教案_第3页
函数和预处理学习教案_第4页
函数和预处理学习教案_第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

3、();被调函数被调函数f()void f( )for(int i=0;i10;i+)cout(-);coutendl;函数名();函数名();void mainint m1,m2,sum;cout输入两整数: 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*m2en

4、dl;第5页/共77页第六页,编辑于星期日:十六点 三十二分。void f(char c, int count)int i;for(i=0;icount;i+)coutc;coutb)max=a;elsemax=b;return max;例:写一个函数,求两个数例:写一个函数,求两个数的最大值的最大值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页第九页,编辑于星期日:十六点 三十二分。其中,形参的变量名可以

5、其中,形参的变量名可以省略。但要注意,函数说省略。但要注意,函数说明的内容应与函数的定义明的内容应与函数的定义相同。相同。例:例:int max(int x,int y);int max(int,int);函数原型函数原型第9页/共77页第十页,编辑于星期日:十六点 三十二分。第10页/共77页第十一页,编辑于星期日:十六点 三十二分。例:例: 输入两个实数,输出其中较大的数。其中求两个实数中的较大数输入两个实数,输出其中较大的数。其中求两个实数中的较大数用函数完成。用函数完成。#includefloat max(float , float );void main()float a, b;co

6、ut输入两个实数:输入两个实数: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页第十二页,编辑于星期日:十六点 三十二分。注意:注意:实参与形参的个数应该相等,类型应一致,且按顺序一一对实参与形参的个数应该相等,类型应一致,且按顺序一一对应传递数据。应传递数据。在在c+中,调用一个函数的方式可以有很多,例如:中,调用一个函数的方式可以有很多,例如:1.作为一个语句不使用返回值作为一个语句不使用返回值max(3

7、,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;coutx和和y中较大数为中较大数为max(a,b) = y ? x : y );xyab第1

8、5页/共77页第十六页,编辑于星期日:十六点 三十二分。运行结果:运行结果:a=2,b=10该函数的参数是按值传递的该函数的参数是按值传递的,不对实参产生影响。,不对实参产生影响。如果想要实参值改变,不能用如果想要实参值改变,不能用传值方法。传值方法。形参及形参及变量局变量局部有效部有效第16页/共77页第十七页,编辑于星期日:十六点 三十二分。第17页/共77页第十八页,编辑于星期日:十六点 三十二分。本程序执行结果如本程序执行结果如下:下:a=10 b=2这说明通过这说明通过指针变量指针变量的形参可以实现函的形参可以实现函数的地址传递数的地址传递(有关指针内容将在(有关指针内容将在第五章介

9、绍)。第五章介绍)。第18页/共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

10、b=2函数函数swap中的中的int &x和和int &y就是形参的引用说明。就是形参的引用说明。第21页/共77页第二十二页,编辑于星期日:十六点 三十二分。第22页/共77页第二十三页,编辑于星期日:十六点 三十二分。fun(1);fun(1,0); fun(1,1);第23页/共77页第二十四页,编辑于星期日:十六点 三十二分。因为因为系统进行参数匹配时是依照从前往后(从左系统进行参数匹配时是依照从前往后(从左往右)的顺序,往右)的顺序,如果中间参数有默认值,它就无法判断哪如果中间参数有默认值,它就无法判断哪些参数使用默认值。些参数使用默认值。f(5);f(3,6);f(

11、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页/共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

12、 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页第二十八页,编辑于星期日:十六点 三十二分。变量定义位置有效范围文件域 程序文件中除函数和程序文件中除函数和类定义以外的部分类定义以外的部分从说明开始到文件结从说明开始到文件结束束局部域 块内。(函数,或复块内。(函数

13、,或复合语句内部)合语句内部)从定义到块结束。从定义到块结束。(函数或复合语句)(函数或复合语句)类域类内。(类属性)类内。(类属性)类内类内第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);全局变量全局变量全局域定义的变量全局域定义的变量(定义在所有函数(定义在所有函数之外的变量)之外的变量)

14、局部变量局部变量函数、块中定义函数、块中定义的变量的变量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 main() int local=2; f(local);

15、第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 ini

16、tialize(int printNO, int state=0);void initialize(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;/?第

17、34页/共77页第三十五页,编辑于星期日:十六点 三十二分。变量的存储空间变量的存储空间可以是可以是永久永久的(即在的(即在程序运行期间该变量一程序运行期间该变量一直存在)直存在)也可以是也可以是暂时暂时的(即的(即变量在程序运行到达其变量在程序运行到达其定义处时才会产生,而定义处时才会产生,而作用域结束时,变量也作用域结束时,变量也随之消亡)随之消亡)全局变量是永久全局变量是永久的,它们在程序运的,它们在程序运行的过程中一直存在;行的过程中一直存在;而而局部变量大多是临时局部变量大多是临时的,它们只在的,它们只在说明它们的作用域内发挥作用,说明它们的作用域内发挥作用,一旦程序控制离开了这一作

18、用域一旦程序控制离开了这一作用域,这些局部变量所占空间就会释,这些局部变量所占空间就会释放。放。第35页/共77页第三十六页,编辑于星期日:十六点 三十二分。第36页/共77页第三十七页,编辑于星期日:十六点 三十二分。第37页/共77页第三十八页,编辑于星期日:十六点 三十二分。例例49 给出以下程序的执行结果:给出以下程序的执行结果:#includeint global1=0; /全局变量可以在程序中显式初始化全局变量可以在程序中显式初始化int global2; /全局变量也可以由系统隐式初始化为全局变量也可以由系统隐式初始化为0static int global3=1 ; /静态全局变

19、量静态全局变量void main()int i ; /局部临时变量局部临时变量for(i=0;i3;i+) int temp=l; /局部临时变量,每次循环都会重新初始化局部临时变量,每次循环都会重新初始化 static int perm=l; /静态局部变量,只在第一次初始化静态局部变量,只在第一次初始化 cout “temp=” temp “,perm=”perm endl; +temp; +permtemp=1,perm=1temp=1,perm=2temp=1,perm=3第38页/共77页第三十九页,编辑于星期日:十六点 三十二分。第39页/共77页第四十页,编辑于星期日:十六点 三

20、十二分。int var=10 ; /全局变量全局变量func() int var; /局部变量局部变量 var=: var; /将全局变量的值赋给局部变量将全局变量的值赋给局部变量第40页/共77页第四十一页,编辑于星期日:十六点 三十二分。定义文件定义文件1中的中的全局变量全局变量可以由另一个文件可以由另一个文件(文件文件2)引用,但需要在文件引用,但需要在文件2中说明一下所要引用的变量,该变量对于文件中说明一下所要引用的变量,该变量对于文件2来说是外部变量。来说是外部变量。注:如果在说明外部变量时不能给变量赋初值注:如果在说明外部变量时不能给变量赋初值第41页/共77页第四十二页,编辑于星

21、期日:十六点 三十二分。# 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内 部 增内 部 增加加 extern int a; 将将全局变量全局变量a的的作用域扩展到作用域扩展到函数函数f的内部的内部。第42页/共77页第四十三页,编辑于星期日:十六点 三十二分。/* p1.c

22、 */#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页第四十六页,编辑于星期日:十六点 三十二分。堆区堆区 (动态数据动态数据)栈区栈区(函数局部数据)(函数局部数据)全局数据区全局数据区 (全局变量、静

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

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

25、有静态生命期。所有具有文件文件作用域作用域的标识符都具有静态生命期。的标识符都具有静态生命期。变量的生命期第47页/共77页第四十八页,编辑于星期日:十六点 三十二分。局部生命期局部生命期在在函数内部函数内部或或块块中定义的标识符具有局部生命期,其中定义的标识符具有局部生命期,其生命期开始于执行到该函数或块的标识符声明处,结束于生命期开始于执行到该函数或块的标识符声明处,结束于该函数或块的结束处。该函数或块的结束处。具有局部生命期的标识符存放在具有局部生命期的标识符存放在栈区栈区。具有局部生命。具有局部生命期的标识符如果未被初始化,其期的标识符如果未被初始化,其内容是随机的内容是随机的。 具有

26、局部生命期的标识符必定具有局部作用域;但反具有局部生命期的标识符必定具有局部作用域;但反之不然,之不然,静态局部变量具有局部作用域,但却具有静态静态局部变量具有局部作用域,但却具有静态生命期。生命期。第48页/共77页第四十九页,编辑于星期日:十六点 三十二分。动态生命期动态生命期具有动态生命期的标识符具有动态生命期的标识符由特定的函数调用或运算来创建由特定的函数调用或运算来创建和释放和释放,如调用,如调用malloc()malloc()或用或用newnew运算符为变量分配存储运算符为变量分配存储空间时,变量的生命期开始,而调用空间时,变量的生命期开始,而调用free()free()或用或用d

27、eletedelete运运算符释放空间或程序结束时,变量生命期结束。算符释放空间或程序结束时,变量生命期结束。具有动态生命期的变量存放在具有动态生命期的变量存放在堆区堆区。具有动态生命期的标识符如果未被初始化,其具有动态生命期的标识符如果未被初始化,其内容是随内容是随机的机的。(关于(关于newnew运算和运算和deletedelete运算将在后面章节介绍)运算将在后面章节介绍) 第49页/共77页第五十页,编辑于星期日:十六点 三十二分。自动自动变量变量静态变量静态变量 局部局部 全局全局寄存器寄存器变量变量外部变量外部变量(全局变量)(全局变量)程序结束前程序结束前一直保存;一直保存;(生

28、命期)(生命期)多个函数共多个函数共享;(作用享;(作用域)域)初始化;初始化; 否否 否否不定不定有有 有有否否 可以可以 0 0 无无 否否不定不定 有有 可以可以 0变量的存储类型:变量定义时可以加上关键字,标识变量的存储类型变量的存储类型:变量定义时可以加上关键字,标识变量的存储类型,系统根据其定义分配释放存储空间。,系统根据其定义分配释放存储空间。存储类型关键字存储类型关键字 类型名类型名 变量名表;变量名表;第50页/共77页第五十一页,编辑于星期日:十六点 三十二分。第51页/共77页第五十二页,编辑于星期日:十六点 三十二分。main( ).调调func().保存:返回地址保存

29、:返回地址当前现场当前现场恢复:主调函数现恢复:主调函数现场场返回地址返回地址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=abs(m1); n=abs(n1); 编译程序会自动用函数编译程序会自动用函数体代替函数调用体代替函数调用void main() int m,mt=2,n,n1=-10; / m=abs(m1);转换代码 if(m10) m=-m1; else m=m

30、1; /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借助借助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

31、”,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页第五十八页,编辑于星期日:十六点 三十二分。这就是说,进行函数重载时,要求这就是说,进行函数重载时,要求同名同名函数在参数个数上不同,或者参数类型上函数在参数个数上不同,或者参数类型上不同不同。否则,将无法实现重载。否则,将无法实现重载。第58页/共77页第五十九页,编辑于星期日:十六点 三十二分。#include int add(

32、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 “” c2.imaginary “i”; 根据实参类型根据实参类型选择函数选择函数第60页/共77页第六十一页,编辑于星期日:十六点 三十二分。void main() cout min(13,5,4,9) endl; cout min(-2,8,0

温馨提示

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

评论

0/150

提交评论