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

问题描述:

输入3个整数,按从小到大的顺序输出(用指针处理)
#include
int main()
{
\x05int a,b,c,*p1,*p2,*p3,*p;
\x05printf("请输入3个数字以逗号隔开\n");
\x05scanf("%d,%d,%d",&a,&b,&c);
\x05p1=&a;p2=&b;p3=&c;
\x05if(a>b){p=p1;p1=p2;p2=p;}
\x05if(a>c){p=p1;p1=p3;p3=p;}
\x05if(b>c){p=p2;p2=p3;p3=p;}
\x05printf("由小到大排列是\n");
\x05printf("%d,%d,%d",*p1,*p2,*p3);
\x05return 0;
}
我哪里错了啊 谢谢
1个回答 分类:综合 2014-10-14

问题解答:

我来补答
你这样编写有错,你的在比较的时候你都认为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
int main()
{
\x09int a,b,c,*p1,*p2,*p3,*p;
\x09printf("请输入3个数字以逗号隔开:\n");
\x09scanf("%d,%d,%d",&a,&b,&c);
\x09p1=&a;p2=&b;p3=&c;
\x09printf("%d,%d,%d",p1, p2, p3);
\x09if(*p1 > *p2){p=p1;p1=p2;p2=p;}
\x09if(*p2 > *p3){p=p2;p2=p3;p3=p;}
\x09if(*p1 > *p2){p=p1;p1=p2;p2=p;}
\x09printf("由小到大排列是:\n");
\x09printf("%d,%d,%d\n", *p1, *p2, *p3);
\x09return 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的值,其实,他们有换位置的。好好理解下
 
 
展开全文阅读
剩余:2000
上一页:第一个解释一下
下一页:例二,求解