《第5章函数及其应用ppt课件.ppt》由会员分享,可在线阅读,更多相关《第5章函数及其应用ppt课件.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章函数及其应用ppt课件 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望5.2 自定义函数的概念及使用方法自定义函数的概念及使用方法例1:求两个数中的最大数#include int imax(int m,int n)return(mn?m:n);void main()int a=6,b=9;coutimax(a,b);例2:求x的n次方#include iostream.hvoid main()float mpow(float,int);coutpow=mpo
2、w(3.,3)endl;float mpow(float a,int n)int i;float k=1;for(i=1;i=n;i+)k=k*a;return(k);5.3 5.3 自定义函数的三种形式自定义函数的三种形式5.3.1 无参函数,例如main(),getchar()等。主函数与子函数之间不传输数据。例:输出字符四方形 *void print()int i;for(i=1;i5;i+)coutr;res(a,b,r);coutr=rsetw(10)a=asetw(10)b=bendl;float res(float&a,float&b,float r)a=3.14159*r*r;
3、b=2*3.14159*r;return 0;例:编写函数(过程、子程序)程序1.求n的阶乘 f(n)2.求三个数的最大数(可以求多个数的最大数)3.求两个正整数的最大公约数(可以求多个数的最大公约数)f(m,n)4.求n+(n+1)+(n+2)+(n+k)5.用子函数完成x2,x3,xn5.5 C+5.5 C+库函数库函数 被直接调用的函数称为库(内部)函数。函数名 函数原型 要用到的头文件abs()int abs(int n)stdlib.hfabs()double abs(double x)math.hcos()double cos(double x)math.hexp()double
4、exp(double x)math.hlog()double log(double x)math.hpow()double pow(double x,double y)math.hsqrt()double sqrt(double x)math.hsin()double sin(double x)math.htan()double tan(double x)math.hkbhit()int kbhit()conio.hexit()void exit(int n)stdlib.hrand()double rand(double x)stdlib.h5.6 作用域和存储类作用域和存储类5.6.1 作
5、用域1.块作用域 块内说明的变量只能在本块有效。2.文件作用域 文件作用域就是全局作用域。例:读程序,观察全局变量和局部变量的关系#include int i;/全局变量,文件作用域void main()i=5;/文件作用域的i赋初值 /子块1 int i;/局部变量,块作用域 i=7;couti=iendl;/输出7 couti=iendl;/输出5 3.函数原型作用域 函数的作用域只限定在函数原型的函数中。4.函数作用域 在函数内均有效,不受块作用域的限制,只有标号属于函数作用域(在goto语句中使用)。5.6.2 存储类 1.局部变量及其概念l形参是局部变量。l在一个复合语句中定义的变量
6、。l在一个函数中定义的变量。2.全局(外部)变量及其概念l函数外部定义的变量。l用extern 说明的变量。3.动态(自动)变量l程序运行期间,分配内存单元,运行结束,内存单元就释放。l形参、局部变量都是动态变量。l动态变量用auto说明或省略。4.静态变量l调用函数结束,变量值保留,下次调用值仍存在。l静态变量用static 说明。l数组只有定义成静态时,才能初始化。l静态变量自动赋0值。l何时需要定义静态数组:保留函数的变量值和数组初始化。例:读程序,理解静态变量#include#include void main()int count(int);do count(0);while(!kb
7、hit();cout”Function COUNT()have been called”count(1)”timesn”int count(int i)static int c=0;if(i)return c;else return+c;return 0;说明:未从键盘上按下键时,反复循环调函数count(),C一直自加,从键盘上一旦按下键时,结束循环,输出C值。5.寄存器变量作用:存取速度快。特点:只允许使用三个寄存器变量,且必须是形参和局部变量才能使用。用法:用 register 说明。5.7 5.7 内联函数内联函数 大量、多次调用函数,要占计算机很多时间,为了用空间换时间,才用内联函数
8、。只要在定义函数,或者对函数原型说明时,在行首加上inline 即可。例:求圆面积#includeinline double calArea(double radius)return 3.14*radius*radius;void main()double r=3.0;/r是圆的半径double area;area=calArea(r);/调用内联函数,编译时此处被替换为calArea函数体语句coutareaendl;return 0;5.8 带有缺省参数的函数带有缺省参数的函数 函数说明时,先对形参初始化,调用函数时,若给实参,就使用实参,否则使用说明时给出的初始值。例:求四方体体积#in
9、clude#include int get_volume(int length,int width=2,int height=3);void main()int x=10,y=12,z=15;cout Some box data is ;cout get_volume(x,y,z)endl;cout Some box data is ;cout get_volume(x,y)endl;cout Some box data is ;cout get_volume(x)endl;cout Some box data is;cout get_volume(x,7)endl;cout Some box
10、 data is;cout get_volume(5,5,5)endl;return 0;int get_volume(int length,int width,int height)coutsetw(5)lengthsetw(5)widthsetw(5)height;return(length*width*height);说明:l默认参数的说明一定要放在函数使用之前。l对形参的初始化可以是任意表达式。l如部分形参初始化,必须自右向左。l如果函数说明出现在不同程序块,允许提供和使用不同的默认值。5.9 5.9 参数数目可变函数参数数目可变函数 根据需要,函数的参数可多可少,函数参数多少可变的函
11、数称参数数目可变函数。例:从n个数中找出最大数#include#include int main()int a,b,c,d,e;int max(int,int.);cinabcde;coutThe bigger between a and b is max(2,a,b)endl;coutThe bigger in the five number is max(5,a,b,c,d,e)endl;return 0;int max(int num,int integer.)va_list ap;int m=integer;va_start(ap,integer);for(int i=1;im)m=t
12、;coutiendl;va_end(ap);return m;说明:l必须使用头文件stdarg.h。l定义函数和函数原型的书写要求。l要用到三个专用函数和一个类型定义关键字:va_start,va_arg,va_end和va_list。l请将此题改为求实型数最大值。5.10 5.10 函数重载(函数重载(overloadoverload)一个函数可以当几个函数使用。根据形参的类型,调用不同的函数。函数定义不能少。例:用一个函数add()实现两个整型数相加和两个实型数相加#includevoid main(void)int m,n;double x,y;int add(int m,int n)
13、;double add(double x,double y);coutmn;coutinteger“m+n=add(m,n)endl;coutxy;coutreal number x+y=add(x,y)endl;int add(int m,int n)return m+n;double add(double x,double y)return x+y;5.11 5.11 外部函数外部函数能被其他文件调用的函数称为外部函数。外部函数要用extern 说明。5.12 5.12 函数递归函数递归函数递归的两个基本条件1.边界条件2.递归表达式3.函数自身调用自身举例:计算 n!(c=f(n-1)*
14、n)#include long fac(int n)long f;if(n=1)c=1;else c=fac(n-1)*n;return(f);void main()long fac(int n);int n;long y;coutn;y=fac(n);coutn!=yendl;1.计算 1+2+3+1002.计算 0,1,1,2,3,5,8,.第前20项(return(f(n-1)+f(n-2);)5.13 5.13 编译予处理编译予处理概念:在对程序编译之前就进行替换处理,称予处理(有三种:嵌入指令(文件包含)、宏定义、和条件编译)。用途:1.有利于程序的移植与兼容.2.增加程序的兼容性.
15、3.减少程序的运行时间4.减少程序的长度5.13.1 嵌入指令#include 方法:建立多个*.cpp文件,按执行顺序放在#include 中。5.13.2 宏定义方法与用途1.不带参数的宏定义(用一个标识符代表一个字符串或一个常量,不做语法检查。)#define PI 3.14159 (宏定义的标识符常使用大写字母,以有别于变量)#define N 100 (N可以用作数组的下标)#define R 3#define A PI*R*R#define C CONPUTER#define pr cin#define N“n”例:prxN2.带参数的宏定义(用一个标识符代表一个函数,不做语法检查
16、。)#define PI 3.14159#define circle(A,L,R)A=PI*R*R;L=2*PI*PI#define MAX(x,y)(x)(y)?(x)?(y)#define mul(x1,x2)x1*x2/注意(x1)*(x2)例:定义一个求两个数之积的宏名mul,且求:2+3,6+2和3.1,3的积#define mul(x1,x2)x1*x2main()coutmul(2+3,6+2)mul(3.1,2);说明:1.根据计算的结果决定其类型。2.实参是表达式时,形参要用()。3.一个#define 只能定义一个宏名。4.带参宏近似带参函数的定义及用法。5.带参宏的宏中可
17、以有进出两种参数。6.宏名可以作为定义数组时的下标(static int aN )7.如果要修改宏名的内容,只能用define。8.可以使用#undef 解除宏定义。例:定义一个宏,求x 的绝对值#define abs(x)(x0?x:-x)使用时:int a=-3;coutabs(a);例:定义一个宏,判断x 是否是偶数(偶数取 1)#define num(x)(x%2?0:1)5.13.3 条件编译指令格式1:#if#else#endif格式2(连续判断)#if#elif#else#endif 例:读程序,理解条件编译#include#define NUM 100main()#if num=100 cout”hello”endl;#else cout”thank”endl;#endifreturn 0;以上程序相当于:main()#include cout”hello”endl;return 0;5.13.4 测试某个宏是否定义#ifdef (如果定义则)#ifndef (如果没有定义则)#endif (定义结束)5.14程序的多文件组织程序的多文件组织5.14.1 连接属性内部连接 同一程序块内。外部连接 不同程序块实现的程序块连接 5.14.2 分割编译 独立编译、独立保存,最后再连接。
限制150内