CyM98

<<Sumando 1000 números>>


Lecciones anteriores:

Simulando una Calculadora Paso por paso como comenzar a programar en QuickBasic

Otra vez, y otra vez, y otra vez Comp.

 
Google
Web www.oma.org.ar


Operaciones con muchos números

En estas lecciones vamos a ver como empezar a programar. En la primera lección vimos los pasos para utilizar el QB, paso a paso, pantalla por pantalla. En las siguientes vimos más instrucciones, algunas de las cuales podían hacer que la computadora salteara o repitiera parte del programa.

En la lección anterior vimos como hacer para que el programa repita muchas veces algunas instrucciones. Ahora vamos a usar esto para calcular la suma de 1000 números o el producto de 1000 números o hacer cualquier otra operación aburrida con muchos números.

Sumando muchos números

Queremos calcular la suma de los números del 1 al 1000. Aunque parezca tonto lo que vamos a hacer es sumarlos de a uno. Podríamos usar el siguiente casi programa:

Dim Ans
Print"----------"
'Inicializo Ans en cero
Ans = 0
'Ahora le voy sumando los numeros
Ans = Ans + 1
Ans = Ans + 2
Ans = Ans + 3
'(Faltan algunas lineas justo aca)
Ans = Ans + 998
Ans = Ans + 999
Ans = Ans + 1000
'Y finalmente escribimos el total
Print "El total es", Ans
Print"----------"

Como se ve el programa está un poco incompleto, y es muy largo, y es aburrido para escribirlo. Entonces vamos a reescribir la parte del medio, en la que se suman todos los números, de manera que use un ciclo For...Next de la siguiente manera:

Dim Ans
Dim Contador
Print"----------"
'Inicializo Ans en cero
Ans = 0
'Ahora le voy sumando los numeros
For Contador = 1 To 1000
    Ans = Ans + Contador
Next Contador
'Y finalmente escribimos el total
Print "El total es", Ans
Print"----------"

En este caso se repite 1000 veces la instrucción Ans = Ans + Contador , pero en cada pasada Contador tienen un valor distinto. Como siempre para hacer los cálculos utiliza el valor viejo de Ans, y al resultado lo anota en la variable Ans (que es la que está a la izquierda).

Justo antes de empezar a sumar los números hay que acordarse de poner el total en 0. Es importante que sea justo justo antes para no olvidadarse de volver a ponerlo en 0 cuando los programas son más complicados y aparecen más ciclos y condiciones.

Para ver mejor lo que está pasando podemos agregar un par de carteles más en la pantalla que muestren como se va calculando la suma:

Dim Ans
Dim Contador
Print"-----Comienzo del programa -----"
'Inicializo Ans en cero
Ans = 0
Print "Inicialmente Ans vale", Ans
'Ahora le voy sumando los numeros
For Contador = 1 To 1000
    Print "-------------"
    Print "En este paso Contador vale", Contador
    Print "y Ans Vale", Ans
    Ans = Ans + Contador
    Print "Al calcular la suma ..."
    Print "el nuevo valor de Ans es", Ans
    'Sleep 'Espera a que se presione una tecla
Next Contador
'Y finalmente escribimos el total
Print "-------------"
Print "El total es", Ans
Print"-----Fin del programa-----"

Al ejecutar el programa empiezan a aparecer demasiadas líneas en la pantalla y no se puede leer nada. Si tarda mucho y se aburren pueden tocar las teclas Ctrl+Break para que el programa se detenga. (Hay que apretar la tecla Ctrl o Control y mantenerla apretada mientras se toca la tecla Pause/Break que está arriba a la derecha, al lado del led NumLock.). También pueden hacer que el programa espere a que uno presione una tecla usando la instrucción Sleep. (Ya está escrita en el programa anterior como un comentario.) De esta manera uno puede ejecutarlo y verlo avanzar ciclo por ciclo, e ir comprobando como hace las cuentas y como en cada ciclo le va sumando el número al total.

    

Formulita de la serie aritmética

Para calcular la suma de los números de 1 a N no hace falta sumarlos de a uno. Se puede usar la siguiente formulita:

Suma = N*(N+1)/2

Hay varias demostraciones, alguna atribuida a Gauss en persona, pero no vamos a dar ninguna :).

Con esta formulita se puede hacer un programa más corto que hace lo mismo que los anteriores, que además anda mucho más rápido (ver ejercicios) y no usa ningún ciclo:

Dim Ans
Ans = 1000
Print "----------"
Ans = Ans * ( Ans + 1 ) / 2
Print "El total es", Ans
Print"----------"

Lo que deberían recordar es que a veces pensando y haciendo cuentas auxiliares en papel se consiguen algoritmos más cortos y rápidos. Sin embargo en algunos casos no hay más remedio que apelar a la fuerza bruta, por ejemplo porque las fórmulas cerradas son muy complicadas o difíciles de deducir o directamente no existen. En otros casos uno quiere tantear a lo bruto para ver que pinta debería tener la formula cerrada, o probarla con algunos ejemplos para ver si realmente está bien las cuentas que uno hizo.

