Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 85 en 21 Febrero 2013, 01:46 am



Título: Calcular el máximo usando operador '?'
Publicado por: 85 en 21 Febrero 2013, 01:46 am
Hola, estaba mirando casualmente dos temas, uno que se refiere al operador ternario y otro sobre como obtener el mayor de 3 números..

y en el tema del operador ternario se hablaba acerca de la utilidad de este operador, en este caso compruebo que resulta conveniente usarlo..
por eso vean la función 2 parece la más conveniente aunque en realidad a mi forma de verlo las 3 terminan realizando comparaciones, que a nivel de ensamblador resultan simples restas..
si alguno sabe como el procesador procesa la información o al menos sabe como se realizan las comparaciones, sabrá a que me refiero.

Código:
int max_valor_de_tres_1(int a,int b,int c){

if(a>b)
if(a>c)
return a;
if(b>a)
if(b>c)
return b;
if(c>a)
if(c>b)
return c;
return 0;
}

Código:
int max_valor_de_tres_2(int a,int b,int c){

return a>b? (a>c?a:(b>c?b:c)) : (b>c?b:c);
}

Código:
int max_valor_de_tres_3(int a,int b,int c){

if((a-b>0)&&(a-c>0)){return a;}
if((b-a>0)&&(b-c>0)){return b;}
if((c-a>0)&&(c-b>0)){return c;}
return 0;
}




Código:
int main(){
int a,b,c;
a = 3;
b=4;
c=5;
int res = max_valor_de_tres_3(a,b,c);
printf("%d",res);
printf("\n");
system("pause");

return 0;
}

Estos eran los temas
http://foro.elhacker.net/programacion_cc/aporte_operador_condicional-t383420.0.html

http://foro.elhacker.net/programacion_cc/help_calcular_maximo_de_3_numeros_usando_funcion-t383403.0.html



Título: Re: Calcular el máximo usando operador '?'
Publicado por: ThePinkPanther en 21 Febrero 2013, 03:37 am
muy bueno.


Título: Re: Calcular el máximo usando operador '?'
Publicado por: CloudswX en 21 Febrero 2013, 03:53 am
Y si los valores de dos de esas 3 variables es igual?



Título: Re: Calcular el máximo usando operador '?'
Publicado por: engel lex en 21 Febrero 2013, 04:15 am
Y si los valores de dos de esas 3 variables es igual?

Código:
return 0;

retorna 0

aunque debería retornar algo como "false" o NaN porque si el mayor es 0 entonces tendrías un error en el algoritmo


Título: Re: Calcular el máximo usando operador '?'
Publicado por: 85 en 22 Febrero 2013, 03:39 am
claro, por eso yo decía que la mejor es la función 2, las otras estaban incompletas...

igualmente se puede ahcer eso que dice engelx, es decir , luego de llamar a la función , se evalúa el resultado (por ejemplo 'false') y en base a eso se determina que se va a usar uno de los números, etc también la función puede retornar uno de los números si los 3 son iguales, igualmente me quedo con la opción B para este problema   ;D




Título: Re: Calcular el máximo usando operador '?'
Publicado por: rir3760 en 22 Febrero 2013, 16:32 pm
Hola, estaba mirando casualmente dos temas, uno que se refiere al operador ternario y otro sobre como obtener el mayor de 3 números..
Algunas observaciones.

Cuando se busca el máximo de tres números si no es uno de los dos primeros debe ser el ultimo. La primera función se puede reducir a:
Código
  1. int max_valor_de_tres_1(int a,int b,int c)
  2. {
  3.   if (a > b && a > c)
  4.      return a;
  5.   if (b > a && b > c)
  6.      return b;
  7.  
  8.   return c;
  9. }

En la segunda función primero se comparan las variables a y b, el menor de estos debe ignorarse en las siguientes comparaciones ya que no es posible que sea el máximo. Se reduce a:
Código
  1. int max_valor_de_tres_2(int a,int b,int c)
  2. {
  3.   return a > b ? (a > c ? a : c) : (b > c ? b : c);
  4. }

En la tercera función se debe evitar el uso de expresiones como "a - b" porque en el lenguaje C si el resultado de la resta sale del rango valido del tipo int se genera comportamiento no definido, esto es, no hay garantías sobre el comportamiento del programa. Mejor utilizar las comparaciones "a > b", "a > c", etc. ya que son directas y su resultado esta garantizado (1 o 0, dependiendo del resultado de la comparación).

Por ultimo otra opción es combinar el uso de una sentencia condicional y el operador ternario:
Código
  1. int max_tres(int a, int b, int c)
  2. {
  3.   if (a < c)
  4.      a = c;
  5.  
  6.   return a > b ? a : b;
  7. }

Un saludo