11. 下列程序由两个文件组成,其运行结果是 。 /* 文件1 */
#include <>
int x=10;int y=10;
extern void sub(); add: y=25; sub:y=5; main: x=25; void add(void)
{ int y=5; y=x+10; x*=2; printf(“add:y=%d; ”,y);} main()
{ x+=5; add(); sub();printf(“main:x=%d; main:y=%d\\n”,x,y);} /* 文件2 */
extern int x; void sub(void)
{ int y=5; x-=y; printf(“sub:y=%d; ”,y);} 12. 下列程序由两个文件组成,其运行结果是 。 /* 文件1 */
#include <>
static int x=2;int y=3; in add1 x=4 y=6in add2 x=20 extern void add2(); void add1(); y=8 main()
{ add1(); add2();add1();add2();printf(“in main x=%d y=%d\\n”,x,y);} void add1(void)
{ x+=2; y+=3; printf(“in add1 x=%d y=%d”,x,y);} /* 文件2 */
static int x=10; void add2(void)
{ extern int y; x+=10; y+=2; printf(“in add2 x=%d y=%d\\n”,x,y); }
习题九 编译预处理
一. 选择题
1—10: DDCBC CABBB 11-20: BBCBB 二. 填空题
1. 下列程序的输出结果是 1000 10 。
#define N 10 #define s(x) x*x #define f(x) (x*x) main()
{ int i1,i2;i1=1000/s(N);i2=1000/f(N);printf(“%d %d\\n”,i1,i2);}
2. 设有如下宏定义:
#define MYSWAP(z,x,y) {z=x;x=y;y=z;}
以下程序段通过宏调用实现变量a、b内容交换,请填空。 float a=5,b=16,c;MYSWAP( c ,a,b); 3. 下列程序的输出结果是 11 。
#define NX 2+3 #define NY NX*NX main()
{ int i=0,m=0; for(;i #define MAX(x,y) (x)>(y)(x):(y) main() { int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%d\\n”,t);} 5. 下列程序的输出结果是 MIN 。 #define MAX(a,b) a>b #define EQU(a,b) a==b #define MIN(a,b) a { int a=5,b=6; if(MAX(a,b)) printf(“MAX\\n”); if(EQU(a,b)) printf(“EQU\\n”); if(MIN(a,b)) printf(“MIN\\n”);} 6. 下列程序的输出结果是 0 1 1 。 #define TEST main() { int x=0,y=1,z; z=2*x+y; #ifdef TEST printf(“%d %d ”,x,y); #endif printf(“%d\\n”,z); } 三. 编程题 1. 定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。 #define R(m,n) (m)%(n) #include <> void main() { int m,n; printf(\ scanf(\ printf(\ } 2. 分别用函数和带参的宏,从3个数中找出最大者。 #include <> #define MAX(a,b) ((a)>(b)(a):(b)) max=%d\\n\ printf(\} MACRO 3. 输入一个整数m,判断它能否被3整除。要求利用带参的宏实现。 #include <> #define DIVIDEDBY3(m) (m)%3==0 void main() { int m; printf(\ scanf(\ if(DIVIDEDBY3(m)) printf(\ else printf(\} 习题十 指针 一.填空题 1. 指针变量是把内存中另一个数据的 首地址 作为其值的变量。 2. 能够直接赋值给指针变量的整数是 0 。 3. 如果程序中已有定义:int k; 1) 定义一个指向变量k的指针变量p的语句是 int *p=&k; 。 2) 通过指针变量,将数值6赋值给k的语句是 *p=6; 。 3) 定义一个可以指向指针变量p的变量pp的语句是 int **pp; 。 4) 通过赋值语句将pp指向指针变量p的语句是 pp=&p; 。 5) 通过指向指针的变量pp,将k的值增加一倍的语句是 (**pp)*=2; 。 4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参 类型可以是 整型数组名 、 指向整型数据的指针值 等。 5. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。 #include <> main( ) { char *p,s[6]; int n; p=s; gets(p); n=*p-'0'; while( *(p++) != '\\0') n=n*8+*p-'0'; printf(\ } 二.选择题 1—10: BCADC AAABB 11-15: CBCDC 16. 以下count函数的功能是统计substr在母串str中出现的次数。 int count(char *str,char *substr) { int i,j,k,num=0; for(i=0; ① ;i++) {for( ② ,k=0;substr[k]==str[j];k++,j++) if(substr[ ③ ]==’\\0’) {num++;break;} } return num; } ① A) str[i]==substr[i] B) str[i]!=‘\\0’ C) str[i]==‘\\0’ D) str[i]>substr[i] ② A) j=i+1 B) j=i C) j=i+10 D) j=1 ③ A) k B) k++ C) k+1 D) ++k 17. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。 void Delblank(char *s) { int i,t; char c[80]; for(i=0,t=0; ① ;i++)