资源描述
第十章习题答案
一、单项选择题
8
1. C
2. A
3. B
4. B
5. D
6. D
7. A
8. C
9. B
10. D
11. B
12. A
13. C
14. C
15. C
16. D
17. C
18. B
19. A
20. C
21. C
22. A
23. C
24. D
25. B
26. C 或 D
27. D
28. A
29. C
30. D
31. C
32. D
33. B
二、填充题
1. 地址 加减 赋值 数组名
2. 地址 NULL
3. 取地址运算符 相互赋值 赋NULL
4. 加减整数 ++, --
5. 间接访问 取地址
6. 比较
7. 3 +3
8. double *p=&a
9. 地址 所指的变量值 地址
10. sz[i] p[i] *(sz+i) 和 *(p+i)
11. ABCD A
12. static int a[5];
13. int a[4][5], **p=a;
14. 50
15. *min, *a, *b, *c a, b, c *a, *b, *c *min=*b *min=*c *min
16. ’\0’ ++
17. sp=str[i] sp strlen(sp)
三、程序分析题
1. 输出结果: udent
2. 输出结果: our
3. 输出结果: 3 ello
4. BBB AAA 123
5. 程序输出:ABCDEDGH
6. 程序的主要功能:把输入的10个整数反序一行一个的输出。
7. 程序运行的输出结果:A ABCD
B BCD
C CD
D D
8. 该程序找出数组中最大和最小的元素,分别与第一和最后的元素交换,运行结果输出:13,10,-3,1,7,-21
9. 程序用pi和指针pj指向字符串s的头尾,然后逐步向中比较字符,到不等时终止。
若都相等,则是“回文”,回答“YES”,否则回答“NO”。因此当输入字符串“LEVEL”
时,输出“YES”,当输入字符串“LEVAL”时输出“NO”。
10. 四个字符指针指向四个字符串,程序每次循环p指向一个字符串,*p输出第一个字符,运行的输出结果:AEIM
11. 程序运行输出结果:0 1 2 3
-1 0 1 2
-2 –1 0 1
-3 –2 –1 0
12.程序运行输出结果:
1
0
0
1
13. 程序运行输出结果: x=10 , y=5
x=10 , y=10
14.程序运行输出结果: 3 , 2 , 5
3 , 3 , 4
四、程序设计题(全部题目均要求用指针方法实现)
1.解:
#include <stdio.h>
void main( )
{ int a,b,c, *pa=&a, *pb=&b, *pc=&c;
scanf(“%d,%d,%d“,pa,pb,pc);
if(*pa>=*pb)
if(*pb>*pc) printf(“%d,%d,%d\n“,*pa,*pc,*pb);
else if(*pa>*pc) printf(“%d,%d,%d\n“,*pa,*pc,*pb);
else printf(“%d,%d,%d\n“,*pc,*pa,*pb);
else if(*pc>*pb) printf(“%d,%d,%d\n“,*pc,*pb,*pa);
else if(*pa>*pc) printf(“%d,%d,%d\n“,*pb,*pa,*pc);
else printf(“%d,%d,%d\n“,*pb,*pc,*pa);
}
2.解:
#include <stdio.h>
#define N 15
void main( )
{ int a[N],b,*p,*q;
for(p=a;p<a+N;p++) scanf(“%d”,p);
for(p=a,q=a+N-1;p<a+N/2;p++, q--);
{ b=*p, *p=*q; *q=b; }
for(p=a;p<a+N;p++) printf(“%3d”,*p);
printf(“\n”);
}
3.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char str[81], *sptr;
gets(str);
sptr=str+srlen(str)-1;
for( ;sptr>=str ; sptr--) printf(“%c”,*sptr);
printf(“\n”);
}
4.解:
#include <stdio.h>
#define N 10
void main( )
{ float a[N], avg, *pm, *ps, *p;
for(p=a;p<a+N;p++) scanf(“%f”,p);
pm=ps=a; avg=*a;
for(p=a+1;p<a+N;p++);
{ if(*p>*pm) pm=p;
if(*p<*ps) ps=p;
avg+=*p;
}
printf(“一维实型数组最大值=%f\n”,*pm);
printf(“一维实型数组最小值=%f\n”,*ps);
printf(“一维实型数组平均值=%f\n”,avg/N);
}
5.解:
#include <stdio.h>
void main( )
{ int a[3][6], (*p)[6] , i , j , maxh=0,maxl=0,minh=0,minl=0,max,min;
for(p=a,i=0;i<3;i++)
for(j=0;j<6;j++) scanf(“%d”,*(p+i)+j);
printf(“二维数组是:\n”);
for(p=a,i=0;i<3;i++,p++)
{ for(j=0;j<6;j++) printf(“%3d”,(*p)[j]);
printf(“\n”);
}
max=min=a[0][0];
for(p=a,i=0;i<3;i++)
for(j=0;j<6;j++)
{ if(*(*(p+i)+j)>max) { maxh=i; maxl=j; max=*(*(p+i)+j); }
if(*(*(p+i)+j)<min) { minh=i; minl=j; min=*(*(p+i)+j); }
}
printf(“最大值是:%d所在的行:%d所在的列:%d\n”,a[maxh][maxl],maxh,maxl);
printf(“最小值是:%d所在的行:%d所在的列:%d\n”,a[minh][minl],minh,minl);
}
6.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char s[3][81], *p[3]={s[0],s[1],s[2]}.*tp;
int i;
printf(“输入3个字符串:\n”);
for(i=0;i<3;i++) gets(p[i]);
tp=p[0];
for(i=1;i<3;i++) if(strcmp(p[i],tp)>0) tp=p[i];
printf(“其中最大的字符串是:%s\n”,tp);
}
7.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char a[40],b[40],c[80],*s,*t=c;
gets(a); gets(b);
s=a;
for( ;*s; ) *t++ = *s++;
s=b;
for( ; *s ; ) *t++ = *s++;
*t=’\0’;
puts(c);
}
8.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char a[81],b[81],*s=a,*t=b;
gets(a); gets(b);
while(*s&&*t)
if(*s++!=*t++) break;
if(!*s&&!*t) printf(“%s 与 %s 相等\n“,a,b);
else printf(“%s 与 %s 不相等\n“,a,b);
}
9.解:
#include <stdio.h>
#include N 10
void main( )
{ int s[N],*p=s, *min, *max, t1,t2;
printf(“输入十个整数(用空格分开):\n“);
for(p=s;p<s+N;p++) scanf(“%d“, p);
min=&s[0]; max=&s[N-1];
for(p=s; p<s+N;p++)
{ if (*p<*min) min=p;
if (*p>*max) max=p;
}
t1=*min; *min=s[0]; s[0]=t1;
t2=*max; *max=s[N-1]; s[N-1]=t2;
for(p=s; p<s+N;p++) printf(“%d“,*p);
}
10.解:
#include <stdio.h>
void main( )
{ int s[10],i,,end_num, *p;
for( i=0; i<10; i++) scanf(“%d“, &s[i]);
printf(“\n“);
for( i=0;i<4;i++) {
end_num=s[9];
for(p=&s[9] ; p>=s; p--) *p=*(p-1); // 移动数据
s[0]=end_num;
}
printf(“移动后的数组值是:“);
for( p=s; p<s+10; p++) printf(“%d “,*p);
}
11.解:
#include <stdio.h>
void main( )
{ int a[3][3],i,j,t,*p,(*q)[3];
p=a[0];
printf(“输入3×3个整数:\n“);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf(“%d“,p++);
p=a[0];
printf(“输出3×3个整数矩阵:\n“);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf(“%3d“, *(p+i*3+j));
printf(“\n“);
}
q=a;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{ t=*(*(q+i)+j); *(*(q+i)+j)=*(*(q+j)+i); *(*(q+j)+i)=t;}
printf(“转置后3×3的整数矩阵:\n“);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf(“%3d“,*(*(q+i)+j));
printf(“\n“);
}
}
12.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char a[80],*p;
int up=0,1p=0,k=0,s=0,q=0;
printf(“输入一个字符串:\n“); gets(a);
p=a;
while(*p!=’\0’) {
if(’A’<= *p && *p<=’Z’) up++;
else if(’a’<= *p && *p<=’z’) lp++;
else if(’0’<= *p && *p<=’9’) s++;
else if(*p ==’ ’) k++;
else q++;
p++;
}
printf(“大写字母个数是:%d\n“,up);
printf(“小写字母个数是:%d\n“,lp);
printf(“空格个数是:%d\n“,k);
printf(“数字个数是:%d\n“,s);
printf(“其他字符个数是:%d\n“,q);
}
13.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char a[80],b[80],*p,*q;
int m;
printf(“输入一个字符串:\n“); gets(a);
printf(“输入第几个字符开始复制:“); scanf(“%d“,&m);
p=a; q=b;
for(p=p+m-1; *p!=’\0’; p++,q++) *q= *p;
*q=’\0’;
printf(“被复制的字符串是:%s\n“,b);
}
14.解:
#include <stdio.h>
#include <string.h>
void main( )
{ char a[10][80],t[80],*p[10],*k;
int i,j;
printf(“输入10个字符串:\n“);
for(i=0;i<10;i++)
{ p[i]=a[i]; gets(p[i]); }
printf(“这10个字符串原来是:\n“);
for(i=0;i<10;i++) puts(p[i]);
for(i=0;i<9;i++)
{ k=p[i];
for(j=i+1; j<9; j++)
if(strcmp(k, p[j])>0) k=p[j];
if(k!=p[i]) { strcpy(t, k); strcpy(k, p[i]); strcpy(p[i], t); }
}
printf(“这10个字符串交换后:\n“);
for(i=0;i<10;i++) puts(p[i]);
}
15. 解:
#include <stdio.h> #include <stdio.h>
void strmcpy(char s[ ],char t[ ], int m) void strmcpy(char *s, char *t, int m)
{ int j; { for( t=t+m-1; *t !=’\0’; s++, t++)
for( j=0; t[j]!=’\0’; j++) * s= *t;
s[j]=t[j+m-1]; *s=’\0’;
s[j]=’\0’; }
}
展开阅读全文