Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Bazooka en Junio 13, 2014, 11:42:18 pm
-
Hola amigos tengo esta función que me funciona correctamente y lo que hace es recibir un valor entero y verificar si el mismo es multiplo de 12,10,8,6,5 y 4 y si lo es devuelve el mismo valor y sino devuleve cero. Pero creo que no está demasiada optimizada.
El aporte que necesito concretamente es primero si se puede simplificar y que en el caso que el valor pasado no sea multiplo me sugiera y devuelva el valor proximos mas cercano al parametro pasado.
Private Function Multiplo(num As Integer) As Integer
Dim resto As Byte
resto = num Mod 12
If resto = 0 Then
resto = num Mod 12
If resto = 0 Then
resto = num Mod 8
If resto = 0 Then
resto = num Mod 6
If resto = 0 Then
resto = num Mod 5
If resto = 0 Then
resto = num Mod 4
If resto = 0 Then
Multiplo = num
End If
End If
End If
End If
End If
End If
End Function
La llamo asi!
Text2 = Multiplo(120) 'es correcto me devuelve 120
Text2 = Multiplo(80)' devuelve 0 por que no es multiplo de todos
Gracias por sus aportes
-
La primera evaluacion esta repetida, me refiero a que hay un resto = num Mod 12 demas.
Luego, como esta planteado tienen que cumplirse todas las condicones para que la variable Multiplo tenga un valor. Por tanto creo que la cadena de if se puede reempazar por cadenas de And, asi:
If (num Mod 12) = 0 And (num Mod 8) = 0 And (num Mod 6) = 0 And (num Mod 5) = 0 And (num Mod 4) = 0 Then
Multiplo = num
End If
Saludos
Sin embargo, si esos son los numeros con los que vas a evaluar diria casi con seguridad que la condición solo es verdadera para 120, 240, 360, 480, etc. Por tanto queda recudida a esto:
If Right(num / 12, 1) = 0 And (num Mod 12) = 0 Then
Multiplo = num
End If
Ah, lo olvidaba, para el valor mas cercano se me ocurre que habría que hacerlo recursivo,
-
Si un numero es múltiplo de 12, es también múltiplo de 4, porque 12=4*3
156 = 12 * 13 = 4 * 3 * 13
Lo mismo con 8... y de 5 con 10
Por lo que solo deberías comparar si es múltiplo de 4, 5 y 6 :)
También podrías simplificarlo en funciones más simples
Private Function EsMultiplo(Numero As Integer, Base As Integer) As Boolean
EsMultiplo = (Numero Mod Base = 0)
End Function
Private Function Multiplo(num As Integer) As Integer
If EsMultiplo(num, 4) And EsMultiplo(num, 5) And EsMultiplo(num, 6) Then
Multiplo = num
Else
Multiplo = 0
End if
End Function
Espero que funcione porque lo codifique al aire :P
-
MUCHAS GRACIAS AMIGOS!!!