Manera más simple de clasificar tres números.

¿Hay una manera más simple y mejor de resolver este problema porque

  1. Utilicé demasiadas variables.
  2. Utilicé tantas declaraciones, if else
  3. Hice esto usando el método de fuerza bruta

Escriba un progtwig que reciba tres enteros como entrada y dé salida a los números en orden creciente.
No use loop / array.

 #include  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(); } 

 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); 

Nota: Swap cambia los valores de dos variables.

Llama a las tres variables x , y , y z , luego:

 if (x > y) swap(x, y); if (y > z) swap(y, z) if (x > y) swap(x, y); 

Escribir la función de swap se deja como un ejercicio para el lector. Sugerencia: puede que tenga que usar punteros.

 #include  #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(); } 

Sugerencia: si tiene 3 números, a, b y c, min (a, min (b, c)) es el más pequeño, max (a, max (b, c)) es el más grande, y dado el más pequeño y Los números más grandes, debería ser fácil encontrar el tercero.

Sí, hay una forma mucho mejor, pero necesitas usar loops y arreglos.

Probablemente, para una clase introductoria, su respuesta es la respuesta que están buscando.

Hay formas de hacer bucles con for / while (recursión, goto, etc.). Y formas de obtener algo como una matriz sin indexación ( int *ptr = malloc (3 * sizeof(int)) , y luego indexar con *(ptr+index) ). Pero me resulta difícil pensar que eso es lo que quieren.

Para encontrar los valores mínimo , medio y máximo de 3, puede utilizar el operador ternario . Puede hacer todo su trabajo dentro del cuerpo principal de su código, o puede separar los minof3 , midof3 y maxof3 en funciones reutilizables.

En el caso de mín y máx , simplemente realice 2 de 3 comparaciones posibles y luego devuelva una comparación de los resultados. En el caso de mid , haces lo mismo, pero calculas el mínimo y el máximo de los 3 valores, y luego verificas los 3 contra el mínimo y el máximo para encontrar el valor que no sea ni el mínimo ni el máximo . (Puede hacer esta parte en el cuerpo principal de su código sin una función adicional declarando los valores mínimo y máximo como variables y haciendo la eliminación allí).

Al juntar las piezas, podría hacer algo similar a lo siguiente, que toma los primeros 3 argumentos como valores para ordenar (o usa valores predeterminados de 99, 231, 8 si no se especifica un valor necesario)

 #include  #include  /** direct ternary comparison of 3 values */ long minof3 (long a, long b, long c) { long x = a < b ? a : b, y = a < c ? a : c; return x < y ? x : y; } long maxof3 (long a, long b, long c) { long x = a > b ? a : b, y = a > c ? a : c; return x > y ? x : y; } long midof3 (long a, long b, long c) { long x = minof3 (a, b, c), z = maxof3 (a, b, c), y = a == x ? b : a; return y == z ? c : y; } int main (int argc, char **argv) { long x = argc > 1 ? strtol (argv[1], NULL, 10) : 99, y = argc > 2 ? strtol (argv[2], NULL, 10) : 231, z = argc > 3 ? strtol (argv[3], NULL, 10) : 8; printf ("\n sorted values : %ld, %ld, %ld\n", minof3 (x, y, z), midof3 (x, y, z), maxof3 (x, y, z)); return 0; } 

Ejemplo de uso / salida

 $ ./bin/sort3 sorted values : 8, 99, 231 $ ./bin/sort3 -23 -281 1031 sorted values : -281, -23, 1031 

(Sí, sé que esta es una publicación antigua, pero dado el reciente comentario sobre el código oculto detrás de la función de swap , un ejemplo completo estaba en orden).

Si desea ordenar los valores en nuevas variables externas, puede hacer los swaps sin temporarios:

 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; } } } 

Esto funciona porque la última prueba de intercambio solo es realmente necesaria si la segunda prueba tiene éxito (de lo contrario, será simplemente una repetición de la primera prueba, que fallará por definición ya que ya ordenamos esas variables).

Debido a esto, podemos rastrear las asignaciones de cada una de las variables originales y evitar intercambiar locales.

Estaba intentando resolver el mismo problema hoy. Podría hacer esta versión compacta de código sin usar ninguna variable temporal; bucles La biblioteca funciona como swap, sort, max, min, etc. El código usa solo las sentencias if y hace mutaciones continuas en la jerarquía hasta que se comprueban todas las posibilidades.

 int main() { int a, b, c; //User inputs stored in these three variables int first, second, third; //These three variables will store the sorted numbers in sequence std::cout<<"Please enter three integers : "; //User input prompt std::cin>>a>>b>>c; first = a; //Initially assuming number 'a' is smallest if (b <= a && b <= c) first = b; //Checking whether b is smallest if (c <= a && c <= b) first = c; //Checking whether c is smallest if (((a >= b && a <= c) || (a >= c && a <= b))) second = a; //Checking if a is middle number if (((b >= a && b <= c) || (b >= c && b <= a))) second = b; //Checking if b is middle number if (((c >= a && c <= b) || (c >= b && b <= a))) second = c; //Checking if c is middle number if (a >= b && a >= c) third = a; //Checking if a is the greatest if (b >= c && b >= a) third = b; //Checking if b is the greatest if (c >= a && c >= b) third = c; //Checking if c is the greatest std::cout<<"The numbers in ascending order are : "< 

Si buscamos el número mínimo de comparaciones como la solución más eficiente para ordenar 3 elementos, siga la implementación a continuación.

 public static void Sort3Elements(int a, int b, int c) { if (a <= b && a <= c) //a is lowest here { if (b<=c) //a <= b <= c Console.WriteLine("{0}-{1}-{2}", a, b, c); else //a <= c <= b Console.WriteLine("{0}-{1}-{2}", a, c, b); } else if (b<=a && b<=c) //b is lowest here { if (a <= c) //b <= a <= c Console.WriteLine("{0}-{1}-{2}", b, a, c); else //b <= c <= a Console.WriteLine("{0}-{1}-{2}", b, c, a); } else //c is lowest { if (a <= b) //c <= a <= b Console.WriteLine("{0}-{1}-{2}", c, a, b); else //c <= b <= a Console.WriteLine("{0}-{1}-{2}", c, b, a); } }