CyM98

<<Otra vez, y otra vez, y otra vez >>

Lecciones anteriores:

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

Programas que hacen preguntas y otros comentarios

Algunas Funciones y Tomando decisiones Comp.


Repeticiones como para aburrirse

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 pero en todos estos programas la computadora seguía las instrucciones en el mismo orden en que estaban escritas.

En la lección anterior vimos como hacer para que el programa saltee algunas instrucciones. En esta vamos a hacer que repita muchas veces algún grupito de instrucciones. "Muchas veces" para una persona pueden ser 100 o quizás menos. En cambio como la computadora puede hacer cuentas muy rápido, sin equivocarse ni aburrirse, uno puede pedirle que haga 1000000 de repeticiones tranquilamente, instantáneamente y sin transpirar.

Repitiendo a lo bobo

Para que se repita un grupo de instrucciones hay que encerrarlo en un bloque que empieza con una instrucción For y termina con una instrucción Next. Por ejemplo el siguiente programa pone 1000 veces el mensaje "Hola".

Dim Contador
Print"----------"
For Contador = 1 To 1000
   Print "Hola. Ahora Contador vale ", Contador
Next Contador
Print"----------"

En este programa la tercera instrucción hace que la variable que llamamos Contador vaya contando desde 1 hasta 1000. Cuando llega al Next se fija si el Contador ya llegó a 1000 y sino vuelve a ejecutar todas las instrucciones desde el For. Nuevamente escribimos las instrucciones entre el For y el Next corridas hacia la derecha para que sean más fáciles de identificar los bloques.

Hasta ahora si uno tenía la suficiente paciencia para escribir un programa, seguramente tenía el suficiente tiempo como para esperar a que termine de ejecutarse. Cada instrucción se ejecutaba una vez en muchísimo menos tiempo que el que se tardaba en escribirla. A partir de esta lección podemos empezar a hacer programas que tarden mucho, a veces años.

Si en algún momento uno se aburre se puede tocar las teclas Ctrl+Break y el programa se detiene. (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.) Para que el programa empiece desde el principio nuevamente hay que ir al menú Run y tocar Start (Shift+F5). Si en cambio se toca en el mismo menú a Continue(F5) el programa continúa.

Según la velocidad de la máquina, 1000 repeticiones pueden ser pocas. Pueden probar que pasa si se cambia el 1000 por 100000 o 1000000 y ver como el programa sigue y sigue y sigue. También pueden cambiar el 1000 por 10 o 15 para poder contar en la pantalla las veces que aparece hola y ver que realmente son las que corresponden. También se puede cambiar el número desde el que empieza a contar, cambiando el 1 por 5, o el número que uno quiera.

Tanteando

Esta velocidad nos permite tantear muy fácilmente. Por ejemplo un par de lecciones atrás vimos el problema de los bellos piratas durmientes:

Para ayudarnos a resolverlo habíamos hecho un programita que nos permitía tantear eligiendo la cantidad de cocos iniciales. El programa servía para no tener que hacer las cuentas a mano, que es algo aburrido y encima probablemente cometamos algún error.

Dim Ans
Input "Cantidad inicial de cocos ", Ans
Ans = Ans-Ans/5-1
Ans = Ans-Ans/5-1
Ans = Ans-Ans/5-1
Print "Cantidad final de cocos ", Ans

Una posibilidad es encerrar a todo el programa entre el For y el Next, así nos permite tantear 100 veces sin tener que volver a ejecutar el programa.

Dim Contador 
For Contador = 1 To 100
    Dim Ans
    Print "------------------------------------"
    Input "Cantidad inicial de cocos ", Ans
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Print "Cantidad final de cocos ", Ans
Next Contador

En este caso no usamos nunca el valor de Contador, sólo ponemos el For...Next para que repita las instrucciones 100 veces. También se puede ir poniendo cuantas veces probamos cambiando el primer Print por

     Print "------- Intento Numero ", Contador, "---------"

Más astutamente se puede hacer que el programa no pregunte la cantidad inicial de cocos. La idea es que use el valor del Contador. Así que el programa queda

Dim Contador 
For Contador = 1 To 100
    Dim Ans
    Print "------------------------------------"
    Ans = Contador
    Print "Cantidad inicial de cocos ", Ans
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Print "Cantidad final de cocos ", Ans
Next Contador

La línea marcada es parecida a las que usábamos antes como Ans=Mem o Mem=Ans. En estas se calcula el valor de lo que está a la derecha del igual y el resultado se lo guarda en la variable que está a la izquierda. En este caso no hay muchas cuentas para hacer y solamente se anota el valor que tiene el Contador en la variable Ans.

Al ejecutarlo no se encuentra la solución, porque los valores son muy bajos. Sin embargo es fácil cambiar el rango de búsqueda para obtener la solución.

Resultados interesantes

El problema con el programa anterior es que muestra en pantalla cientos o miles de líneas que pasan y pasan y pasan y es muy difícil ver si en algún caso dio justo 59. Lo que deberíamos hacer es seleccionar los resultados que nos interesan. Para esto ponemos un If que muestra un cartel de alegría.