Factorial

En los ejemplos anteriores usamos la suma, pero se puede hacer lo mismo con la multiplicación. Al número que se obtiene multiplicando todos los números desde 1 hasta n se lo llama factorial de n o n!. Por ejemplo 5!=1*2*3*4*5=120, 9!=1*2*3*4*5*6*7*8*9=362880. (Además 1!=1 y 0!=1.) Vamos a hacer un programita muy parecido al anterior que calcule 1000!.

Dim Ans
Dim Contador
Print"----------"
'Inicializo Ans en uno
Ans = 1
'Ahora le voy multiplicando los numeros
For Contador = 1 To 1000
    Ans = Ans * Contador
    Print "(",Contador,"! =",Ans,")"
Next Contador
'Y finalmente escribimos el total
Print "El total es", Ans
Print"----------"

Sólo cambiamos el + por un * y además tiene que empezar de 1 en vez de 0. También tiene un cartelito que va mostrando los factoriales de los números intermedios.

Al ejecutarlo aparece un mensaje de error. Al hacer las cuentas la computadora obtiene un número demasiado grande que no puede almacenar ("Overflow") y entonces avisa para que uno trate de arreglar el problema. En este caso no lo vamos a arreglar sino que vamos a conformarnos con calcular factorial de 20 (y el de los números anteriores).

Entonces cambiamos el 1000 por un 20 y volvemos a ejecutar el programa. En la pantalla aparecen varios factoriales. Los primeros aparecen como uno espera, pero a partir de 11! son demasiado grandes y los muestra en notación científica por ejemplo 11!= 3.99168E+07= 3,99168*1007~39916800. En este caso el resultado es exacto, pero hay que tener cuidado porque a veces cuando los números son muy grandes redondea las últimas cifras.

Para mirar en la ayuda

En esta lección hay pocas cositas sueltas pero siempre se puede investigar un poco. Como siempre pueden obtener la ayuda con la tecla F1. El curso no es infinito y la mayor parte del lenguaje va a quedar afuera así que váyanse acostumbrando a tocar F1.

  • Averigüen todo lo que hace la instrucción Sleep.
  • Lean la ayuda que aparece junto con el error de "Overflow" en el programa que calcula factorial de 1000.
  • Para ver otro mensaje de error, escriban al principio Ans = 1 / 0 y ejecuten el programa. Aparece "Division by zero" y pueden ver la nueva ayuda.

Ejercicios:

  1. Buscar un cronometro, o por lo menos un reloj con segundero. En el primer programa que calcula la suma de los números de 1 a 1000 cambiar el 1000 por un número más grande (por ejemplo 100000 o 1000000) de manera que el programa tarde unos 5 segundos en ejecutarse. Reemplazar este número por el doble y ver cuento tarda. Probar con la mitad. Proba con otros valores. ¿Qué relación hay?
  2. Hacer lo mismo con los otros dos programas que calculan la suma. ¿Cuál es el más rápido? ¿Alguna idea de por qué ocurre esto?
  3. Calcular la suma de los cubos de los números de 1 a N, y compararla con la suma de los números de 1 a N. Por ejemplo si N=10, la suma de los números es 1+2+...+9+10=55 y la suma de los cubos es 13+23+...+93+103=3025. Probar con varios valores de N y buscar a ojo alguna relación.

  4. Calcular 1231*12351 sin usar ningún signo * en el programa.(Sugerencia 2*3=2+2+2=3+3, ¿Cuál de las tres formas tarda más?)

Lecciones siguientes:

Próximamente: Contadores y contados.

 

La idea es que hagan los ejercicios y piensen que otras cosas interesantes se pueden hacer relacionadas con estos temas. Cuéntennos lo que consiguieron y pregunten lo que no les salió. Envíen sus preguntas, dudas, sugerencias, experiencias y propuestas. Nuestra dirección es cym98@oma.org.ar .

También nos gustaría saber tu opinión sobre esta clase. Les pedimos que se tomen unos instantes y contesten estas preguntas. Con tu ayuda podremos hacer un curso cada vez mejor.

¿Cuál es tu calificación general de esta clase?

No entendí nada   Mala   Regular   Buena   Muy buena

El contenido de esta clase te resultó:

Nuevo   Conocido en parte   Conocido

El contenido de esta clase te pareció:

Difícil   Regular   Fácil

Los ejercicios de esta clase te parecieron:

Difíciles   Regulares   Fáciles

Comentarios, preguntas, sugerencias:

Agregar más información o una nueva lección sobre:

Demostración de la fórmula de la sumatoria

Traducciones a Pascal o C/C++

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 uk duty free cigarettes rules cigars duty free duty free cosmetics online buy duty free perfumes buy tobacco duty free