如何从键盘输入任意3个数,并将这3个数从大到小排 序呢?例如,无论你输入2 1 3、3 2 1、1 2 3还是3 1 2,计算机都能够输 出3 2 1,这该怎么办呢?此时你先不要急着往下看,思考一下。
总共有如下几种情况,abc,acb,bac,bca,cab,cba。这六种情况思路如下。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c;
scanf("%d%d%d", &a,&b,&c) ;
if (a>=b && b>=c) printf("%d\n%d\n%d\n",a,b,c) ;
if (a>=c && c>=b) printf("%d\n%d\n%d\n",a,c,b) ;
if (b>=a && a>=c) printf("%d\n%d\n%d\n",b,a,c) ;
if (b>=c && c>=a) printf("%d\n%d\n%d\n",b,c,a) ;
if (c>=a && a>=b) printf("%d\n%d\n%d\n",c,a,b) ;
if (c>=b && b>=a) printf("%d\n%d\n%d\n",c,b,a) ;
system("pause");
return 0;
}
【(内容来源于{啊哈c语言}书籍)当然我们还有第2种方法,我称之为“换位法”。一共有3个变量,也就是说分别有 3个小房子a、b和c。我们的目标是在小房子a中存储最大的变量,在小 房子b中存储次大的变量,在小房子c中存储最小的变量。首先,我们先将小房子a中的数与小房子b中的数做比较,如果小房 子a中的数小于小房子b中的数,则将小房子a和小房子b中的数交换。这 样我们就可以确定,在小房子a和小房子b中,一定是小房子a中存的是 比较大的数。关于如何交换两个变量的值,我们在第2章的第10节已经 讨论过了,需要借助另外一个小房子t作为中转,代码如下:
此时上面的这行语句不能简写为:
因为,当a<b这个条件成立时我们需要连续执行3条语句,此时需要将这3条语句放在一对{ }括号中形成一个语句块,这样当条件a<b成立时,计算机才会依次执行t=a; a=b; b=t;这3条语句。如果不加{ },当条件a<b成立时计算机会执行t=a;,而a=b;和b=t;这2条语句计算机无论如何都不会执行。因为if语句后面只能跟随一条语句或者一个语句块,使得a=b;和b=t;与if(a<b)这个条件没有任何关系。或许如下写法更容易让你理解:?
所以当需要在if语句后面执行多条语句的时候,就必须要用{ }把所 有需要执行的语句括起来,形成一个语句块,这样,计算机就知道它们 是一起的了,要执行就一起执行,要么就都不执行。 接下来,需要再次比较小房子a和小房子c中的数。如果小房子a中 的数小于小房子c中的数,则将小房子a和小房子c中的数交换。这样就 可以确定,在小房子a和小房子c中,一定是小房子a中存的数的值比较大。
经过将小房子a中的数分别与小房子b、小房子c中的数进行比较和 交换,我们可以确定小房子a中存储的数一定是3个数中最大的。至于目 前小房子b和小房子c中存的是什么值不重要,因为我们待会儿还要继续 比较小房子b和小房子c中的值。重要的是已经确定小房子a中存储的已 经是最大的数了。
下面继续比较小房子b和小房子c中的值,将较大的值放在小房子b中。
经过3轮比较,我们终于排序完毕,并将最大的数放在小房子a中, 次大的数放在小房子b中,最小的数放在小房子c中。
下面是完整的代码。]
#include <stdio.h>
#include <stdlib.h>
int main( )
{
int a, b, c, t;
scanf("%d %d %d", &a, &b, &c);
if (a<b) {t=a; a=b; b=t; }
if (a<c) {t=a; a=c; c=t; }
if (b<c) {t=b; b=c; c=t; }
printf("%d %d %d", a, b, c);
system("pause");
return 0;
}