收藏 分销(赏)

函数与编译预处理省公开课一等奖全国示范课微课金奖PPT课件.pptx

上传人:可**** 文档编号:13900317 上传时间:2026-05-03 格式:PPTX 页数:90 大小:373.79KB 下载积分:8 金币
下载 相关 举报
函数与编译预处理省公开课一等奖全国示范课微课金奖PPT课件.pptx_第1页
第1页 / 共90页
函数与编译预处理省公开课一等奖全国示范课微课金奖PPT课件.pptx_第2页
第2页 / 共90页


点击查看更多>>
资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第5章 函数与编译预处理,第1页,学习目标,掌握函数概念、定义和调用方法。,了解递归概念,并能利用递归方法处理一些实际问题。,了解变量作用域与生存期概念,能够了解全局变量、局部变量、静态变量概念和使用方法。,了解编译预处理概念。,了解宏定义、文件包含和条件编译概念,掌握它们格式和使用方法。,第2页,5.1 函数定义与调用,人们在求解一个复杂问题时候,通常采取,逐步分解、分而治之,方法。也就是把一个大问题分解为几个比较轻易求解小问题,然后分别求解。程序员在设计一个复杂应用程序时,往往也是把整个程序划分为若干个功效较为单一程序模块,然后分别给予实现,最终再把全部程序模块象搭积木一样搭起来,这种在程序设计中分而治之策略,被称为,模块化程序设计,方法。,在C+中,这些模块就是一个个函数。,第3页,5.1 函数定义与调用,函数本质有两点:,函数由能完成特定任务独立程序代码块组成,如有必要,也可调用其它函数,来产生最终输出。,函数内部工作对程序其余部分是不可见。,C/C+是由函数组成,函数是C/C+基本模块。,第4页,5.1 函数定义与调用,一个程序必须有且只有一个,主函数,(main()函数),和若干个,其它函数,。C/C+从main()函数开始执行,由主函数调用其它函数,其它函数之间也能够相互调用。,main(),fun2(),fun1(),fun3(),fun1_1(),fun2_1(),fun2_2(),图 函数调用层次关系,第5页,5.1 函数定义与调用,库函数,C/C+系统以提供函数,提供了丰富功效。多少随系统而定,有一部分对全部C/C+系统都有,格式也相同,称为,标准函数,,还有一部分与系统相关。使用说明:,A)资料 B)联机帮助,用户自定义函数,用户依据所需处理问题而编写,函数定义,是编写一段代码(并不执行),函数定义后就可使用它。称为,函数调用,第6页,5.1 函数定义与调用,函数定义普通形式:,返回类型 函数名(参数表列),语句系列return 适当类型数值,说明:,函数返回值指函数返回值类型,也有称为:函数类型,函数返回值假如是 void,意为无值返回,函数返回值说明若没有,指函数返回整型数。也就是:,若函数返回整型类型数据,可省略函数返回值说明,不然不能省,若参数表空,称为无参函数,不然称为有参函数。,无参函数参数表可写成(void),或写成(),第7页,5.1 函数定义与调用,*,How do you do!,*,要求显示器输出:,#,include,#define NUM 11,void main(),int i;,for(i=0;iNUM;i+),cout*;,coutendl;,cout“How do you do!”endl;,for(i=0;iNUM;i+),cout*;,coutendl;,#,include,#define NUM 11,void print(),int i;,for(i=0;iNUM;i+),cout*;,coutendl;,void main(),print();,cout“How do you do!”b)return a;,else return b;,void main(),int a,b,c,t;,cina,b,c;,t=max(a,b);,t=max(t,c);,couttendl;,coutmax(a,b+10)end;,函数定义,a,b 称为函数形式参数,普通称为形参,每个形参前有形参类型说明(不能写成int a,b),形参之间用逗号隔开;,return,格式为:return 或 return,功效是马上结束函数,返回。,若有表示式,先计算表示式,然后带值返回,函数调用:(1)计算表示式值(该值称为实参)(2),转到函数首先值传递给对应形参,然后开始执行函数体,若从键盘输入:9 4 23,输出是:?,注意:形参加值参数标准上个数、类型应该相一致(特殊情况除外),第9页,调用power(4.6,3),函数power(4.6,3),return,97.336,主程序后续语句,n=3,x=4.6,c=a,【例】,说明实参和形参对应关系示例。,#include,#include,float power(float x,int n),/,求xn次幂,float pow=1;,while(n-)pow*=x;,return pow;,void main(),int n=3;,float x=4.6;,char c=a;,coutpower(x,n)=power(x,n)endl;,coutpower(c,n)=power(c,n)endl;,coutpower(n,x)=power(n,x)endl;,第10页,调用power(,a,3),函数power(,a,3),return,912673,主程序后续语句,n=3,x=4.6,c=a,【,例,】,说明实参和形参对应关系示例。,#include,#include,float power(float x,int n),/,求xn次幂,float pow=1;,while(n-)pow*=x;,return pow;,void main(),int n=3;,float x=4.6;,char c=a;,coutpower(x,n)=power(x,n)endl;,coutpower(c,n)=power(c,n)endl;,coutpower(n,x)=power(n,x)endl;,第11页,调用power(3,4.6),函数power(3,4.6),return,81,主程序后续语句,n=3,x=4.6,c=a,【,例,】,说明实参和形参对应关系示例。,#include,#include,float power(float x,int n),/,求xn次幂,float pow=1;,while(n-)pow*=x;,return pow;,void main(),int n=3;,float x=4.6;,char c=a;,coutpower(x,n)=power(x,n)endl;,coutpower(c,n)=power(c,n)endl;,coutpower(n,x)=power(n,x)ab;,print(a,b);,t=max(a,b);,couttendl;,void print(int a,int b),for(i=0;imax(a,b);i+),cout*;,couty)?x:y;,void print(int,int);,int max(int,int);,int max(int,int);,int max(int,int),void print(int,int);,函数原型,,函数若还没有定义,就先使用,就需要给出函数原型,此时只要提供函数返回值类型,函数名,形参类型即可。,第13页,5.2.3 函数值调用,在C/C+中,函数参数传递都是,值传递,#include,void change(int x,int y),int tmp;,tmp=y;,y=x;,x=tmp;,coutx=xy=yendl;,void main(),int x=3,y=4;,coutx=x x=yendl;,change(x,y);,coutx=x y=yendl;,第14页,5.2.3 函数值调用,第15页,5.2.3 函数值调用,在每次调用一个函数事件,系统内部产生一个栈架(栈:插入删除只允许在一端进行一个表),将函数执行结束后位置记下,然后依此计算实参表示式并将结果放在栈架中,函数内说明变量也在栈架中得到空间,函数在执行对应代码时,在栈架中取对应数据或变量。函数结束后,从栈架中取到返回位置,并退去本函数此次栈架。,第16页,void fun1(int,int);,void fun2(float);,void main(),int x=1;y=2;,fun1(x,y);,void fun1(int a,int b),float x=3;,fun2(x);,void fun2(float y),int x;,x,栈顶,栈底,y,3,fun2(),fun1()运行状态及返回地址,x,3,b,2,a,1,fun1(),main()运行状态及返回地址,y,2,x,1,main(),操作系统运行状态及返回地址,第17页,#include,void change(int x,int y),int tmp;,tmp=y;,y=x;,x=tmp;,coutx=xy=yendl;,void main(),int x=3,y=4;,coutx=x x=yendl;,change(x,y);,coutx=x y=y1,unsigned long fac(unsigned long n),if(n=1)return 1;,else return n*fac(n-1);,#include,void main(),unsigned long n;,cinn;,coutfac(n)endl;,第21页,5.3 函数嵌套与递归调用,递归是一个编程技术,并不是用于计算阶乘。用非递归方法计算阶乘效率更高,我们用递归来计算阶乘,是因为它递归调用易于实现和了解。,第22页,5.3 函数嵌套与递归调用,注意:,编写递归函数时,一定注意要有,递归调用终止条件,,且每调用一次就向调用终止更靠近一步。这可确保递归调用能够正常结束,而不至于造成系统内存耗尽而瓦解。,递归函数总比功效相同非递归函数,慢,,因为每次调用函数时都有调用开销。任何用递归编写 函数都可使用循环结构代替,以消除递归。,第23页,Hanoi塔,hanoi(n,a,b,c)/n个盘a从移到c,允许利用中间杆是b,hanoi(n-1,a,c,b);,a c;,/cout”cendl;,hanoi(n-1,b,a,c);,当只有一个盘时,上述不成立。应直接从a,移到c,A B C,#include ,void hanoi(int n,char a,char b,char c),if(n=1)coutcendl;,else hanoi(n-1,a,c,b);,coutcn;,hanoi(n,A,B,C);,第24页,Hanoi塔,A B C,#include ,void hanoi(int n,char a,char b,char c),if(n=1)coutcendl;,else hanoi(n-1,a,c,b);,coutcendl;,hanoi(n-1,b,a,c);,hanoi(3,A,B,C);,void hanoi(3,A,B,C),if(n=1)coutcendl;,else hanoi(n-1,a,c,b);,coutcendl;,hanoi(n-1,b,a,c);,void hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,第25页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,第26页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,第27页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,A搬到C,第28页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,A搬到C,第29页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,A搬到C,第30页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,第31页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,第32页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,C搬到B,第33页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,C搬到B,第34页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,C搬到B,第35页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,A,C,B),hanoi(1,A,B,C);,A搬到B;,hanoi(1,C,A,B);,第36页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,第37页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,第38页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第39页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,B搬到A,第40页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,B搬到A,第41页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,B搬到A,第42页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第43页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第44页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第45页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第46页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,A搬到C,第47页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,A搬到C,第48页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,A搬到C,第49页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第50页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,hanoi(2,B,A,C),hanoi(1,B,C,A);,B搬到C;,hanoi(1,A,B,C);,第51页,Hanoi塔,A B C,hanoi(3,A,B,C),hanoi(2,A,C,B);,A搬到C;,hanoi(2,B,A,C);,第52页,5.4 作用域和存放类,在C+中,变量,有效范围,(称为变量作用域)和,被存放时间,(称为变量存放期或生存期)都是不一样。,假如按变量作用域来分类话,变量能够分为局部变量和全局变量;假如按变量存放期来分类话,变量能够分为外部变量、静态变量、自动变量、存放器变量。,第53页,5.4 作用域和存放类,在函数外说明变量,从定义变量位置开始到该程序文件结束,全部函数中均可使用,称为全局变量,全局变量初值是0,在块作用域内可经过作用域运算符“:”来使用与局部变量同名全局变量,#include,int i=100;/全局变量,void main(void),int i,j=50;/局部变量,i,=18;,:i,=:i+4;,j=:i+i;,cout:i=:in;,couti=in;coutj=jn;,文件,作用域规则:,第54页,打印,200,调用,func(),函数,func(),200*2,=400,打印,400,n=100,n=100*2,=200,全局变量例子。,#include,int n=100;,void func(),n*=2;,void main(),n*=2;,coutnendl;,func();,coutnendl;,5.4 作用域和存放类,第55页,打印,main()中,t=3.5,调用,fun(),函数,fun(),打印fun()中,t=5,打印main()中,t=3.5,t=3.5,t=5,局部变量例子,#include,void fun(),auto,int,t=5;,/fun()中局部变量,,auto,可省略,coutfun()中t=,t,endl;,void main(),float,t=3.5;,/main()函数中局部变量,coutmain()中t=,t,endl;,fun();,coutmain()中t=tendl;,5.4 作用域和存放类,第56页,5.4 作用域和存放类,标识符只能在说明它分程序内有效,在分程序之外是不可见。每个分程序能够有各自命名法,外层分程序说明名字假如在内层没有重新定义则在内层中继续有效;一旦内层中重新定义,则内层使用是内层重新定义了名字,For语句中说明循环控制变量作用域为包含for语句那个内层块,块,作用域规则:,第57页,全局n=100,200 300,内 i=500,内 j=600,内n=500+600,=1100,1100 500 600,100,200+300=500,500,500 200 300,外部 i=200,外部 j=300,【例】,显示同名变量可见性。,int n=100;,#include,void main(),int i=200,j=300;,cout ntitjendl;,/,内部块,int i=500,j=600,n;,n=i+j;,cout ntitj endl;,/,输出局部变量,n,cout:nendl;/,输出全局变量,n,n=i+j;/,修改全局变量,cout ntitj endl;,第58页,5.4 作用域和存放类,在函数内说明函数原型仅对本函数有效,在函数外说明函数原型对本文件有效,函数,作用域规则:,第59页,5.4 作用域和存放类,存放类:要求了变量生存期,确定何时为变量分配内存空间及何时收回该空间,变量说明:标识符;,存放类能够是下面四种之一:,自动 auto,外部 extern,存放器 register,静态 static,第60页,5.4 作用域和存放类,C/C+存放区域分配图,堆区(动态数据),栈区(函数局部数据),全局数据区(全局、静态),代码区(程序代码),存放应用程序可执行代码,存放应用程序全局数据和静态数据,它们生命期与应用程序生命期一相同,即从应用程序开始运行时起至停顿运行时止。全局数据与静态数据内存空间均是在编译时分配,局部变量存放在栈中,它们内存空间是在程序运行时动态分配,C+中,对内存用new命令创建用delete命令释放。,第61页,5.4 作用域和存放类,自动类变量:,auto,按缺省规则,不加存放类说明为自动。,自动变量进入分程序分配空间(在栈顶),退出分程序,空间由系统回收(退栈),外部类变量:extern,在函数外面说明变量称外部变量。外部变量空间是固定(存放在全局变量区),在程序运行其间一直有效,在程序运行完成后由操作系统回收。,若使用全局变量,先使用后定义,或,不在本文件中定义,,需要使用则要在使用前加 extern说明。,第62页,5.4 作用域和存放类,存放器 register,变量分配在存放器中,以加紧存放速度,当资源限制做不到时,系统视为auto,静态 static,静态变量在退出分程序后仍保留其值,但分程序外不可见。,静态变量初始化仅在分配空间时做一次,若不初始化则系统自动置为0.,第63页,5.4 作用域和存放类,局部静态变量和局部变量对比,#include,st(),static int t=100;/局部静态变量,t+;return t;,at(),int t=100;/自动变量,t+;return t;,void main(),int i;,for(i=0;i5;i+)coutat()t;,coutendl;,for(i=0;i5;i+)coutst()t;,coutendl;,i=0,t=100,1,2,3,4,5,101,101,101,101,101,第64页,5.4 作用域和存放类,i=0,t=100,1,2,101,3,4,5,102,103,104,105,局部静态变量和局部变量对比,#include,st(),static int t=100;/局部静态变量,t+;return t;,at(),int t=100;/自动变量,t+;return t;,void main(),int i;,for(i=0;i5;i+)coutat()t;,coutendl;,for(i=0;i5;i+)coutst()t;,coutendl;,第65页,5.4 作用域和存放类,#include,int sum(int);,void main(),/a=5;,coutsum(4)endl;,coutsum(4)=0,void main(),char ch;,while(cin.get(ch),ch!=n),if(IsNumber(ch)cout是数字字符 endl;,else cout不是数字字符 endl;,因使用频度很高,说明为内联函数。,第69页,5.6 含有缺省参数值函数,在C+中定义函数时,允许,给参数指定一个缺省值,。在调用函数时,若明确给出了这种实参值,则使用对应实参值;若没有给出对应实参,则使用缺省值(C无此功效)。,#include ,float fact(int n,=10,),float f=1;,for(int i=2;i=n;i+)f*=i;,return f;,void main(void),cout fact(5)n;,cout,fact(),n;,第70页,5.6 含有缺省参数值函数,注意:,必须在函数调用前指定缺省参数值,参数缺省值能够是,常量表示式,,表示式中使用量必须是常量,含有缺省值函数参数可有多个,但缺省参数必须位于参数表中最右边,同一个含有缺省参数函数,在不一样地方调用时可使用不一样缺省参数值,第71页,输入长方体长度,宽度和高度,求出长方体体积。,#include,float v(float,float=10,float=20);,void main(void),float x,y,z;,coutxyz;,cout第一个长方体体积为:,v(x,y,z),n;,coutxy;,cout第二个长方体体积为:,v(x,y),n;,coutx;,cout第三个长方体体积为:,v(x),n;,float v(float a,float b,float c),return a*b*c;,第72页,例:对于同一个函数,可在不一样作用域内作不一样原型说明,定义不一样缺省参数值。,float fact(int n=10);,.,void bb(void),float fact(int=20);,.,x=,fact(),;,.,float cc(void),float fact(int=30);,.,y=,fact(),;,.,float dd(void),.,z=,fact(),;,.,float fact(int n),float f=1;,for(int i=2;i=n;i+)f*=i;,return f;,参数缺省值为20,参数缺省值为30,参数缺省值为10,函数定义,函数原型说明,第73页,5.7 函数重载,函数重载是指,完成不一样功效函数能够含有相同函数名,。(C语言无此功效),调用重载函数时,C+编译器依据实参类型或实参个数来确定应该调用哪一个函数。,函数重载表达了C+语言“同一接口,各种实现方法”多态性机制。,注意:,重载函数参数个数或参数类型必须有不一样,仅返回值类型不一样时,不能定义为重载函数,第74页,5.7 函数重载,3+5,=,调用,sum(3,5),函数sum(3,5),return 8,2.2+5.6=,调用sum(2.2,5.6),函数double sum(2.2,5.6),return,7.8,3.5+4+8=,调用,sum(3.5,4,8),函数float sum(3.5,4,8),return 15.5,结束,8,7.8,15.5,#include,sum(int a,int b),return a+b;,double sum(double a,double b),return a+b;,float sum(float a,float b,float c),return a+b+c;,void main(),cout3+5=sum(3,5),endl;,cout2.2+5.6=“,sum(2.2,5.6)endl;,cout3.5+4+8=“,sum(3.5,4,8)endl;,第75页,5.8 编译预处理,源程序,(文本文件),*.CPP,目标文件,(二进制文件),*.OBJ,可执行文件,(二进制文件),*.EXE,库文件,(各种函数),编译,连接,编译预处理,编译预处理指令不属于C+语法范围,为了区分,系统要求每条编译预处理指令用#号开头,单独占用一行。,编译预处理指令可分为三种:包含文件、宏和条件编译。,第76页,5.8.1“包含文件”处理,编译预处理指令 include 指示将另一个源程序文件全部内容包含(插入)到当前源程序文件中,替换该 include 指令行。替换后结果写入暂时文件,当前源程序文件并不改变。,include 指令格式为:,#include “文件名”或#include ,file1.cpp,B,A,#include“file2.cpp,A,B,file1.cpp,file2.cpp,第77页,5.8.1“包含文件”处理,注意:,用双引号括起来文件名表示要从当前工作目录开始查找该文件(通常与源程序文件在同一个文件目录中);若找不到该文件,再到 C+编译器约定 include目录中查找该文件,若仍找不到则犯错。,用“”括起来文件名表示直接从C+编译器约定include目录中查找该文件,,若找不到则犯错。,头文件扩展名通常为.h,也能够使用.cpp。,一条include指令只能包含一个文件。若要包含n个文件,则要使用n条include指令。,包含文件能够嵌套,即在一个头文件中又包含其它头文件。,include指令可出现在源程序中任何一行位置,但通常放在源程序开头。,第78页,5.8.2 宏,编译预处理指令 define 用来定义宏。宏可分为有参数宏和无参数宏。,无参数宏,用一个指定标识符(即名字)来代表一个字符串,这个标识符称为宏名。,编译预处理时,凡是在程序中碰到这个标识符地方都用对应字符串来代替,这个过程称为“宏扩展”。,无参宏定义格式为:,#define 标识符 字符串,第79页,5.8.2 宏,#define PRICE 30,void main(void),int num,total;/*定义变量*/,num=10;/*变量赋值*/,total=num*PRICE;,couttotal=totalendl;,编译前内部替换,作为,total=num*30,第80页,5.8.2 宏,注意:,宏名通惯用大写字母表示;,宏定义可出现在程序任何位置;,宏定义中可使用已定义宏名;,宏扩展时对宏对简单代换,不作任何计算;,可使用预处理命令#undef 宏名 终止宏名作用域;,当宏名出现在字符串中,作为字符处理;,同一作用域中,同一宏名只能定义一次。,第81页,5.8.2 宏,带参数宏定义,#define 宏名(参数表)字符串,#define S(a,b)a*b,.,area=S(x,y);/*area=x*y;*/,形式参数,实际参数,第82页,5.8.2 宏,按#define命令行中指定字符串从左至右进行置换宏名,字符串中形参以对应实参代替,字符串中非形参字符保持不变。,#define S(a,b)a*b,area=S(3,2),3*2,第83页,area=3.1415926*a+2*a+2,实际效果,area=3.1415926*(a+2)*(a+2),实际效果,#define S(r)PI*r*r,换成:,#define S(r)PI*(r)*(r),5.8.2 宏,#define PI 3.1415926,#define S(r)PI*r*r,void main(),float a,area;,a=2;,area=S(a+2),;,coutr=aarea=areaendl;,第84页,注意:,实参有可能是表示式时,在宏定义中要用括号将形参括起来。,在定义带参宏时,宏名与左圆括号之间不能有空格。,当一个宏定义多于一行时,在按换行符(Enter键)之前,必须先使用转义字符“”。,宏与函数定义形式不一样。宏定义中只列出形参名,不说明形参类型。,宏调用时,不对参数作任何计算,只作简单替换。,宏调用时,不对参数作任何检验。,宏没有返回值概念。,屡次调用同一个宏,经宏替换后,会增加程序长度。,第85页,5.8.3 条件编译,#define DEBUG,void main(),int a=14,b=15,c;,c=a/b;,#ifdef DEBUG,cout“a=”a;,cout b=bendl;,#endif,coutc=cendl;,void main(),int a=14,b=15,c;,c=a/b;,cout“a=”a;,cout b=bendl;,coutc=cendl;,第86页,5.8.3 条件编译,void main(),int a=14,b=15,c;,c=a/b;,#ifdef DEBUG,cout“a=”a;,cout b=bendl;,#endif,coutc=cendl;,void main(),int a=14,b=15,c;,c=a/b;,coutc=cendl;,第87页,5.9 多文件组织,内部函数,类型标识符前加static修饰词,外部函数,extern(缺省),多文件组织方式中,在一个文件中要调用在另一个程序文件中定义外部函数前,必须对被调用函数作原型说明,并在函数原型说明前面加上修饰词extern。,在定义函数时加说明符static,就成为静态函数。静态函数只能在定义它文件中使用。,第88页,5.9 多文件组织,假定程序包含两个源程序文件Ex5_11_1.cpp和Ex5_11_2.cpp,程序结构以下:,/*Ex5_11_1.cpp,由main()组成*/,#include,void fun2();,/外部函数申明,等价于extern void fun2();,int n;,/全局变量定义,void main(),n=1;,fun2();,/fun2()定义在文件Ex5_11_2.cpp中,coutn=nendl;,/*Ex5_11_2.cpp,由fun2()组成*/,extern int n;,/外部变量申明,n定义在文件,Ex5_11_1.cpp中,void fun2(),/fun2()被文件Ex5_11_1.cpp中函数调用,n=3;,运行结果:n=3,第89页,5.9 多文件组织,编译,预编译,编译,预编译,预编译,编译,图 C+程序开发过程,file1.h,file1.cpp,file2.h,file2.cpp,filen.h,filen.cpp,暂时文件1,暂时文件2,暂时文件n,file1.obj,file2.obj,filen.obj,Filename.exe,.lib,C+标准类库,连接,运行,第90页,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服