输入3个整数,按从小到大的顺序输出(用指针处理)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入3个整数,按从小到大的顺序输出(用指针处理)相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int main()

int a,b,c,*p1,*p2,*p3,*p;
printf("请输入3个数字以逗号隔开\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a>b)p=p1;p1=p2;p2=p;
if(a>c)p=p1;p1=p3;p3=p;
if(b>c)p=p2;p2=p3;p3=p;
printf("由小到大排列是\n");
printf("%d,%d,%d",*p1,*p2,*p3);
return 0;

我哪里错了啊 谢谢

你这样编写有错,你的在比较的时候你都认为p1指向a,p2指向b,p3指向c,但是其实如果指针交换其值以后就不是这么指向了,所以结果出错。但是就是你这样不错,你也最好不要这么写,你在将变量a,b,c的值赋给指针p1,p2,p3指向的值以后最好不要在利用变量a,b,c。不然程序某些稍微修改下,其它地方也得修改,这样很不好,例如你修改"p1=&a;p2=&b;p3=&c;"为"p1=&c;p2=&b;p3=&a;"后下面的比较都要做大幅改动,按你的思路该这么写:
#include<stdio.h>

int main()

int a,b,c,*p1,*p2,*p3,*p;
printf("请输入3个数字以逗号隔开:\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
printf("%d,%d,%d",p1, p2, p3);
if(*p1 > *p2)p=p1;p1=p2;p2=p;
if(*p2 > *p3)p=p2;p2=p3;p3=p;
if(*p1 > *p2)p=p1;p1=p2;p2=p;
printf("由小到大排列是:\n");
printf("%d,%d,%d\n", *p1, *p2, *p3);
return 0;

其实排序的话比较简单的算法是用冒泡排序,但这里不能用,因为冒泡排序一般用于数组等存放有规律的数的排序,虽不能用,但是排序时你要用这个思想。冒泡排序原理比较简单,就是将最小或的数往一个方向冒就行。比如要将n个数从小到大排序,就有两种方法,一种是将小数往前冒,另一种是将大数往后冒。采取大的数往后冒的话,就要先找出n个数中最大的数,将其放在最后,然后不管最后一个数,找出n-1个数中最大的数将其放在最后(注意:是n-1个数的最后,不是所有数的最后),然后n-2个……,n-3个……,……,当只剩下一个时就排好了。追问

好的 就以你的A=3,B=1,C=2为例,现在假设A的地址是R,B的地址是S,C的地址是T,
一开始 A→R B→S C→T
第一次比较 A→S B→R C→T
第二次比较A→T B→R C→S
第三次不成立 A→T B→R C→S
那么最后的地址就是A的地址就是T,B的地址是R,C的地址是S,着我输出R,S,T的地址对应的值不因该是B,C,A吗?同时谢谢你的提醒!!

追答

应该是指针R,S,T分别指向变量A,B,C,其值分别为3,1,2
按你程序的做法:
一开始 R→A S→B T→C
第一次比较A,B 交换位置即为R→B S→A T→C
第二次比较A,C(这里开始出错,比较A,C没有意义了,你的意图是比较第一个数B和第三个数C的。所以应该比较R,T。第一次比较没错是因为位置开始还没换,你可以将程序比较部分改为下面这样也不会出错。)
if(a > b)p=p1;p1=p2;p2=p;
if(*p2 > *p3)p=p2;p2=p3;p3=p;
if(*p1 > *p2)p=p1;p1=p2;p2=p;

第三次跟第二次一样的错误 。
所犯的错误为一直以为第一个数为A的值,第二个数为B的值,第三个数为C的值,其实,他们有换位置的。好好理解下

参考技术A A=3,B=1,C=2,假设A的地址是R,B的地址是S,C的地址是T,
一开始 p1→R p2→S p1→T
第一次比较 p1→S p2→R p3→T
第二次比较 p1→T p2→R p3→S
第三次不成立 p1→T p2→R p3→S
那么最后的地址就是p1的地址就是T,p2的地址是R,p3的地址是S,
输出p1,p2,p3的地址对应的值是T(C)、R(A)、S(B)
你的目的是要P1指向数最小的数据,P3指向最大的数据,
但是由于第二次交换的时候指针的指向发生了变化,所以产生了错误。
你可以用冒泡法等算法进行排序。
参考技术B 你的程序指示交换指针,即交换了变量地址,变量a,b,c的值并没有改变。
当你输入 a=8,b=5,c=6时:
第一个 IF a>b(8>5),所以执行后得:p1=&b,p2=&a,p3=&c;
第二个 IF a>c(8>6,因为只是改变地址,a,b,c的值没有改变),所以执行后得:p1=&c,p2=&a,p3=&b;
第三个 IF b<c(5<6),不执行。
自己看看应该能明白吧!
参考技术C

在第一次判断是你的指针p1指向的值为5,即指向b;但是第二次判断之后又将p1指向a、c中的较小者c,但是C的值并不比p1原来指向的a小,故与p1始终指向值最小的变量的初衷不一样。

参考技术D #include<stdio.h>
int main()

int a,b,c,p,*p1,*p2,*p3;
printf("请输入3个数字以逗号隔开\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a>b)p=*p1;*p1=*p2;*p2=p;
if(a>c)p=*p1;*p1=*p3;*p3=p;
if(b>c)p=*p2;*p2=*p3;*p3=p;
printf("由小到大排列是\n");
printf("%d,%d,%d",*p1,*p2,*p3);
return 0;
追问

你的是a,b,c交换,为什么我拿指向a,b,c的指针交换不可以呢??谢谢

追答

并没有交换a,b,c的值。

c语言指针数组排序?

用指针实现:由键盘输入10个整数,将他们按由小到大的顺序排列。
输入: 键盘输入的10个整数。
输出: 按由小到大的顺序排列。
输入样例: 1 5 4 3 2 9 23 11 5 7
输出样例: 1 2 3 4 5 5 7 9 11 23
#include<stdio.h>
main()

char i,a[10];
float *p;
p=a;
for(i=0;i<10;i++)
gets(a[i]);
if(a[i]>a[i+1])

p=a[i];
a[i]=a[i+1];
a[i]=p;

printf("%d\n",i);


哪里错误?!

p是int类型指针,指向数组a的第1个元素即一个一维的数组1,2,3首地址所以p[1]相当于a[0][1]所以printf("%d\n",p[1]);
输出2 。 int **pp =pa 是声明了一个指向pa的指针,而pa又是指向a首地址的int类型指针。pa指向的是a的第一维,pa[0] = a[0] ,pp[2][1]相当于a[2][1]而a数组的[2]中只初始化了[2][0]位置的7,那[2][1]位置就是默认的值0,所以printf("%d\n",pp[2][1]);
输出0
参考技术A //冒泡排序算法
#include<stdio.h>
void swap2(int*,int*);
void bubble(int a[],int n);
int main(void)

int n,a[8];
int i;

printf("Enter n(n<=8):");
scanf("%d",&n);
printf("Enter a[%d]:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);

printf("After sorted,a[%d]=",n);//输出
for(i=0;i<n;i++)
printf("%3d",a[i]);

return 0;

void bubble(int a[],int n) //n是数组a中待排序元素的数量

int i,j;
for(i=1;i<n;i++) //外部循环
for(j=0;j<n-i;j++) //内部循环
if(a[j]>a[j+1]) //比较两个数的大小
swap2(&a[j],&a[j+1]); //如果前一个元素大,则交换

void swap2(int*px,int*py)

int t; //两数交换
t=*px;
*px=*py;
*py=t;
参考技术B #include<stdio.h>
main()

char i,a[10];/*这里是int*/
float *p;/*这里也是int p */
p=a;/*这个不要*/
for(i=0;i<10;i++)/*这里是10-1*/
gets(a[i]);
if(a[i]>a[i+1])

p=a[i];
a[i]=a[i+1];
a[i]=p;

printf("%d\n",i);/*for(i=0;i<10;i++)printf("%d",a[i]);*/
参考技术C #include<stdio.h>
void main()

void paixu(int *);
int a[10],*p;
p=a;
for(;p<a+10;p++)
scanf("%d",p);
paixu(a);
for(p=a;p<a+10;p++)
printf("%4d"*p);

void paixue(int *p)
int *i,*j,num;
for(i=p;i<p+10;i++)
for(j=i;j<i+10;j++)
if(*i>*(j+1))

mun=*i;
*i=*(j+1);
*(j+1)=mun;
参考技术D 输出的应该还是数组里的值而不是下标吧。另外i应该定义成int型不能定义为char型。先初始化时循环读入十个数,比较时也要循环十次,不能放一个for循环里边。

以上是关于输入3个整数,按从小到大的顺序输出(用指针处理)的主要内容,如果未能解决你的问题,请参考以下文章

用指针实现:由键盘输入10个整数,将他们按由小到大的顺序排列。

写一个函数,使N个整数按由小到大的顺序排列,要求在主函数中输入10个数,并输出排好序的数

输入三个整数,比较三个数大小并按从小到大的顺序排列。python代码怎么写?高手请指导,谢谢!

编程 有3个整数a、b、c,由键盘输入,编程序按从小到大的顺序输出它们

写一函数对输入的一组整数由小到大排序,在main主函数调用该函数实现排序。(输入任意个整数即可输出

c++程序设计,输入4个整数按从小到大顺序输出