排序三个数字的简单方法

new*_*bie 18 c

是否有更简单,更好的方法来解决这个问题,因为

  1. 我使用了太多变量.
  2. 我用过这么多的if else陈述
  3. 我是用蛮力方法做到的

编写一个接收三个整数作为输入的程序,并按递增顺序输出数字.
不要使用循环/数组.

#include <stdio.h>
main(){
   int no1;
   int no2;
   int no3;
   int sto;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &no1);
   printf("Enter No. 2: ");
   scanf("%d", &no2);         
   printf("Enter No. 3: ");
   scanf("%d", &no3);

   if (no1>no2) {   
      sto=no1;    
      lo=no2;   
   } else {
      sto=no2;  
      lo=no1;  
   } 
   if (sto>no3) { 
      hi=sto;    
      if(lo>no3){         
         sto=lo;                
         lo=no3;
      }else {
         sto=no3;      
      }         
   }else hi=no3; 

   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", sto);
   printf("HIGHEST %d\n", hi);  

   getch(); 
}    
Run Code Online (Sandbox Code Playgroud)

Pet*_*hev 22

if (a > c)
   swap(a, c)

if (a > b)
   swap(a, b)

//Now the smallest element is the first one. Just check the 2-nd and 3-rd

if (b > c)
   swap(b, c);
Run Code Online (Sandbox Code Playgroud)

注意:交换更改两个变量的值.

  • 如果你将一半代码隐藏在`swap()`函数后面并假装它只有3行代码; 为什么不隐藏`sort3()`函数中的所有内容并假装它只有一行?如果你显示`swap()`函数,至少那么OP有机会实现原始代码(没有`swap()`)是优越的(对于性能). (15认同)
  • 更不用说这甚至不起作用。变量 a、b 和 c 是按值传递的......(除非 swap 是一个宏,在这种情况下,哦,男孩) (3认同)

NPE*_*NPE 13

调用三个变量x,yz,则:

if (x > y) swap(x, y);
if (y > z) swap(y, z)
if (x > y) swap(x, y);
Run Code Online (Sandbox Code Playgroud)

编写该swap函数留给读者练习.提示:您可能必须使用指针.


Vov*_*ium 9

#include <stdio.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int main(){
   int a, b, c;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &a);
   printf("Enter No. 2: ");
   scanf("%d", &b);         
   printf("Enter No. 3: ");
   scanf("%d", &c);

   lo = min(min(a, b), c);
   hi = max(max(a, b), c);
   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", a+b+c-lo-hi);
   printf("HIGHEST %d\n", hi);  

   getchar(); 
}    
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用宏而不是常规函数? (2认同)

glo*_*pes 7

如果您想将值排序到新的外部变量中,您实际上可以在没有临时变量的情况下进行交换:

void sort(int a, int b, int c, int *min, int *mid, int *max) {
    min = a;
    mid = b;
    max = c;
    if (min > mid) { mid = a; min = b; }
    if (mid > max)
    {
        max = mid;
        mid = c;
        if (min > mid)
        {
            mid = min;
            min = c;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为只有第二个测试成功时才需要最后一个交换测试(否则它只是第一个测试的重复,根据定义,它会失败,因为我们已经对这些变量进行了排序)。

因此,我们可以跟踪每个原始变量的分配并避免交换局部变量。


gdj*_*gdj 5

提示:如果你有3个数字,a,b和c,min(a,min(b,c))是最小的,max(a,max(b,c))是最大的,并给出最小的和最大的数字,应该很容易找到第三个.