Foros del Web » Programación para mayores de 30 ;) » Java »

simplificar este código

Estas en el tema de simplificar este código en el foro de Java en Foros del Web. Hola gente! escribi este código y quisiera saber como simplificarlo muchas gracias!! float costo, desc0, desc1, desc2, desc3, desc4, desc5, desc6, desc7, desc8, desc9, costoDesc; ...
  #1 (permalink)  
Antiguo 25/09/2014, 22:45
 
Fecha de Ingreso: febrero-2014
Mensajes: 16
Antigüedad: 10 años, 8 meses
Puntos: 0
simplificar este código

Hola gente! escribi este código y quisiera saber como simplificarlo muchas gracias!!

float costo, desc0, desc1, desc2, desc3, desc4, desc5, desc6, desc7, desc8, desc9, costoDesc;

public float getCostoDesc() {
float[] desctos = {(100-desc0), (100-desc1), (100- desc2), (100- desc3), (100- desc4),
(100- desc5), (100- desc6), (100- desc7), (100- desc8), (100- desc9)};

if(desctos[9]!=0){
costoDesc = esctos[9]*desctos[8]*desctos[7]*desctos[6]*desctos[5]*desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[8]!=0){
costoDesc = desctos[8]*desctos[7]*desctos[6]*desctos[5]*desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[7]!=0){
costoDesc = desctos[7]*desctos[6]*desctos[5]*desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[6]!=0){
costoDesc = desctos[6]*desctos[5]*desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[5]!=0){
costoDesc = desctos[5]*desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[4]!=0){
costoDesc = desctos[4]*desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[3]!=0){
costoDesc = desctos[3]*desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[2]!=0){
costoDesc = desctos[2]*desctos[1]*desctos[0]*costo;

}else if (desctos[1]!=0){
costoDesc = desctos[1]*desctos[0]*costo;

}else if (desctos[0]!=0){
costoDesc = desctos[0]*costo;

}else costoDesc = costo;
return costoDesc;
}
  #2 (permalink)  
Antiguo 26/09/2014, 00:36
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: simplificar este código

