| M.Sc. Walter Mora F., M.Sc. José Luis Espinoza B. |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

 

Inclusión de procedimientos de borrado

 

En ocasiones es necesario borrar alguna información que ha sido escrita en una hoja electrónica, por lo que es importante conocer una forma de incorporar en la aplicación un procedimiento de borrado.



Ejemplo 9  

Presentamos a continuación un programa que, a partir de un número $N$ construye el triángulo de Pascal de N niveles. También se incluye un programa que funciona como borrador o destructor del triángulo.

En cada nivel del triángulo hay un uno en los extremos y, a partir del tercer nivel, cada número, salvo los extremos, es la suma de los dos de arriba. Concretamente, el triángulo de Pascal es un arreglo triangular de números de la forma:


Figura 30. Triángulo de Pascal.

Por simplicidad, presentamos un programa que lee el número de niveles del triángulo de Pascal en la celda E1 y lo despliega de la forma:

 1
 1 1
 1 2 1
 1 3 3 1
 1 4 6 4 1
 1 5 10 10 5 1
 ...

El procedimiento para borrar el triángulo también lee el número de niveles del triángulo de la celda E1.

Tanto la construcción del triángulo como su destrucción pueden ser activados mediante botones. Las instrucciones que realizan estos procedimientos también pueden ser incluidas directamente en el código de los botones, tal y como se detalla a continuación.

El código para la construcción del triángulo quedaría así:

 


Private Sub EjecucionDePascal_Click()
   ' Lectura de la cantidad de niveles:
     N = Cells(1,5)
   ' Llenar unos:
     For i = 1 To N
         Cells(i,1)= 1
         Cells(i,i)= 1
     Next i
   ' Llenar el resto:
     If N > 2 Then
         For i=3 To N
              For j=2 To i-1
                  Cells(i,j)= Cells(i-1,j) + Cells(i-1,j-1)
              Next j
         Next i
     End If
End Sub



El procedimiento para borrar el triángulo también lee el número de niveles y hace el mismo recorrido de celdas que hizo el constructor y en cada celda escribe un valor nulo.

 


Private Sub Borrador_Click()
     N = Cells(1, 5).Value
     For i = 1 To N
         For j = 1 To i
              Cells(i, j).Value = Null
         Next j
     Next i
End Sub




Figura 31. Triángulo de Pascal construido con 10 niveles.



Ejercicios 2  

  1. Triángulo de Pascal. Haga un programa que, al activarlo desde un botón de comando, lea un un número $N$ de la celda A1 y construya el triángulo de Pascal en la forma:

                1
              1 1
           1  2 1
        1  3  3 1
      1 4  6  4 1
    1 5 10 10 5 1 ...
    

    Además, incluya un botón que active un destructor especializado para este triángulo.


  2. Aritmética entera. En VBA hay dos tipos de división: a/b es la división corriente (en punto flotante) y a\b que es la división entera. Por ejemplo, 3/2 = 1.5 mientras que 3\2 = 1.

    Hay muchos algoritmos en los que se usa exclusivamente divisón entera. Veamos un ejemplo.

    Si $\,N\,$ es un entero positivo, vamos a calcular el entero más grande que es menor o igual a $\,\sqrt{N}\,$, es decir $\,\lfloor \sqrt{N} \rfloor\,$ (` $\,\lfloor \; \rfloor\,$' es la parte entera). El algoritmo, que opera en aritmética entera, es el siguiente

    a.)
    Inicio: $\,s_0= \frac{N}{2}\,$

    b.)
    $\,s_{i+1}= \displaystyle{\frac{s_i\,+\, \displaystyle{\frac{N}{s_i}}}{2}}, \; \; \; i =0,1,2,...\,$

    c.)
    iterar hasta que $\,s_{i+1} \geq s_i\,$

    d.)
    el último $\,s_i\,$ es $\,\lfloor \sqrt{N} \rfloor\,$

    Por ejemplo si $\,N=10\,$, $\, \sqrt{N} \approx 3,16227766\,$ y el último $\,s_i\,$ sería $\,3\,$

    Implemente el algoritmo.


  3. Cálculo de la raíz cuadrada. Para calcular $\,\sqrt{x}\,$ con $\,x \in \mathbb{R}^+\,$, se pueden usar varios algoritmos dependiendo de la precisión y rapidez que se busca. La calculadoras usualmente tienen implementadas muy buenas subrutinas para calcular exponenciales y logaritmos por lo que para calcular $\,\sqrt{x}\,$ usan la identidad $\,\sqrt{x}= e^{^{\frac{1}{2}\displaystyle{\ln(x)}}}\,$

    En nuestro caso, por simplicidad, vamos a usar un método iterativo: el método de Newton. Bajo ciertas hipótesis, si $\,x_0\,$ es una buena aproximación a una solución $\,r\,$ de la ecuación $\,P(x)=0\,$ entonces el esquema iterativo

    \begin{displaymath}x_{i+1}= x_i - \displaystyle{\frac{P(x_i)}{P^\prime(x_i)}}\end{displaymath}



    converge a $\,r\,$ con error $\,\leq \,\vert x_i \,-\,x_{i+1}\vert\,$.

    Para hallar $\,\sqrt{U}\,$ con $\, U > 0\,$, vamos a resolver la ecuación $\,\displaystyle{\frac{1}{x^2}}-\displaystyle{\frac{1}{U}}=0\,$ con el método de Newton. Esto nos dará una aproximación a $\,\sqrt{U}\,$.

    Nota: Como $\,U\,$ es una constante, el esquema iterativo se podría simplificar un poco más en el código

    Nota: También se pudo haber usado la ecuación $\,x^2-U=0\,$ pero el proceso de aproximación es un poco más lento.

    Nota: Para una aproximación inicial $\,U_0\,$ se podría usar $\,\lfloor \sqrt{U} \rfloor\,$ usando la solución del problema anterior. En la práctica se usa una aproximación inicial basada en la representación binaria del número.


  4. Números primos. Obtenga un programa para hallar el número primo más cercano a un número $N$, siendo N un número entero positivo mayor que uno.3

    Por ejemplo, los números primos menores que 50 son:

    2, 3, 5, 7, 19, 23, 29, 31, 37, 41, 43.
    Si $\,N=50\,$, el programa debería retornar el número 43.

    Un procedimiento clásico para hallar todos los números primos menores que un entero positivo $N$, es la llamada criba de Eratóstenes. Lo que se hace es colocar en una lista todos los números del $2$ al $N$ e ir eliminando de esta lista todos los múltiplos de $2$ (4, 6, 8, ...), todos los múltiplos de $3$ (6, 9, 12, ...), y así sucesivamente, hasta eliminar todos los múltiplos de los primos que han ido quedando en la lista menores o iguales que $\sqrt N$. Para decidir si un número es múltiplo de otro, usamos la función mod. Esta función devuelve el resto de una división (entera). Así, si un número es múltiplo de otro, la división es exacta, o sea, el resto es cero. En código sería así

                         If m mod n = 0 Then  'si m es múltiplo de n
                                       ....
                         End If
    


 


Cidse - Revista virtual Matemática, Educación e Internet - ITCR
Derechos Reservados
s.