您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Cb程序b设计第二版
C程序设计(第二版)---------------教学课件制作人:黄荧制作人单位:河师大数学与信息科学学院第九章预处理命令本章内容:宏定义:#define…(重点!!!)包含命令:#include…条件编译命令:(难点。)#if…#else…#endifC程序的编译:预处理命令:是指编译之前执行的处理命令。C源程序文件(*.cpp)--目标文件(*.obj)(助记符)c编译系统(二进制指令)§9.1宏定义(宏替换)9.1.1不带参数的宏定义如:#definePI3.1415926一般形式:#define标识符字符串宏定义:使用一个指定的名字来代表一个字符串作用:使得程序可读性更强,更易于修改.例9.1分别求园的周长、面积和球的体积。#definePI3.14159voidmain(){floatl,s,v,r=4.0;l=2.0*PI*r;s=PI*r*r;v=4.0/3.0*PI*r*r*r;printf(l=%.4f\ns=%.4f\nv=%.4f\n,l,s,v);}voidmain(){floatl,s,v,r=4.0;l=2.0*3.14159*r;s=3.14159*r*r;v=4.0/3.0*3.14159*r*r*r;printf(l=%.4f\ns=%.4f\nv=%.4f\n,l,s,v);}宏展开编译c编译系统目标文件(*.obj)注意:为了讲解方便这里的所有关于宏的例子都去掉了应有的包含命令!!!关于宏定义的几点说明:1)宏名一般用大写字母表示.2)宏使程序更简洁,并提高了程序通用性和可读性。如,#defineN01000inta[N0];…for(i=0;iN0;i++)…3)宏展开只是做简单的字符串替换,不作正确性检查.如,#defineN01ooo#definePI3.l4l59264)宏定义不是C语句(!!!),不必在行的末尾加分号。如,#defineN01000;inta[N0];…宏展开inta[1000;];…X关于宏定义的几点说明:1)宏名一般用大写字母表示.2)宏使程序更简洁,并提高了程序通用性。3)宏展开只是做简单的字符串替换,不作正确性检查.4)宏定义不是C语句(!!!),不必在行的末尾加分号。5)宏定义只能在函数之外,它的有效区域是从定义点到文件结束。如,#defineG9.8main(){…}#undefGf1(){…}G的有效范围6)#undef命令终止宏定义的作用域。关于宏定义的几点说明:1)宏名一般用大写字母表示.2)宏使程序更简洁,并提高了程序通用性。3)宏展开只是做简单的字符串替换,不作正确性检查.4)宏定义不是C语句(!!!),不必在行的末尾加分号。5)宏定义只能在函数之外,它的有效区域是从定义点到文件结束。6)#undef命令终止宏定义的作用域。7)新的宏定义可以引用老的宏定义。如,#defineR3.0#definePI3.14159#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf(L=%f\nS=%f\n,L,S);}8)对字符串常量中的宏名不做替换。9)宏定义只用来做简单的字符串替换,不分配内存。其宏展开为:viodmain(){printf(L=%f\nS=%f\n,2*3.14159*3.0,3.14159*3.0*3.0);}若,程序如下有:S(x,y)S(5,9)S(x+2,y)9.1.2带参数的宏定义一般形式:#define宏名(形式参数表)字符串带参数的宏定义:使用一个指定的名字来代表一个包含参数的字符串功能:一般用于代替一个变量表达式(公式),或者代替一个或多个语句.宏展开x*y宏展开5*9宏展开x+2*y(!!!)技巧:当带参宏中出现乘除法或取余等运算时,应加上适当的括号!如,#defineS(a,b)(a)*(b)如,#defineS(a,b)a*b在做宏替换的同时也要做相应参数的替换!!!例9.3定义一个带参的宏,用它来计算半径为r的圆的面积#definePI3.14159#defineS(r)PI*(r)*(r)voidmain(){floata,s1,s2;a=3.6;s1=S(a);s2=S(a+2);printf(r=%f\n,a);printf(s1=%f\n,s1);printf(r=%f\n,a+2);printf(s2=%f\n,s2);}宏展开voidmain(){floata,s1,s2;a=3.6;s1=3.14159*(a)*(a);s1=3.14159*(a+2)*(a+2);printf(r=%f\n,a);printf(s1=%f\n,s1);printf(r=%f\n,a+2);printf(s2=%f\n,s2);}voidmain(){floatr,l,s,v;printf(请输入圆的半径:);scanf(%f,&r);l=2*3.1415926*r;s=3.1415926*r*r;v=4.0/3.0*3.1415926*r*r*r;printf(r=%.2f,l=%.2f,sl=%.2f,v=%.2f\n,r,l,s,v);}例9.4定义一个宏,使它能计算指定半径的圆的周长、面积和球的体积。#definePI3.1415926#defineCIRCLE(R,L,S,V)L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*Rvoidmain(){floatr,l,s,v;printf(请输入圆的半径:);scanf(%f,&r);CIRCLE(r,l,s,v);printf(r=%.2f,l=%.2f,sl=%.2f,v=%.2f\n,r,l,s,v);}宏展开----宏定义中的字符串可以是一串语句例9.5宏定义中的字符串带引号的情况-----定义格式宏#definePRprintf#defineNL\n#defineD%4d#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS%s\nvoidmain(){floata,b,c,d;charstring[]=china;a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);}voidmain(){inta,b,c,d;charstring[]=china;a=1;b=2;c=3;d=4;printf(%4d\n,a);printf(%4d%4d\n,a,b);printf(%4d%4d%4d\n,a,b,c);printf(%4d%4d%4d%4d\n,a,b,c,d);printf(%s\n,string);}宏展开带参宏定义与函数的区别最本质的区别:带参数的宏------简单的字符串替换。函数-------一段可以反复调用执行的功能代码。带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间§9.2文件包含处理命令:#include二一般形式:#include文件名//系统在标准文件夹中寻找相应的h文件或#include文件名//系统在标准文件夹和当前用户文件夹中寻找相应的h文件(!!!)一功能:将一个指定文件的全部内容包含到命令所在的程序中.A#includefile2.hfile1.cfile2.hBfile1.cAB三包含命令的两种常见应用:myfunction.c//放自己定义的函数//切记不要把函数直接写入头文件//否则容易出错//==================//函数功能:求两个整数的最大值//入口参数:两个整数//返回值:两个整数的最大值//==================intmax(inta,intb){return(ab)?a:b;}//==================//函数功能:求3个整数的最大值//入口参数:3个整数//返回值:3个整数的最大值//==================intmax3(inta,intb,intc){intmax;max=(ab)?a:b;max=(cmax)?c:max;returnmax;}file1.c#includestdio.h#includemyfunction.hvoidmain(){inta=3,b=4,c=5,m1,m2;m1=max(a,b);m2=max3(a,b,c);printf(max1=%d\n,m1);printf(max2=%d\n,m2);}1包含系统给出的标准函数库头文件:如#includemath.h2包含个人函数库和常量库头文件:myfunction.h//放自己定义的函数说明和常量#defineN010#defineM05//==================//函数功能:求两个整数的最大值//入口参数:两个整数//返回值:两个整数的最大值//==================intmax(inta,intb);//==================//函数功能:求3个整数的最大值//入口参数:3个整数//返回值:3个整数的最大值//==================intmax3(inta,intb,intc);例9.6将例9.5中的格式宏作为头文件,包含在用户的程序中.myformat.h#definePRprintf#defineNL\n#defineD%4d#defineD1DNL#defineD2DDNL#defineD3DDDNL#defineD4DDDDNL#defineS%s\n#includestdio.h#includemyformat.hvoidmain(){inta,b,c,d;charstring[]=china;a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);}§9.3条件编译P2141条件编译的功能:实现对程序的部分编译。编译:C程序文件(*.c)--目标文件(*.obj)(助记符)c编译系统(二进制指令)2条件编译命令的三种形式:1)#ifdef标识符程序段1[#else程序段2]#endif2)#ifndef标识符程序段1[#else程序段2]#endif3)#if表达式程序段1[#else程序段2]#endifn例9.7输入一行字母,根据需要设置第一种条件编译,使之改为大写,或改为小写输出。#defineLETTER0voidmain(){charstr[20]=clanguage,c;inti;for(i=0;c=str[i];i++){#ifdefLETTERif(c='a'&&c='z')c=c-32;#elseif(c='A'&&c='Z')c=c+32;#endifprintf(%c,c);}putchar('\n');}此时参加编译的程序为:voidmain(){charstr[20]=clanguage,c;inti;i=0;for(i=0;c=str[i];i++){if(c='a'&&c='z')c=c-32;printf(%c,c);}putchar('\n');}1)#ifdef标识符程序段1[#else程序段2]#endifCh9预处理命令§1宏定义命令§2包含命令§3条件编译命令无参宏定义有参宏定义作业199Ex9.1(交换)Ex9.2(求余数)Ex9.4(闰年)补充作业:上机时将你整理的自定义函数分别做成四个头文件:myfunc.h、myarray1.h、mystring.h、myarray2.h并编写一个简单的主程序,从每一个库中随意调用(至少)一个函数。
本文标题:Cb程序b设计第二版
链接地址:https://www.777doc.com/doc-7830777 .html