当前位置:文档之家› 练习题9及参考答案

练习题9及参考答案

练习题9及参考答案
1. 单项选择题
(1)C语言的编译系统对宏命令是。

A. 在程序运行时进行代换处理的
B. 在程序连接时进行处理的
C. 和源程序中其他C语句同时进行编译的
D. 在对源程序中其他成分正式编译之前进行处理的
【答】D
(2)以下正确的描述为。

A. 每个C语言程序必须在开头用预处理命令:#include <stdio.h>
B. 预处理命令必须位于C源程序的首部
C. 在C语言中预处理命令都以“#”开头
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("%d,",Z);
printf("%d\n",--a);
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("%d\n",z++);
A. 11
B. 10
C. 6
D. 宏定义不合法【答】B
(9)以下程序的运行结果是。

#include <stdio.h>
#define MAX(A,B) (A)>(B)?(A):(B)
#define PRINT(Y) printf("Y=%d\n",Y)
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 <stdio.h>
#define CUBE(x) (x*x*x)
main()
{
int i=4;
printf("%d\n",CUBE( ));
}
A. i*i*i
B. x*x*x
C. x
D. i
【答】D
2. 填空题
(1)以下程序的运行结果是。

#include <stdio.h>
#define PR(a) printf("a=%d ",a)
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 <stdio.h>
#define MOD(x,y) x%y
void main()
{
int z,a=15,b=100;
z=MOD(b,a);
printf("%d\n",z++);
}
【答】10
(3)以下程序的运行结果是。

#include <stdio.h>
#define A 3
#define B(a) ((A+1)*a)
main()
{
int x;
x=3*(A+B(7));
printf("x=%d\n",x);
}
【答】x=93
(4)以下程序的运行结果是。

#include <stdio.h>
#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=%d,b=%d,c=%d\n",a,b,c);
}
【答】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 <stdio.h>
#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("%s",s);
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",s);
}
(3)编写一个程序,用户输入一个字符串,可以原样输出,也可以逆序输出。

使用条件编译的方法加以控制。

【解】程序如下:
/*文件名:exci9_3.cpp*/
VC++6.0
#include <stdio.h>
#define CONVERSE
main()
{
char str[50],*p=str;
printf("输入一字符串:");
scanf("%s",str);
printf("输出结果:");
#ifndef CONVERSE
printf("%s\n",str); /*原样输出*/ #else
while (*p++!='\0'); /*逆序输出*/ p-=2;
while (p>=str)
printf("%c",*p--);
printf("\n");
#endif
}。

相关主题