练习题9及参考答案1.单项选择题(1)C语言的编译系统对宏命令是。A.在程序运行时进行代换处理的B.在程序连接时进行处理的C.和源程序中其他C语句同时进行编译的D.在对源程序中其他成分正式编译之前进行处理的【答】D(2)以下正确的描述为。A.每个C语言程序必须在开头用预处理命令:#includestdio.hB.预处理命令必须位于C源程序的首部C.在C语言中预处理命令都以“#”开头D.C语言的预处理命令只能实现宏定义和条件编译的功能【答】C(3)以下有关宏替换叙述中,错误的是。A.宏替换不占用运行时间B.宏名无类型C.宏替换只是字符替换D.宏名必须用大写字母表示【答】D(4)从下列选项中选择不会引起二义性的宏定义是。A.#definePOWER(x)x*xB.#definePOWER(x)(x)*(x)C.#definePOWER(x)(x*x)D.#definePOWER(x)((x)*(x))【答】D(5)若有以下宏定义:#defineN3;执行语句i=N*3;后,i的值是。A.3B.6C.9D.以上选项都不对【答】D(6)若有以下宏定义:#defineX5#defineYX+1#defineZY*X/2则执行以下printf语句后,输出结果是。inta=Y;printf(%d,,Z);printf(%d\n,--a);A.7,6B.12,6C.12,5D.7,5【答】D(7)若有以下宏定义:#defineN2#defineY(n)((N+1)*n)则执行语句“z=2*(N+Y(5));”后的结果是。A.语句有错误B.z=34C.z=70D.z无定值【答】B(8)若有以下宏定义:#defineMOD(x,y)x%y则执行以下语句后,输出结果是。intz,a=15,b=100;z=MOD(b,a);printf(%d\n,z++);A.11B.10C.6D.宏定义不合法【答】B(9)以下程序的运行结果是。#includestdio.h#defineMAX(A,B)(A)(B)?(A):(B)#definePRINT(Y)printf(Y=%d\n,Y)main(){inta,b,c,d,t;a=1;b=2;c=3;d=4;t=MAX(a+b,c+d);PRINT(t);}A.Y=3B.存在语法错误C.Y=7D.Y=0【答】C(10)为了求i的3次方,请选择一个表达式填入,使程序可以正确运行。#includestdio.h#defineCUBE(x)(x*x*x)main(){inti=4;printf(%d\n,CUBE());}A.i*i*iB.x*x*xC.xD.i【答】D2.填空题(1)以下程序的运行结果是。#includestdio.h#definePR(a)printf(a=%d,a)main(){intj,a[]={1,3,5,7,9,11,13,15},*p=a+5;for(j=3;j;j--)switch(j){case1:case2:PR(*p++);break;case3:PR(*(--p));}}【答】a=9a=9a=11(2)以下程序的运行结果是。#includestdio.h#defineMOD(x,y)x%yvoidmain(){intz,a=15,b=100;z=MOD(b,a);printf(%d\n,z++);}【答】10(3)以下程序的运行结果是。#includestdio.h#defineA3#defineB(a)((A+1)*a)main(){intx;x=3*(A+B(7));printf(x=%d\n,x);}【答】x=93(4)以下程序的运行结果是。#includestdio.h#defineJH(x,y)x=x^y;y=x^y;x=x^ymain(){inta=3,b=5,c=7;JH(a,b);JH(b,c);JH(a,c);printf(a=%d,b=%d,c=%d\n,a,b,c);}【答】a=3,b=7,c=53.编程题(1)编写一个宏定义AREA(a,b,c),用于求一个边长为a、b和c的三角形的面积。其公式为:s=(a+b+c)/2【解】对应的宏如下:#defineS(a,b,c)((a+b+c)/2)#defineAREA(a,b,c)\(sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)))(2)编写一个程序,定义一个判断字符是大写字母的宏,一个判断字符是小写字母的宏以及实现大小写字母相互转换的宏,并将用户输入的一个字符串中的大小写字母互换。【解】判断为大写字母的宏是isupper(c),判断为小写字母的宏是islower(c),将大写字母转换为小写字母的宏是tolower(c),将小写字母转换为大写字母的宏是toupper(c)。程序如下:/*文件名:exci9_2.cpp*/VC++6.0#includestdio.h#defineisupper(c)((c)='A'&&(c)='Z')#defineislower(c)((c)='a'&&(c)='z')#definetolower(c)(isupper(c)?((c)+('a'-'A')):(c))#definetoupper(c)(islower(c)?((c)-('a'-'A')):(c))main(){chars[20];inti;printf(输入字符串:);scanf(%s,s);for(i=0;s[i];i++)if(isupper(s[i]))s[i]=tolower(s[i]);elseif(islower(s[i]))s[i]=toupper(s[i]);printf(转换的结果:%s\n,s);}(3)编写一个程序,用户输入一个字符串,可以原样输出,也可以逆序输出。使用条件编译的方法加以控制。【解】程序如下:/*文件名:exci9_3.cpp*/VC++6.0#includestdio.h#defineCONVERSEmain(){charstr[50],*p=str;printf(输入一字符串:);scanf(%s,str);printf(输出结果:);#ifndefCONVERSEprintf(%s\n,str);/*原样输出*/#elsewhile(*p++!='\0');/*逆序输出*/p-=2;while(p=str)printf(%c,*p--);printf(\n);#endif}