内容正文:
<C语言程序设计教程>清华大学出版社(第3版)
第十章 预处理命令 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、 关于宏定义说法错误的是 。
A、 宏替换的操作是在预编译时进行的。
B、 宏定义时宏名必须要用大写,以此来区分变量名。
C、 定义宏时以#define打头。
D、 宏定义可以带参数,也可以不带参数。
A、
2、 若有定义如下,则下面说法错误的是 。
#define N 5
#define M N*10
#define L L+N*M
#define LONG “this is a very long string\
that is used as an example”
A、 N、M、L、LONG都是宏名,代表后面的单词串
B、 LONG定义中,”\”表示续行符,当单词串太长,使用续行符可分对行书写。
C、 在编译预处理时,宏M被5*10替换。
D、 宏L定义是正确,宏可以递归定义
3、 若有语句如下,输出结果是 。
#define LIN 12345
printf(“LIN”);
A、12345
B、 “12345”
C、 LIN
D、 定义出错,无法输出
4、 下列关于条件编译正确是 。
A、 if后面的条件必须是常量表达式,通常会用到宏名,条件可以不加括号()。
B、 在使用了#if、#ifdef、#ifndef后,#endif语句可写可不写。
C、 #elif和#else语句必须要有。原创精品资源学科网独家享有版权,侵权必究!
D、 #ifned...#endif形式,如果宏名被#define行定义,则编译#ifned下的程序段。
5、 在宏定义#define NUM 123.56中,宏名NUM代替的是 。
A、 单词串 B、float型数据 C、double 型数据 D、常量
6、 若有以下定义,则输出结果是 。
#define N 3
#define M(x) (N+x*2)
printf(“%d”,M(N*2)+3);
A、12 B、15 C、18 D、语句有错
7、 若有以下定义,则输出结果是 。
#define MOD(x,y) x%y
int a=-7,b=26,z; z=MOD(a,b);
printf(“%d”,++z);
A、6 B、-4 C、8 D、-6
8、 若有以下定义,则输出结果是 。
#define Y 5
#ifndef Y
int a=-5; printf(“%d”,a>>1);
#else
printf(“Y==5”);
#endif
A、 -3 B、-2 C、Y==5 D、无法确定值
9、 若有以下定义,则输出结果是 。
#define LIN 5
#ifdef LIN
printf("%d",strlen("ab\08\abce"));
#else
printf("%d",sizeof("ab\08\abce"));
#endif } 原创精品资源学科网独家享有版权,侵权必究!
A、8 B、2 C、9 D、无法确定值
10、 若有以下定义,则输出结果是 。
#define N 2
#define M(x) N<<1+x
int y=3;
printf("%d",M(y/2)-1);
A、4 B、5 C、7 D、8
二、填空题(共6空,每空2分,共12分)
1、条件编译必须以 命令结束。
2、 预处理命令必须以 开头。能以 命令终止宏的作用域。
3、 若有以下宏定义:
#define F(a,b,c) a+b*c
int a=1,b=2,c=3,s; s=F(++a,a+b++,b+c);则s值为 。
4、 #if和#elif常常与 命令配合使用。
5、 若有以下宏定义:
#define X 10
#define Y (X+1)*3
int a=Y+1;
printf(“%d”,a--); 则输出结果为 。
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
#define N 20
#define L N*2+5
void main()
{ if(!(N%2)) printf("%d",N+1);
printf("%d
",L+N) }
2、以下程序的运行结果是 。
#include<stdio.h>
#define PR(x,y) printf("%d,%d,",x,y) 原创精品资源学科网独家享有版权,侵权必究!
void main()
{ int *p1, *p2,*p3;
int x=12,y=6;
p2=&x,p3=&y;
if(*p2>*p3){p1=p2,p2=p3,p3=p1;}
PR(x,y);
PR(*p2,*p3); }
6、 以下程序的运行结果是 。
#include<stdio.h>
#define MAX(x,y) x>y?"yes":"no"
#define PR(x) printf("result=%s
",x)
void main()
{ int x=30;
unsigned y=-30;
PR(MAX(x,y)); }
4、以下程序的运行结果是 。
#include<stdio.h>
#define AND +
void main( )
{ int a=15,b=20;
#define OK 1
#ifdef OK
a=3;
if(OK!=a) printf("%d,",a AND b);
#else
a=1;b=21;
if(a==OK) b=b AND 1; printf(“%d,”,b);
#endif
printf("%d
",b); }原创精品资源学科网独家享有版权,侵权必究!
5、以下程序的运行结果是 。
#include<stdio.h>
#include<ctype.h>
#define LEN 1
void main()
{ char str[30]="bs12UDR154xsfB";
int i,count1=0,count2=0;
for(i=0;str[i]!='\0';i++) {
#if LEN
if(isalpha(str[i])) count1++;
#else
if(str[i]>='0'&&str[i]<='9') count2++;
#endif
}
printf("count1=%d,count2=%d
",count1,count2); }
6、 以下程序的运行结果是 。
#include<stdio.h>
#define N 3
#define M(x) N*x+1
void fun(int *a,int n)
{ int i;
for(i=0;i<5;i++)
a[i]=i+M(i); }
void main()
{ int a[5]={1,2,3,4,5},i;
fun(a,5);
for(i=0;i<5;i++)
printf("%4d",*(a+i)); }
原创精品资源学科网独家享有版权,侵权必究!
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:求a,b,c的最大值,并输出。请填空。
#include<stdio.h>
//宏定义参数为a,b
#define PRINT(X) printf(“max=%d”,X)
void main()
{ int a,b,c,max;
scanf(“%d,%d,%d”,&a,&b,&c);
max=
max=MAX(max,c);
; //输出最大值max
}
2、 程序功能:如果条件为真,则求x,y两数的和,否则求x,y两数的余数。请填空。
#include<stdio.h>
#define INT 1
#define ADD(a,b) a+b
#define MOD(a,b) a%b
void main()
{ int a,b,s,y;
scanf("%d,%d",&a,&b);
INT==1
s=ADD(a,b);
printf("s=%d
",s);
#else
y= ;
printf("y=%d
",y);
}
原创精品资源学科网独家享有版权,侵权必究!
五、程序改错题(共20分)
1、程序功能:输出字符数组str中出现数字字符和字母字符的个数。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #define N 30;
L3 void main()
L4 { char str[N];
L5 int i=0,count1=0,count2=0;
L6 gets(str);
L7 while(*(str+i)!='\0')
L8 { if(str[i]>='0'&&str[i]<='9') count1++;
L9 if(str[i]>='A'&&str[i]<='Z'&&str[i]>='a'&&str[i]<='z') count2++;
L10 i++; }
L11 printf("count1=%d,count2=%d
",count1,count2); }
2、程序功能:利用宏定义,给一维数组a元素赋值为奇数数列,从1开始。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #define N 10
L3 #define JS(x) x*2+1
L4 #define PRINT(Y) printf("%4d",a[i])
L5 void main()
L6 { int a[N],i;
L7 for(i=0;i<N;i++)
L8 a[i]=JS;
L9 for(i=0;i<N;i++)
L10 PRINT(a[i]); }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$
<C语言程序设计教程>清华大学出版社(第3版)
第十章 预处理命令 章节过关卷
考试时间:90分钟 满分:100分
姓名 班级 学号
1、 选择题(共10题,每小题2分,共20分)
1、 关于宏定义说法错误的是 。
A、 宏替换的操作是在预编译时进行的。
B、 宏定义时宏名必须要用大写,以此来区分变量名。
C、 定义宏时以#define打头。
D、 宏定义可以带参数,也可以不带参数。
A、
【答案】B
【解析】宏定义时宏名通常用大写,以此来区分变量名。故选B。
2、 若有定义如下,则下面说法错误的是 。
#define N 5
#define M N*10
#define L L+N*M
#define LONG “this is a very long string\
that is used as an example”
A、 N、M、L、LONG都是宏名,代表后面的单词串
B、 LONG定义中,”\”表示续行符,当单词串太长,使用续行符可分对行书写。
C、 在编译预处理时,宏M被5*10替换。
D、 宏L定义是正确,宏可以递归定义
【答案】D
【解析】D选项中,宏不可以递归定义,但是可以嵌套定义。故选D。
3、 若有语句如下,输出结果是 。
#define LIN 12345
printf(“LIN”);
A、12345
B、 “12345”
C、 LIN
D、 定义出错,无法输出
原创精品资源学科网独家享有版权,侵权必究!
【答案】C
【解析】C语言中双引号括起来的是字符串,不作为宏进行替换。故选C。
4、 下列关于条件编译正确是 。
A、 if后面的条件必须是常量表达式,通常会用到宏名,条件可以不加括号()。
B、 在使用了#if、#ifdef、#ifndef后,#endif语句可写可不写。
C、 #elif和#else语句必须要有。
D、 #ifned...#endif形式,如果宏名被#define行定义,则编译#ifned下的程序段。
【答案】A
【解析】B选项,在使用了#if、#ifdef、#ifndef后,必须以#endif命令结尾;C选项,#elif和#else语句可以没有;D选项,D、#ifned...#endif形式,如果宏名没有被#define行定义,才编译#ifned下的程序段。故选A。
5、 在宏定义#define NUM 123.56中,宏名NUM代替的是 。
A、 单词串 B、float型数据 C、double 型数据 D、常量
【答案】A
【解析】宏名代替后面的单词串。故选A
6、 若有以下定义,则输出结果是 。
#define N 3
#define M(x) (N+x*2)
printf(“%d”,M(N*2)+3);
A、12 B、15 C、18 D、语句有错
【答案】C
【解析】宏M被3+3*2*2替换,算出结果后在加3,最终结果为18。故选C。
7、 若有以下定义,则输出结果是 。
#define MOD(x,y) x%y
int a=-7,b=26,z; z=MOD(a,b);
printf(“%d”,++z);
A、6 B、-4 C、8 D、-6
【答案】D
【解析】-7%26=-7,-7+1=-6。故选D。原创精品资源学科网独家享有版权,侵权必究!
8、 若有以下定义,则输出结果是 。
#define Y 5
#ifndef Y
int a=-5; printf(“%d”,a>>1);
#else
printf(“Y==5”);
#endif
A、 -3 B、-2 C、Y==5 D、无法确定值
【答案】C
【解析】#ifndef...#endif形式,如果宏名没有被#define行定义,才编译#ifndef下的程序段,所以执行#else后的程段,结果为Y==5。故选C。
9、 若有以下定义,则输出结果是 。
#define LIN 5
#ifdef LIN
printf("%d",strlen("ab\08\abce"));
#else
printf("%d",sizeof("ab\08\abce"));
#endif }
A、8 B、2 C、9 D、无法确定值
【答案】B
【解析】#ifdef...#endif形式,#ifdef如果宏名被#define行定义,执行#ifdef下的程序段,strlen返回字符串长度,遇到’\0’结束。故选B。
10、 若有以下定义,则输出结果是 。
#define N 2
#define M(x) N<<1+x
int y=3;
printf("%d",M(y/2)-1);
A、4 B、5 C、7 D、8
【答案】C
【解析】宏M被2<<1+3/2替换,运算符+的优先级高于<<,得到结果8后,再减1得7。故选C。原创精品资源学科网独家享有版权,侵权必究!
原创精品资源学科网独家享有版权,侵权必究!
二、填空题(共6空,每空2分,共12分)
1、条件编译必须以 命令结束。
【答案】#endif
2、 预处理命令必须以 开头。能以 命令终止宏的作用域。
【答案】# #undef
3、 若有以下宏定义:
#define F(a,b,c) a+b*c
int a=1,b=2,c=3,s; s=F(++a,a+b++,b+c);则s值为 。
【答案】11
4、 #if和#elif常常与 命令配合使用。
【答案】defined
5、 若有以下宏定义:
#define X 10
#define Y (X+1)*3
int a=Y+1;
printf(“%d”,a--); 则输出结果为 。
【答案】34
三、程序运行题(共6题,每小题3分,共18分)
1、以下程序的运行结果是 。
#include<stdio.h>
#define N 20
#define L N*2+5
void main()
{ if(!(N%2)) printf("%d",N+1);
printf("%d
",L+N) }
【答案】2165
2、以下程序的运行结果是 。
#include<stdio.h>
#define PR(x,y) printf("%d,%d,",x,y)
void main()
{ int *p1, *p2,*p3;
int x=12,y=6;
p2=&x,p3=&y;
if(*p2>*p3){p1=p2,p2=p3,p3=p1;}
PR(x,y);
PR(*p2,*p3); }
【答案】12,6,6,12,
6、 以下程序的运行结果是 。
#include<stdio.h>
#define MAX(x,y) x>y?"yes":"no"
#define PR(x) printf("result=%s
",x)
void main()
{ int x=30;
unsigned y=-30;
PR(MAX(x,y)); }
【答案】result=no
4、以下程序的运行结果是 。
#include<stdio.h>
#define AND +
void main( )
{ int a=15,b=20;
#define OK 1
#ifdef OK
a=3;
if(OK!=a) printf("%d,",a AND b);
#else
a=1;b=21;
if(a==OK) b=b AND 1; printf(“%d,”,b);
#endif原创精品资源学科网独家享有版权,侵权必究!
printf("%d
",b); }
【答案】23,20
5、以下程序的运行结果是 。
#include<stdio.h>
#include<ctype.h>
#define LEN 1
void main()
{ char str[30]="bs12UDR154xsfB";
int i,count1=0,count2=0;
for(i=0;str[i]!='\0';i++) {
#if LEN
if(isalpha(str[i])) count1++;
#else
if(str[i]>='0'&&str[i]<='9') count2++;
#endif
}
printf("count1=%d,count2=%d
",count1,count2); }
【答案】count=9,count=0
6、 以下程序的运行结果是 。
#include<stdio.h>
#define N 3
#define M(x) N*x+1
void fun(int *a,int n)
{ int i;
for(i=0;i<5;i++)
a[i]=i+M(i); }
void main()
{ int a[5]={1,2,3,4,5},i;
fun(a,5);
for(i=0;i<5;i++)原创精品资源学科网独家享有版权,侵权必究!
printf("%4d",*(a+i)); }
【答案】1 5 9 13 17
四、程序填空题(共6空,每空5分,共30分)
1、程序功能:求a,b,c的最大值,并输出。请填空。
#include<stdio.h>
//宏定义参数为a,b
#define PRINT(X) printf(“max=%d”,X)
void main()
{ int a,b,c,max;
scanf(“%d,%d,%d”,&a,&b,&c);
max=
max=MAX(max,c);
; //输出最大值max
}
【答案】#define MAX(a,b) a>b?a:b MAX(a,b); PRINT(max)
2、 程序功能:如果条件为真,则求x,y两数的和,否则求x,y两数的余数。请填空。
#include<stdio.h>
#define INT 1
#define ADD(a,b) a+b
#define MOD(a,b) a%b
void main()
{ int a,b,s,y;
scanf("%d,%d",&a,&b);
INT==1
s=ADD(a,b);
printf("s=%d
",s);
#else
y= ;
printf("y=%d
",y);原创精品资源学科网独家享有版权,侵权必究!
}
【答案】#if MOD(a,b) #endif
五、程序改错题(共20分)
1、程序功能:输出字符数组str中出现数字字符和字母字符的个数。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #define N 30;
L3 void main()
L4 { char str[N];
L5 int i=0,count1=0,count2=0;
L6 gets(str);
L7 while(*(str+i)!='\0')
L8 { if(str[i]>='0'&&str[i]<='9') count1++;
L9 if(str[i]>='A'&&str[i]<='Z'&&str[i]>='a'&&str[i]<='z') count2++;
L10 i++; }
L11 printf("count1=%d,count2=%d
",count1,count2); }
【答案】 L2 #define N 30
L9 if(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z') count2++;
2、程序功能:利用宏定义,给一维数组a元素赋值为奇数数列,从1开始。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分)
L1 #include<stdio.h>
L2 #define N 10
L3 #define JS(x) x*2+1
L4 #define PRINT(Y) printf("%4d",a[i])
L5 void main()
L6 { int a[N],i;
L7 for(i=0;i<N;i++)
L8 a[i]=JS;
L9 for(i=0;i<N;i++)
L10 PRINT(a[i]); }原创精品资源学科网独家享有版权,侵权必究!
【答案】L4 #define PRINT(Y) printf("%4d",Y)
L8 a[i]=JS(i);
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$