1、C语言习题及答案第十章10-2 定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r. 解:int a,b,c,d,e,f,x,y,z ; int *p,*q,*r ; p=&a;q=&b;r=&c ; p=&d;q=&e;r=&f ; p=&x;q=&y;r=&z ; printf(“%l,%l,%l”,p,q,r) ; printf(“%d,%d,%d”,*p,*q,*r) ; 思考:指针也是一种数据类型吗?他可以不依赖其它数据类型而独立存在吗?10-3 应用指针,实现10个整数从打到小的排序输出。解:#inclu
2、de stdio.hvoid main() int i,j,a10,*p,t; printf(请输入10个整数:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i9;i+) p=&ai ; for(j=i+1;j*p) p=&aj ; t=*p;*p=ai;ai=t; printf(排序后的数组为:n); for(i=0;i10;i+) printf(%d,ai) ; 思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何? 10-4 应用指针,求n个数的最小值和最大值。 解:#include stdio.h#define L 100
3、void main() int i,n,aL,*max,*min; printf(请确定欲输入数据的个数(100):); scanf(%d,&n); printf(下面请依次输入%d的个数n,n); for(i=0;in;i+) printf(第%d的个数: ,i+1); scanf(%d,&ai); max=min=&a0 ; for(i=0;i*max) max=&ai; if(ai*min) min=&ai; printf(最大值=%4d,最小值=%4dn,*max,*min); 思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计? 10-5
4、 应用指针,编写下列字符串处理函数: (1) 字符串的复制函数。 (2) 字符串的连接函数。 解:#include stdio.hvoid copy_string(char *from ,char *to) for(;*from!=0;from+,to+) *to=*from ; *to=0; void link_string(char *from,char *to) for(;*to!=0;to+); for(;*from!=0;from+,to+) *to=*from ; *to=0; void main() char a16=I am a teacher.; char b40=you a
5、re a student.; printf(复制与连接之前:nstring_a=%snstring_b=%sn,a,b); copy_string(a,b); printf(复制之后:nstring_a=%snstring_b=%sn,a,b); link_string(a,b) ; printf(连接之后:nstring_a=%snstring_b=%sn,a,b); 思考:字符指针与字符数组的主要区别是什么?字符数组名代表什么?它与字符指针有何本质的区别?此程序连接之后的输出结果是什么? 10-6 应用指针,求一矩阵中行为最大,列为最小的元素。解:#include stdio.h#defi
6、ne N 5void main() int i,j,aNN,*p,(*q)N,max_min,k,n,flag=0; printf(请输入数组的个元素的值:n); for(i=0;iN;i+) for(j=0;jN;j+) scanf(%d,&aij); for(i=0;iN;i+) /输出数组元素的值 printf(n); for(j=0;jN;j+) printf(%d,aij) ; for(i=0;iN;i+) k=0; p=&ai0;max_min=*p; for(j=0;p=ai+N;p+,j+); if(max_min*p)max_min=*p;k=j; q=a;n=0; for(
7、;q*(*q+k) break ; if(n=N) flag=1; printf(n满足条件的元素为第%d行第%d列的:%dn,i+1,k+1,max_min) ; if(flag!=1) printf(n没有满足条件的元素!) ; 思考:此题与习题8-13类似,请比较这两种不同方式表示的程序,它们各有何特点?10-7 应用指针,完成复数的加,减运算。解:(略,参见习题9-13。)10-8 应用指针,求n个数的最大公约数和最小公倍数。解:#include stdio.h#define N 50int gys(int x,int y) /求两个数的最大公约数 int t; if(yx) t=x;
8、x=y;y=t; while(y!=0) t=x%y; x=y; y=t; return x ;int gbs(int x,int y) /求两个数的最小公倍数 int t; t=gys(x,y); return x*y/t ;void main() int n,i,aN,*p=a; int t1=*p, t2=*p ; /用t1记最大公约数,t2记最小公倍数 printf(请确定数据的个数n(50):); scanf(%d,&n); printf(请输入%d个数据的值:n,n); for(i=0;in;i+) scanf(%d,&ai); /int t1=*p, t2=*p ; /用t1记最
9、大公约数,t2记最小公倍数 for(i=0;in-1;i+) t1=gys(t1,*(p+i+1); t2=gbs(t2,*(p+i+1) ; printf(最大公约数为%d,最小公倍数为%d:n,t1,t2); 思考:“t1=gys(t1,*(p+i+1)”语句的功能是什么?能否用数组小标元素直接处理?试比较之。10-9 有N个人围成一圈,顺序编号,从第一个人开始按1、2、3顺序报数,凡报到3的人退出圈子,然后从出圈的下一个人开始重复此过程。应用指针,输出出圈序列。解:#include stdio.h#define N 100void main() int aN,i,k,n,m,*p; pr
10、intf(请输入人数(100):); scanf(%d,&n); for(i=0;in;i+) ai=i+1 ; /为每个人编号 p=a ; i=0; /小标计数标量 k=0 ; /1,2,3报数时的计数变量 m=0 ; /退出人数的计数器的变量 while(mb成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,ab、a=b类似定义。 解:#include stdio.h#define N 2void main() int a2N,t2=0,0; int i,j,*p1,*p2; for(i=0;i2;i+) printf(请输入第%d个数组的元素n,i+1); fo
11、r(j=0;jN;j+) scanf(%d,&aij); for(i=0;i2;i+) if(i=0) p1=a0,p2=a1; else p1=a1 ,p2=a0 ; for(j=0;j*(p2+j) ti+; if(t0t1) printf(第一个数组大于第二个数组n); else if(t0=t1) printf(第一个数组等于第二个数组n); else printf(第一个数组小于第二个数组n); 思考:程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?10-11 应用指针编写程序,判断空
12、间中的一个点是否在一立方体内。解:#include stdio.hstruct point float x; float y; float z;int flag(float x,int lz,float y) if(xy&ys2,则输出正值,是s1s2,则输出负值。 解:#include stdio.hint i,resu ;void main() void strcmp(char *p1,char *p2); char *s1,*s2; printf(请输入字符串1:); gets(s1); printf(请输入字符串2:); gets(s2); strcmp(s1,s2); printf(
13、 %s与 %s比较的结果是%dn,s1,s2,resu);void strcmp(char *p1,char *p2) for(;*p1=*p2&(*p1!=0);p1+,p2+); if(*p1=0&*p2=0) resu=0 ; else resu=*p1-*p2 ; 思考:在主函数main()中,为何要加语句“void strcmp(char *p1 ,char *p2);”?指针增加、减少及其它运算从理论上讲一般是可行的,但在指针运算从理论运算时,应注意哪些情况的发生? 10-13 输入10个国家的名称,排序输出。 (1) 用指针数组的实现。 (2) 用指向指针的指针实现。 解:(1)
14、 /*用指针数组实现*/#include stdio.h#include string.h#include malloc.hvoid main() int i,j; char *cm10,*t=(char*)malloc(20) ; printf(请输入各个国家的名称(20个字符):n); for(i=0;i10;i+) cmi=(char *)malloc(20) ; gets(cmi); for(i=0;i9;i+) for(j=i+1;j0) strcpy(t,cmi); strcpy(cmi,cmj); strcpy(cmj,t); printf(排序后为: n); for(i=0;i
15、10;i+) printf( %sn,cmi) ; (2) /*用指向指针的指针实现*/#include stdio.h#include string.h#include malloc.h#define N 10void main() int i,j; char *cmN,*p=cm ; /p借用cm的第一个存储单元 char *t=(char *)malloc(20);/交换时的中介指针变量 printf(请输入各个国家的名称(20个字符):n); for(i=0;iN;i+) cmi=(char *)malloc(20) ; gets(cmi); for(i=0;iN-1;i+) *p=c
16、mi ; for(j=i+1;j0) strcpy(t,cmi); strcpy(cmi,cmj); strcpy(cmj,t); *p=cm0;p+ ; printf(排序后为: n); for(i=0;i0) printf(此区间无解!n) ; return 0; printf(次数 区间a断点 区间b断点 近似解c 函数值符号n); d=fabs(b-a); while(de) c=(a+b)/2.0 ; if(fun(c)0) sig=- ; else sig=+; printf(%3d %15.6f%15.6f%15.6f %cn,k,a,b,c,sig) ; if(fun(c)*fun(a)0) b=c ; else a=c ; d=fabs(b-a) ; k+ ; return c ; 思考: 在函数float init(fun,a,b,e)中,参数fun是什么类型?函数名是否也具有变量的特性?它存放着什么?
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1