C语言程序设计(姜学峰版)第九章

上传人:xt****7 文档编号:179600303 上传时间:2023-01-02 格式:PPT 页数:28 大小:79KB
返回 下载 相关 举报
C语言程序设计(姜学峰版)第九章_第1页
第1页 / 共28页
C语言程序设计(姜学峰版)第九章_第2页
第2页 / 共28页
C语言程序设计(姜学峰版)第九章_第3页
第3页 / 共28页
点击查看更多>>
资源描述
1第九章第九章 编译预处理编译预处理 宏定义宏定义 文件包含文件包含处理处理2概述概述1.Turbo C的编译过程的编译过程 TC整个编译过程分两步:编译预处理和正式编译;编译预处理根据编译预处理命令进行;正式编译在预处理的基础上进行,包括词法、语法分析和目标代码的生成。由于TC采用单趟扫描编译,因而在发出编译命令后,编译预处理和正式编译一次完成,其间不会产生预处理后的中间文件。32.预处理命令的分类预处理命令的分类主要有三类:宏定义 文件包含 条件编译(改善程序的可移植性)3.预处理命令的使用要求预处理命令的使用要求1)以#号打头;2)不是C语句,而不必以分号结束;3)通常书写在函数之外、源文件开头;4 宏定义宏定义 用一个标识符来代表一个字符串;宏定义分为不带参数和带参数的宏定义。1.无参宏定义无参宏定义一般形式:#define 宏名 宏字符串其中:1)define是宏定义命令名;2)宏名按C标识符命名规则命名,通常字母大写;3)宏串是不加双引号的字符序列;4)当宏串为数字串时,宏名又称为符号常量。5作用:在编译预处理阶段,将定义点之后的宏名全部用宏串替换;替换过程也称为宏展开。意义:1)便于参数的修改,一改全改;2)一次定义可多处引用。6例:输入半径r,求圆周长和圆面积。#main()float r,c,s;printf(Enter radius:);scanf(%f,&r);c=2.0*PI*r;/*展开后:c=2.0*3.141592*r;*/s=PI*r*r;/*展开后:s=3.141592*r*r;*/printf(C=%-10.2fnS=%-10.2fn,c,s);Enter radius:17使用说明:1)利用TC的预处理实用程序CPP.EXE,可仅完成预编译并产生预编译的中间文件,其扩展名为.i对上例:执行程序对进行预处理:C:TC30CPP C:ZYCCPRGEXA91.C显示预编译中间文件的内容:C:TC30TYPE EXA91.I 82)一个宏命令只能定义一个宏名;3)宏串中的每个字符都是有效字符;下例多余字符均导致编译出错:#define PI 3.141592宏展开结果:c=2.0*3.141592*r;#define PI 3.141592;宏展开结果:c=2.0*3.141592;*r;94)宏定义可书写在函数之外的任何位置;一个宏名 的有效范围是定义点开始直到本源文件结束;但 可利用宏终止命令加以限定;如:#main()宏名G有效;fun1()main、fun1可引用。#undef G fun2()105)字符串中与宏名相同的字符不被替换;6)宏串中可出现已定义的宏名,这种现象称为宏的 嵌套定义;如:#define C 2.0*PI*R#define S PI*R*R main()printf(C=%fnS=%fn,C,S);最终输出项C S11例:一程序多处使用相同的输入提示、多处使用相 同的输出格式字符串,为减少书写量,使用宏 定义来实现。#define PROMPT printf(Please input data:)#define FORMAT Result:%d,%d,%d,%dnmain()int a,b,c,d,e,f;PROMPT;/*宏引用*/scanf(%d,%d,%d,&a,&b,&c);PROMPT;scanf(%d,%d,%d,&d,&e,&f);printf(FORMAT,a,b,c,a+b+c);printf(FORMAT,d,e,f,d+e+f);122.带参数的宏定义带参数的宏定义定义一般形式:#define 宏名(形参字串表)宏串带参的宏引用:宏名(实参字串表)其中:1)形参字串应是宏串的子字串,长度可为1或更大;2)实参字串应与形参字串个数相同;带参的宏展开过程:在宏串替换宏引用的过程中,将宏串从左到右逐一展开,遇到与形参相同的字符串,则用对应的实参字符串顶替,遇到其它字符则按顺序正常展开。13例:计算以a、b为半径的圆面积之和及以a、b之和为半径的圆面积。#define S(r)3.141592*r*rmain()float a=2.0,b=3.0,area1,area2,area3;area1=S(a);/*area1=3.141592*a*a;*/area2=S(b);/*area2=3.141592*b*b;*/area3=S(a+b);/*area3=3.141592*(a+b)*(a+b);*/printf(Total area:%-7.2fn,area1+area2);printf(R:%-7.2fCircle area:%-7.2fn,a+b,area3);14带参的宏使用说明:1)带参的宏展开过程中出现的实参顶替形参是字符 的顶替,而不是值的顶替;如上例宏引用S(a):实参字符a顶替形参字符r,不是ar;上例宏引用S(a+b):实参字符串(a+b)顶替形参字符r;2)为了保证宏展开的结果符合设计本意,应在宏串 或实参字串中加入必要的括号;如:#define S(r)3.141592*(r)*(r)153)宏定义中宏名与参数的括号间不能有空格;如:#define S (r)3.141592*(r)*(r)宏串 由于出现了空格,则认为S是宏名而且无参。4)TC对宏串中双引号范围内的内容不予替换;如:#define PR(V)printf(V=%dt,V);main()int a=1,b=2;PR(a);/*printf(V=%dt,a);*/PR(b);/*printf(V=%dt,b);*/16例:计算四边形的面积。#include math.h#define AREA(s,a,b,c)sqrt(s*(s-a)*(s-b)*(s-c)float fun(float x,float y,float z)float area,t;t=S(x,y,z);/*t=(x+y+z)/2.0;*/area=AREA(t,x,y,z);return(area);/*area=sqrt(t*(t-x)*(t-y)*(t-z);*/main()float a,b,c,d,e,area;scanf(%f,%f,%f,%f,%f,&a,&b,&c,&d,&e);area=fun(a,b,c)+fun(c,d,e);printf(*%-7.2fn,area);17例:#define N 2#define Y(n)(N+1)*n)执行语句 z=N*(2+Y(5);后的z值?宏展开后的语句:z=2*(2+15);z值为34。例:#define MAX(x,y)(x)(y)?(x):(y)语句t=MAX(a+b,c+d);的展开结果?宏展开后的语句:t=(a+b)(c+d)?(a+b):(c+d);18 文件包含文件包含预处理命令预处理命令命令一般形式:#include 文件名 其中:1)include是文件包含命令名;2)文件名指出需要包含的文件名;可是系统头文 件、用户头文件、用户源程序文件的名字;3)文件名前可带盘符、路径。作用:在预编译阶段,将被包含文件的内容包含到本源文件中,使正式编译的对象是包含后的整体。19例:输入半径r,求圆周长和圆面积。方法:将宏定义等预处理命令编辑在一个用户头文件中,并保存在;将程序函数编辑在源文件中;MY.H:#include /*预编译时将的*/main()/*内容包含到此处*/float r,c,s;printf(Enter radius:);scanf(%f,&r);c=2.0*PI*r;s=PI*r*r;DOS printf(C=%-10.2fnS=%-10.2fn,c,s);20例:求34矩阵最大元素及位置,程序的两个函数分别编制在和两个源文件中。MYPRG.Cint fun1(int x4)int i,j,max;max=x00;line=col=0;/*不必对外部变量声明*/for(i=0;i3;i+)for(j=0;jmax)max=xij;line=i;col=j;return(max);21EXA96.Cint line,col;/*全局变量定义*/#include c:zyccprgmyprg.c/*将包含到此*/main()int a34=1,2,3,4,5,6,7,8,9,10,11,12,i,j,max;for(i=0;i3;i+)/*按行输出矩阵*/printf(n);for(j=0;j4;j+)printf(%4d,aij);max=fun1(a);/*函数调用*/printf(nMAX:a%d%d=%dn,line,col,max);注:用这种包含源文件的方法也可调试多源文件程序;此时不必作外部函数声明、不必建立项目文件。22例:包含系统头文件#include stdio.h#include math.hmain()char str80;float x,y;printf(Enter a string:);gets(str);printf(Enter a data:);scanf(%f,&x);y=sqrt(x);printf(%sn%f square root:%7.2fn,str,x,y);23文件包含说明:1)系统头文件存放在C:TC30INCLUDE目录中,扩 展名为.h。头文件是文本文件,内容是相关的宏 定义、结构定义等;2)”与的区别 ”先在当前目录查找指定的头文件,未找到 再沿TC的设置查找;仅在TC的设置中查找;24函数举例:函数举例:例:用自定义函数判断素数;main中输出100200 之间的全部素数。#include math.hmain()int num,m,count=0,prime(int);for(num=101;num=199;num=num+2)m=prime(num);if(m)printf(%5d,num);count+;if(count%10=0)printf(n);25main();for(num=101;num=199;num=num+2)m=prime(num);if(m);int prime(int n)int i,k,mark=1;k=sqrt(n);for(i=2;i=k;i+)if(n%i);/*余数非零为真*/else mark=0;break;return(mark);26例:用自定义函数将一方阵在原数组中转置。#define N 5main()void change(int a ),parray(int a N);int aNN,i,j;printf(nEnter A array(%d):,N*N);for(i=0;iN;i+)for(j=0;jN;j+)scanf(%d,&aij);printf(nOld A array:);parray(a);change(a);/*数组名作实参*/printf(nNew A array:);parray(a);27void change(int aNN)int i,j,t;for(i=0;iN;i+)/*以对角线为对称轴交换*/for(j=0;ji;j+)t=aij;aij=aji;aji=t;return;void parray(int aN)int i,j;for(i=0;iN;i+)printf(n);for(j=0;jN;j+)printf(%5d,aij);28例:用递归法将一个整数转换成字符串输出。#include stdio.hchar ch12=0;/*定义全局数组*/main()void fun(long);long num;scanf(%ld,&num);fun(num);puts(ch);void fun(long n)static int i=0;if(n0)ch0=-;i+;n=-n;if(n/10!=0)fun(n/10);/*递归调用*/chi=n%10+0;/*数值转换为字符*/i+;return;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!