Dim Contador 
For Contador = 1 To 200
    Dim Ans
    Print "------------------------------------"
    Ans = Contador
    Print "Cantidad inicial de cocos ", Ans
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Ans = Ans-Ans/5-1
    Print "Cantidad final de cocos ", Ans
    If Ans = 59 Then
        Print "******************* Encontrado *********************"
        Print "Cantidad Inicial=", Contador
        Print "Cantidad Final=", Ans
        Print "****************************************************"
    End If
Next Contador

Y es aún más claro si sacamos los tres Print que está afuera del If para que solamente aparezcan las respuestas correctas, y no todos los intentos inútiles.

En un problema en general uno quiere todas las posibles respuestas y no solamente una. Así que para que la solución este completa habría que ver que no es necesario probar con números menores que 1 ni mayores que 200. En este caso se puede ver que a medida que la cantidad de cocos iniciales aumenta, también la cantidad final de cocos. Con 200 cocos iniciales ya se ve que sobran, así que si inicialmente hay más de 200 va a ser aun peor.

Tanteando ecuaciones

Muchos problemas se pueden escribir como una ecuación, que permite buscar más fácilmente la respuesta. En otros directamente nos piden encontrar las soluciones de una ecuación. Por ejemplo:

Los dos problemas son casi iguales. Un punto importante es que la cantidad de personas es un numero entero, y la cantidad de personas en cada lado también es un entero. A este número uno lo podría llamar L (de lado) o X (de incógnita). Y el otro lado mide L+3, así que la cantidad de personas es L*(L+3) y esto debe dar 460.

La máxima cantidad de personas que puede haber en un lado es de 460, porque es el total. Pensando un ratito se puede bajar este número, pero no vale la pena el esfuerzo. En principio deberíamos fijarnos en todos los enteros positivos que son infinitos, pero con este razonamiento sabemos que alcanza mirando solo 460, que se tantean todos en un instante.

Dim Lado 
Print "-------------------------"
For Lado = 1 To 460
    If Lado*(Lado+3) = 460 Then
        Print "******************* Encontrado *********************"
        Print "Lado Menor=", Lado
        Print "Lado Mayor=", Lado+3
        Print "****************************************************"
    End If
Next Contador
Print "-------------------------"

Y esto resuelve completamente el problema.

Esta no es la única manera de resolverlo. Hay varias formas distintas que tienen sus ventajas y desventajas. Por ejemplo:

Uno menos

Si un alumno va al baño y quedan 459, no es posible formar el rectángulo pedido. Cambiando los dos 460 por 459 obtenemos un programa que nos da todas las soluciones. Al ejecutar el programa no aparece ninguna, así que eso significa que no hay ninguna solución. Es importante recordar que para estar seguros de que el programa las encuentra a todas hay que analizar hasta donde hay que hacer la búsqueda, en este caso 459. No alcanza con poner un número grande como 10000 o 1000000 y cruzar los dedos.

Si utilizamos algunos de los otros métodos, por ejemplo aplicamos la ecuación de segundo grado a este rectángulo de 459 alumnos obtenemos dos valores de L que verifican la ecuación (uno de ellos es 19 y pico, casi 20). Estas soluciones no son enteras así que no nos sirven para este problema. En muchos casos uno podría estar interesado en conocer todas las soluciones sin importarnos si son enteras o no. En este tipo de problemas ya no sirve tantear tan simplemente, porque habría que probar con infinitos números y eso lleva infinito tiempo. En este tipo de problemas hay que utilizar ideas más sutiles, para encontrar o aproximar las soluciones.

Para mirar en la ayuda

En esta lección quedan varias instrucciones para investigar. En general se pueden utilizar para destacar algún acontecimiento importante, de manera que no pase inadvertido entre pantallas y pantallas de texto. 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:


Ejercicios:

  1. Muchos problemas se pueden resolver tanteando lo suficiente. Pueden buscar otros problemas de este estilo de pruebas de OMA o Ñandú y resolverlos. Recuerden que en general piden todas las soluciones y hay que buscar el rango adecuado. Si piden solamente una solución uno puede probar y cruzar los dedos.
  2. Buscar cuatro números enteros consecutivos tales que su producto sea 358800.
  3. Si en el problema de los piratas se intenta comenzar con diferentes cantidades enteras de cocos iniciales a veces la cantidad de cocos finales es un número entero y a veces no. Buscar todos los posibles valores enteros que se pueden poner inicialmente para que la cantidad final sea entera. Sugerencia: Poner la maquina a tantear un rato y ver que resultados tira. Después pensar.
  4. Escribir un programa que resuelva el problema del rectángulo de alumnos utilizando la ecuación de segundo grado. Pongan un Input para que se pueda elegir la cantidad de alumnos, en vez de que sea siempre 460. Usando If fijarse si dio entero o no y poner el cartel correspondiente en la pantalla.

Lecciones siguientes:

Sumando 1000 números Comp.

Más adelante: Ecuaciones con dos incógnitas enteras.


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:

Funciones de los Menús (Start, Continue)

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 online duty free cigs online duty free cigars online where to buy cosmetics duty free perfumes online tobacco duty free