Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: Bazooka en Junio 13, 2014, 11:42:18 pm

Título: SOLUCIONADO- Ayuda para mejorar una funcion
Publicado 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.


Código: [Seleccionar]
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
Título: Re:Ayuda para mejorar una funcion
Publicado por: YAcosta en Junio 14, 2014, 01:12:25 am
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:

Código: (VB) [Seleccionar]
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:

Código: (VB) [Seleccionar]
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,
Título: Re:Ayuda para mejorar una funcion
Publicado por: raul338 en Junio 15, 2014, 12:51:53 pm
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

Código: (vb) [Seleccionar]
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
Título: Re:Ayuda para mejorar una funcion
Publicado por: Bazooka en Junio 15, 2014, 01:08:38 pm
MUCHAS GRACIAS AMIGOS!!!