Código Java:
Ver original
  1. int numDescs = desctos.length;
  2.  
  3. if (numDescs == 0) {
  4.     costoDesc = costo;
  5. else {
  6.     for (int i = numDescs; i>=0; i--) {
  7.         costoDesc *= desctos[i-1];
  8.     }
  9.     costoDesc *= costo;
  10. }


Un saludo
  #3 (permalink)  
Antiguo 26/09/2014, 23:09
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: simplificar este código

Hola,

Cita:
Iniciado por AGmzT Ver Mensaje
Hola gente! escribi este código y quisiera saber como simplificarlo muchas gracias!! ...
Posiblemente podrías obtener exactamente el mismo resultado pero con un código mas simplificado de esta forma:

Código Java:
Ver original
  1. int i = desctos.length - 1;
  2. while (i >= 0 && desctos[i] == 0.0f) {
  3.   i--;
  4. }
  5. costoDesc = costo;
  6. while (i >= 0) {
  7.   costoDesc *= desctos[i--];
  8. }
  9. return costoDesc;

La pregunta ahora sería ... ¿estás seguro que eso es lo que quieres obtener?

Evidentemente hay problemas que se notan a simple vista, como el hecho que si dos valores dentro del vector 'desctos' son iguales a 0 entonces el resultado siempre va a ser 0.

Adicionalmente que si los valores son, por ejemplo, 50 tendrías (50^10), 50 elevado a la potencia 10 es un número muy grande. Evidentemente no son porcentajes.

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Código:
int numDescs = desctos.length;

if (numDescs == 0) {
    costoDesc = costo;
else {
    for (int i = numDescs; i>=0; i--) {
        costoDesc *= desctos[i-1];
    }
    costoDesc *= costo;
}
Hay un error de lógica con un ArrayOutOfBounds Exception. Si cualquier valor es 0 el resultado siempre va a ser 0, en su caso solo multiplica los valores iniciando desde el primero que sea diferente a 0 descendentemente; eso para realizar exactamente la misma funcionalidad del código inicial, que estoy casi seguro que no realiza la funcionalidad que le solicitaron.

Igual el problema ha de ser otro,
Saludos,
  #4 (permalink)  
Antiguo 27/09/2014, 00:46
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: simplificar este código

Buenas HackmanC,

Muchas gracias por el apunte. Efectivamente en lugar de i>=0 debí dejar i>0. Lo escribí directamente en el post con prisas y es lo que pasa...

También lo puse basándome en un for, que considero una estructura básica e intuitiva para alguien que no conoce los bucles, pero tu aproximación con while y partiendo de la variable costo me parece más elegante.

Eso si, me parece que tienes un bug cuando compruebas los ceros. Lo único que haces es dejar los últimos índices del array sin leer y no aquellos que contienen el cero.
Por ejemplo, si el array tiene 5 elementos y dectos[0] vale 0, lo único que vas a hacer es descartar dectos[4].

Es sencillo eliminar ese bucle inicial sustituyéndolo por una condición y así de paso mejoramos un poco el rendimiento del algoritmo de 2N a N.

Código Java:
Ver original
  1. int i = desctos.length - 1;
  2.  
  3. costoDesc = costo;
  4. while (i >= 0) {
  5.   if (desctos[i] != 0.0f) {
  6.     costoDesc *= desctos[i--];
  7.   }
  8. }
  9.  
  10. return costoDesc;


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 27/09/2014, 14:12
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: simplificar este código

Hola,

Cita:
Iniciado por Profesor_Falken Ver Mensaje
... Eso si, me parece que tienes un bug cuando compruebas los ceros. Lo único que haces es dejar los últimos índices del array sin leer y no aquellos que contienen el cero.
Por ejemplo, si el array tiene 5 elementos y dectos[0] vale 0, lo único que vas a hacer es descartar dectos[4]. ...
Tienes toda la razón, es decir, si el Arreglo tiene 5 elementos busca descendentemente el primero que sea diferente a 0, de allí en adelante usa los restantes para la multiplicación; sin importar que exista otro número 0, en consecuencia generando un resultado de 0 por la operación de que cualquier número multiplicado por 0 dá 0.

Pero no lo considero un bug, es decir, para lograr exactamente la misma funcionalidad del código que 'AGmzT' escribió, así tiene que ser. Es decir, si el código original no realiza la funcionalidad esperada exactamente no es inconveniente de mi propuesta.

Lo que hice fue reproducir exactamente la misma funcionalidad original con menos líneas de código utilizando bucles 'while'. No me malinterpretes en muchos casos me equivoco, lo único que quiero en este caso es demostrar el punto de reproducir la misma funcionalidad original. Aunque originalmente posiblemente no sea correcta.

Saludos,
  #6 (permalink)  
Antiguo 27/09/2014, 15:22
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: simplificar este código

Cita:
Pero no lo considero un bug, es decir, para lograr exactamente la misma funcionalidad del código que 'AGmzT' escribió, así tiene que ser. Es decir, si el código original no realiza la funcionalidad esperada exactamente no es inconveniente de mi propuesta
Tienes toda la razón. Si es un bug, lo es en el código original.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 27/09/2014, 15:52
 
Fecha de Ingreso: febrero-2014
Mensajes: 16
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: simplificar este código

Hola,

Gracias a todos por su ayuda,

Les comento que las variables desc.. no siempre van a ser instanciadas por el usuario, y dado que los

miembros del arreglo son el resto de 100- desc.. siempre van a tener valor mayor a 0, de hecho en

el constructor (si no son instanciadas por el usuario) toman un valor fijo que no afecta el producto.
  #8 (permalink)  
Antiguo 27/09/2014, 20:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: simplificar este código

Hola,

Posiblemente,

Cita:
Iniciado por AGmzT Ver Mensaje
Hola gente! escribi este código y quisiera saber como simplificarlo muchas gracias!! ...
Código Java:
Ver original
  1. float costo, desc0, desc1, desc2, desc3, desc4, desc5, desc6, desc7, desc8, desc9, costoDesc;
  2.  
  3. public float getCostoDesc() {
  4.   float[] desctos = {(100-desc0), (100-desc1), (100- desc2), (100- desc3), (100-desc4),
  5.                     (100- desc5), (100- desc6), (100- desc7), (100- desc8), (100- desc9)};
  6.   int i = desctos.length - 1;
  7.   while (i >= 0 && desctos[i] == 0.0f) {
  8.     i--;
  9.   }
  10.   costoDesc = costo;
  11.   while (i >= 0) {
  12.     costoDesc *= desctos[i--];
  13.   }
  14.   return costoDesc;
  15. }

Técnicamente hace exactamente lo mismo que el código inicial pero de una forma diferente. No puedo decir simplificado realmente, sino mas corto. Mas simple que el código inicial creo que no es posible.

Cita:
Iniciado por AGmzT Ver Mensaje
... Les comento que las variables desc.. no siempre van a ser instanciadas por el usuario, y dado que los

miembros del arreglo son el resto de 100- desc.. siempre van a tener valor mayor a 0, de hecho en

el constructor (si no son instanciadas por el usuario) toman un valor fijo que no afecta el producto.
Técnicamente que sean 100-desc no implica que siempre van a tener un valor mayor a 0, 100 - 100 es igual a 0. Pero bueno, si ese es el objetivo real de tu aplicación entonces todo está bien.

Simplemente a mi me pareció extraña la operación y pensé que posiblemente querías porcentajes (por el 100) y no es el caso. También si la lógica de tu aplicación se encarga de inicializar los valores correctamente pues todo sigue bien.

Saludos,

Etiquetas: simplificar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:57.