练习题9及参考答案
1. 单项选择题
(1)C语言的编译系统对宏命令是 。 A. 在程序运行时进行代换处理的 B. 在程序连接时进行处理的
C. 和源程序中其他C语句同时进行编译的 D. 在对源程序中其他成分正式编译之前进行处理的 【答】D
(2)以下正确的描述为 。
A. 每个C语言程序必须在开头用预处理命令:#include
D. C语言的预处理命令只能实现宏定义和条件编译的功能 【答】C
(3)以下有关宏替换叙述中,错误的是 。 A. 宏替换不占用运行时间 B. 宏名无类型
C. 宏替换只是字符替换 D. 宏名必须用大写字母表示 【答】D
(4)从下列选项中选择不会引起二义性的宏定义是 。 A. #define POWER(x) x*x B. #define POWER(x) (x)*(x) C. #define POWER(x) (x*x) D. #define POWER(x) ((x)*(x)) 【答】D
(5)若有以下宏定义: #define N 3;
执行语句i=N*3;后,i的值是 。
A. 3 B. 6 C. 9 D. 以上选项都不对 【答】D
(6)若有以下宏定义: #define X 5 #define Y X+1 #define Z Y*X/2
则执行以下printf语句后,输出结果是 。 int a=Y; printf(\printf(\
A. 7,6 B. 12,6 C. 12,5 D. 7,5 【答】D
(7)若有以下宏定义: #define N 2
#define Y(n) ((N+1)*n)
则执行语句“z=2*(N+Y(5));”后的结果是 。
A. 语句有错误 B. z=34 C. z=70 D. z无定值 【答】B
(8)若有以下宏定义: #define MOD(x,y) x%y
则执行以下语句后,输出结果是 。 int z,a=15,b=100; z=MOD(b,a); printf(\
A. 11 B. 10 C. 6 D. 宏定义不合法 【答】B
(9)以下程序的运行结果是 。 #include
#define MAX(A,B) (A)>(B)?(A):(B) #define PRINT(Y) printf(\main() {
int a,b,c,d,t; a=1;b=2;c=3;d=4; t=MAX(a+b,c+d); PRINT(t); }
A. Y=3 B.存在语法错误 C. Y=7 D. Y=0 【答】C
(10)为了求i的3次方,请选择一个表达式 填入,使程序可以正确运行。 #include
printf(\}
A. i*i*i B. x*x*x C. x D. i 【答】D
2. 填空题
(1)以下程序的运行结果是 。 #include
#define PR(a) printf(\main() {
int j,a[]={1,3,5,7,9,11,13,15},*p=a+5; for (j=3;j;j--) switch(j)
{ case 1:
case 2:PR(*p++);break; case 3:PR(*(--p)); } }
【答】a=9 a=9 a=11
(2)以下程序的运行结果是 。 #include
int z,a=15,b=100; z=MOD(b,a); printf(\} 【答】10
(3)以下程序的运行结果是 。 #include
#define B(a) ((A+1)*a) main() { int x; x=3*(A+B(7)); printf(\}
【答】x=93
(4)以下程序的运行结果是 。 #include
#define JH(x,y) x=x^y;y=x^y;x=x^y main() {
int a=3,b=5,c=7; JH(a,b); JH(b,c); JH(a,c);
printf(\}
【答】a=3,b=7,c=5
3. 编程题
(1)编写一个宏定义AREA(a,b,c),用于求一个边长为a、b和c的三角形的面积。其公式为:
s=(a+b+c)/2
【解】对应的宏如下: #define S(a,b,c) ((a+b+c)/2) #define AREA(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
#include
#define isupper(c) ((c)>='A' && (c)<='Z') #define islower(c) ((c)>='a' && (c)<='z')
#define tolower(c) (isupper(c) ? ((c)+('a'-'A')):(c)) #define toupper(c) (islower(c) ? ((c)-('a'-'A')):(c)) main() {
char s[20]; int i;
printf(\输入字符串:\ scanf(\ for (i=0;s[i];i++) if (isupper(s[i])) s[i]=tolower(s[i]); else if (islower(s[i])) s[i]=toupper(s[i]); printf(\转换的结果:%s\\n\}
(3)编写一个程序,用户输入一个字符串,可以原样输出,也可以逆序输出。使用条件编译的方法加以控制。
【解】程序如下: /*文件名:exci9_3.cpp*/
VC++6.0
#include
char str[50],*p=str;
printf(\输入一字符串:\ scanf(\ printf(\输出结果:\ #ifndef CONVERSE
printf(\原样输出*/ #else
while (*p++!='\\0'); /*逆序输出*/ p-=2; while (p>=str) printf(\ printf(\ #endif }