指针杂题练习

问题一:输入十个数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。写三个函数
1>输入十个数;2>进行处理;3>输出十个数。所有函数均用指针;
代码如下:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void input(int a[]); 
void process(int a[]); 
void output(int a[]);
int main(int argc, char *argv[]) {
/*问题:输入十个数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。写三个函数
 1>输入十个数;2>进行处理;3>输出十个数。所有函数均用指针; */
  int a[10];
  input(a);
  process(a); 
 output(a);
 return 0;
}
void input(int a[]){                  //输入函数 
 printf("请输入十个数:");
 int *p;
 int i;
 p=a;
 for(i=0;i<10;i++){
  scanf("%d",&(*(p+i)));
 } 
}
//处理函数有一点问题:实现了第一个数是最小,最后一个数是最大,但是其余的数列顺序发生了改变,所以该函数不够严谨; 
 //void process(int a[]){                //处理函数 
 // int *p,*q;
 // int n,m;
 // p=a;
 // q=a;
 // int i,j;
 // for(i=1;i<10;i++){
 //  if(*(p+i)<a[0]){
 //   m=a[0];
 //   a[0]=*(p+i);
 //   *(p+i)=m;
 //  }
 // }
 // 
 // for(j=0;j<9;j++){
 //  if(*(q+j)>a[9]){
 //   n=a[9];
 //   a[9]=*(q+j);
 //   *(q+j)=n;
 //  }
 // }
 //}
 //必须先寻找出最大数,然后寻找出最小数,然后进行交换,不能频繁交换数据; 
void process(int a[]){                //处理函数 
 int *p,*q;
 int n,m;
 p=a;
 q=a;
 int i;
 int v,w;
 v=0;
 w=0;
 int sum,sam; 
 sum=a[0];
 sam=a[0];
 for(i=0;i<10;i++){                   //寻找出最大值  
  if(a[i]<sum){
   sum=a[i];
  }else if(a[i]>sam){
   sam=a[i];
  }
 }
 while(*p!=sum){ 
   p++; 
   v++;
  }
   m=a[0];
   a[0]=a[v];
   a[v]=m;
   while(*q!=sam){
   q++;
   w++;
  }
   n=a[9];
   a[9]=a[w];
   a[w]=n;
   printf("输出最大值:%d\n",sam);
 printf("输出最小值:%d\n",sum); 
} 
void output(int a[]){                //输出函数 
 printf("输出处理后的函数:");
 int *p;
 int i;
 p=a;
 for(i=0;i<10;i++){
  printf("%d  ",*(p+i));
 }
} 


问题二:
三个整数及整数指针,仅用指针的方法实现由小到大的顺序输出;
拓展:输入n个数,用指针和数组的方法分别实现排序;
实验代码:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void swap(int *,int *);
void putout(int a[], int n);
int main(int argc, char *argv[]) {
//定义三个整数及整数指针,仅用指针的方法实现由小到大的顺序输出; 
//拓展:输入n个数,用指针和数组的方法分别实现排序; 
int n;
 printf("请输入整数的个数:");
 scanf("%d",&n);
 int a[n];
 int i;
 printf("依次输入整数:");
 for(i=0;i<n;i++){
  scanf("%d",&a[i]);
 } 
//方法一:数组方法 
 // int j=0,k; 
 // for(;j<n-1;j++){
 //  for(k=j+1;k<n;k++){
 //  if(a[j]>a[k]){
 //   int s;
 //   s=a[j];
 //   a[j]=a[k];
 //   a[k]=s;
 //  } 
 //  }
 // }
//方法二:指针方法;
 int *p,*q,*s,*k;
 s=&a[n-1];
 k=a;
 int j;
 for(j=0;j<n-1;j++){
  p=&a[j];
  q=&a[j];  
 while(q!=s){
  if(*p>*q){
   swap(p,q);
  } 
  q++;
 } 
}
 for(j=0;j<n;j++){
  if(*(k+j)>*s){
   swap((k+j),s);
  }
 }
 putout(a,n); 
 return 0;
}
void swap(int *p,int *q){     //交换数据函数; 
 int m;
 m=*p;
 *p=*q;
 *q=m; 
}
void putout(int a[],int n){   //输出函数; 
 int i;
 printf("输出排序后的数组:");
 for(i=0;i<n;i++){
  printf("%d ",a[i]); 
 }
}

运行结果:

问题三:写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度;
实验代码:

#include <stdio.h>
#include <stdlib.h>
#define max 1000 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void length(char*p,char a[]);
int main(int argc, char *argv[]) {
//编写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度;
  char a[max];
  printf("输入字符串:");
  scanf("%s",a);
  char *p;
  p=a;
  length(p,a);
 return 0;
}
void length(char*p,char a[]){
 int m=0;
 p=a;
 while(a[m]!='\0'){
 m++;
 }
 printf("输出字符串的长度:%d",m);
}

运行结果:

问题四:利用指向行的指针变量求5*3数组各行元素之和;
由题可知为二维数组;行指针为一位数组名;
运行代码如下:

 #include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
/*利用指向行的指针变量求5*3数组各行元素之和; 
 由题可知为二维数组;行指针为一位数组名;
*/ 
 int a[5][3];
 int i;
 int *q;
 q=&a[0][0];
 printf("任意为数组填充15个元素:");
 printf("\n"); 
 for(i=0;i<15;i++){
  scanf("%d",&*(q+i));
 }
  int sum[5]={0,0,0,0,0};
  int j,k;
  for(j=0;j<5;j++){
   for(k=0;k<3;k++){
   sum[j]+=*(a[j]+k);
  }
 }
  int m;
  for(m=0;m<5;m++){
   printf("第%d行元素的和:%d\n",m+1,sum[m]);
  }
  return 0;
  }

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值