当前位置:文档之家› 第10章指针类型习题及答案

第10章指针类型习题及答案

第十章指针类型习题及其答案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个整数从打到小的排序输出。

解:#include "stdio.h"void main(){int i,j,a[10],*p,t;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++){p=&a[i] ;for(j=i+1;j<10;j++)if(a[j]>*p) p=&a[j] ;t=*p;*p=a[i];a[i]=t;}printf("排序后的数组为:\n");for(i=0;i<10;i++)printf("%d,",a[i]) ;}思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何?10-4 应用指针,求n个数的最小值和最大值。

解:#include "stdio.h"#define L 100void main(){int i,n,a[L],*max,*min;printf("请确定欲输入数据的个数(<100):");scanf("%d",&n);printf("下面请依次输入%d的个数\n",n);for(i=0;i<n;i++){printf("第%d的个数:",i+1);scanf("%d",&a[i]);}max=min=&a[0] ;for(i=0;i<n;i++){if(a[i]>*max) max=&a[i];if(a[i]<*min) min=&a[i];}printf("最大值=%4d,最小值=%4d\n",*max,*min);}思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计?10-5 应用指针,编写下列字符串处理函数:(1) 字符串的复制函数。

(2) 字符串的连接函数。

解:#include "stdio.h"void 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 a[16]="I am a teacher.";char b[40]="you are a student.";printf("复制与连接之前:\nstring_a=%s\nstring_b=%s\n",a,b); copy_string(a,b);printf("复制之后:\nstring_a=%s\nstring_b=%s\n",a,b);link_string(a,b) ;printf("连接之后:\nstring_a=%s\nstring_b=%s\n",a,b);}思考:字符指针与字符数组的主要区别是什么?字符数组名代表什么?它与字符指针有何本质的区别?此程序连接之后的输出结果是什么?10-6 应用指针,求一矩阵中行为最大,列为最小的元素。

解:#include "stdio.h"#define N 5void main(){int i,j,a[N][N],*p,(*q)[N],max_min,k,n,flag=0;printf("请输入数组的个元素的值:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);for(i=0;i<N;i++) //输出数组元素的值{printf("\n");for(j=0;j<N;j++)printf("%d",a[i][j]) ;}for(i=0;i<N;i++){k=0;p=&a[i][0];max_min=*p;for(j=0;p=a[i]+N;p++,j++);if(max_min<*p){max_min=*p;k=j;}q=a;n=0;for(;q<a+N;q++,n++)if(max_min>*(*q+k)) break ;if(n==N){flag=1;printf("\n满足条件的元素为第%d行第%d列的:%d\n",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(y>x) {t=x;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,a[N],*p=a;int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数printf("请确定数据的个数n(<50):");scanf("%d",&n);printf("请输入%d个数据的值:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);//int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数for(i=0;i<n-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 a[N],i,k,n,m,*p;printf("请输入人数(<100):");scanf("%d",&n);for(i=0;i<n;i++)a[i]=i+1 ; //为每个人编号p=a ;i=0; //小标计数标量k=0 ; //1,2,3报数时的计数变量m=0 ; //退出人数的计数器的变量while(m<n){if(*(p+i)!=0) k++ ;if(k==3){printf("%d,",*(p+i));*(p+i)=0 ; //将退出的编号置为0k=0;m++ ;}i++ ;if(i==n) i=0 ; //报数到尾后,i应恢复为0}}思考:此题不用指针也可以完成,应做哪些修改?此题不用数组是否也可以实现其计算过程?10-10 应用指针,完成数组的关系运算。

对于数组a、b,a>b成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,a<b、a=b类似定义。

解:#include "stdio.h"#define N 2void main(){int a[2][N],t[2]={0,0};int i,j,*p1,*p2;for(i=0;i<2;i++){printf("请输入第%d个数组的元素\n",i+1);for(j=0;j<N;j++)scanf("%d",&a[i][j]);}for(i=0;i<2;i++){if(i==0) p1=a[0],p2=a[1];else p1=a[1] ,p2=a[0] ;for(j=0;j<N;j++){if(*(p1+j)>*(p2+j))t[i]++;}}if(t[0]>t[1])printf("第一个数组大于第二个数组\n");else if(t[0]==t[1])printf("第一个数组等于第二个数组\n");elseprintf("第一个数组小于第二个数组\n");}思考:程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?10-11 应用指针编写程序,判断空间中的一个点是否在一立方体内。

相关主题