CyM98 << Probador de Funciones DCM >>
Dificultad: Computación Computación

Se necesitan algunos conocimientos de programación. Los pueden repasar de la lección Midiendo Tiempos. Los temas matemáticos los pueden repasar de la lección Divisor común mayor.

Lecciones relacionadas:

Midiendo Tiempos Comp.
Como medir el tiempo que tarda un programa.

Divisor común mayor Comp. Mate.
Una función que calcula el DCM probando a lo bruto.

   
Google
Web www.oma.org.ar

Resumen:

En varias lecciones escribimos funciones que calculaban el Diviso Común Mayor entre dos números. Todas se llamaban DCMAlgo por ejemplo DCMTodos, DCMFactoriza, ... y se podían intercambiar. Queremos ver la diferencia entre las velocidades de cada una de estas funciones. Para eso, podemos usar este programa que genera muchos pares de números y les calcula el DCM con la función elegida.

Midiendo los tiempos:

Vimos varios métodos para calcular el DCM. A cada método lo escribimos dentro de una función con nombre diferente. Podes buscarlas en las lecciones que figuran al final. Por supuesto, también podes usarla con los métodos que programes. Demostrar cuales son los mejores métodos es complicado y nos vamos a limitar a determinar "experimentalmente" cuales andan más rápido.

Todas las funciones que definimos tienen la misma forma. Tienen dos parámetros que son números enteros y después devuelven como resultado un número entero. Por eso es posible intercambiarlas una con otras sin problemas.

En el ejemplo aparecen tres funciones:

  • La primera es DCMError: sólo genera un mensaje de error al tratar de dividir uno por cero, está solamente para que te acuerdes de cambiarla.
  • La segunda es DCMUno: como se ve no hace nada, o más precisamente siempre responde 1, que es casi lo mismo. Esta función es útil para tener una idea de cuánto tiempo gasta la maquina en el resto del programa (generar números al azar, llamar a las funciones, etc. ) y cuánto tiempo utiliza en realizar las cuentas que a uno le interesan.
    En esta función no hacemos ninguna cuenta interesante, así que todo lo que tarda corresponde a las otras actividades.
  • La tercera es DCMLenta: Es una de las formas más lentas de calcular el DCM, probando con todos los números y encima haciendo las cuentas con números reales.

Quizás lo más conveniente sea primero cambiar en la parte principal del programa DCMError por DCMLenta y probarlo un rato. Después copiar una función DCMALgo de otra de las lecciones que figuran abajo y probar un rato más.

Conviene ejecutarlo y esperar un poco. Si tarda demasiado, cortamos el programa y cambiamos la constante repeticiones por un número más chico. Si es instantaneo o tarda demasiado poco, cambiamos la constante repeticiones por un número más grande. Hay que repetir estos cambios hasta que tarde un tiempo razonable, digamos 10 segundos.

(En la lección Midiendo Tiempos se explica como utilizar las funciones apropiadas para medir el tiempo en los otros lenguajes.)

Deflng A-Z 'Todas las variables son enteros largos
Const maximo = 1000000'numero maximo que el programa elege al azar
Const repeticiones = 1000000'numero de repeticiones
'Modificar hasta que el programa tarde algunos segundos o minutos

Dim inicio as Single
Dim finaliza as Single
inicio=Timer
Randomize Timer
For i=1 To repeticiones 'repite muchas veces
    a=Int(rnd*maximo)+1
    b=Int(rnd*maximo)+1
    c=DCMError(a,b)'Cambiar!!!!!
    'Print "El DCM entre";a;" y";b;" es";c
    'La comentamos porque en general escribir en pantalla es muy lento
Next i'Repite hasta este punto
finaliza=Timer
Print "Tiempo total=";finaliza-inicio
Print "Promedio=";(finaliza-inicio)/repeticiones


Deflng A-Z 'Todas las variables son enteros largos
Function DCMError(a,b) 'Esta funcion genera siempre un error!!
    Print "NO ANDA!!!!!!!!!!!!!!!"
    DCMError=1/0'Genera un error
    'En general hay formas mas civilizadas, consultar la ayuda
    'Cambiar en la parte principal DCMError por otra
    'por ejemplo por DCMLenta
End Function


Deflng A-Z 'Todas las variables son enteros largos
Function DCMUno(a,b) 'Esta funcion no anda bien!!
    DCMUnoRaiz=1' no calculo nada, solo respondo "1"
End Function


Deflng A-Z 'Todas las variables son enteros largos
Function DCMLenta(a,b) 'Esta funcion no anda bien!!
    For d = 1 to a+b
        If a/d=int(a/d) and b/d=int(b/d) then
            MaximoDivisorHastaAhora = d
        End If
    Next d
    DCMLenta = MaximoDivisorHastaAhora
End Function

Después de probarlo un rato, pueden buscar las funciones DCM de las otras lecciones, copiarlas y ejecutarlas.

  • Una posibilidad es dejar fijo el número de repeticiones y el maximo, y ver cuanto tarda cada función. Con esto vemos cuáles andan más rápido y cuáles más despacio.
  • Se puede agarra un máximo más chico y volver a modificar el valor de repeticiones hasta que tarde un tiempo razonable. Ahi podemos comparar de vuelta todas las funciones. (En general, para valores chicos la diferencia entre las funciones "rapidas" y las "lentas" no es tan grande.)

Sería interesante que nos mandaran los resultados que obtengan a cym98@oma.org.ar indicando: Nombre, Edad, Lenguaje, Maquina, el programa (sin compilar), los resultados y algún comentario. Por ejemplo es interesante analizar que pasa al variar la constante maximo o si uno utiliza otro tipo de números (enteros cortos, reales, etc.)


Lecciones relacionadas:

Midiendo Tiempos Comp.
Como medir el tiempo que tarda un programa.

Divisor común mayor Comp. Mate.
Una función que calcula el DCM probando a lo bruto.

Divisor común mayor factorizando Comp. Mate. Mate.
Otra función que calcula el DCM factorizando los números.

Algoritmo de Euclides Comp. Comp. Mate. Mate.
Otra función más astuta que calcula el DCM utilizando el Algoritmo de Euclides.

Usando las funciones DCM Comp.
Permite usar las distintas funciones DCM, preguntando los números a utilizar a traves de la pantalla.

 


Comentarios, preguntas, sugerencias:

Nombre y apellido (opcional):

E-mail (opcional):

    


OmaNet   Curso CyM98 OmaNet - Educación Interactiva
   
www.oma.org.ar/omanet | omanet@oma.org.ar
mensajes: webmaster@oma.org.ar
duty free alcohol usa duty free cigarette brands buy cigars online where to buy cosmetics online buy duty free fragrances duty free tobacco buy