<<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
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:
- que hace la instrucción Sleep.
- que hace la instrucción Beep. ¡¡Tampoco abusen!! Es muy molesto un programa que se la pasa haciendo beep, beeeep, beeeeeeep.
- que hace la instrucción Stop.
- que hace la instrucción End.
Ejercicios:
Lecciones siguientes:
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.
OmaNet Curso CyM98 | OmaNet - Educación Interactiva www.oma.org.ar/omanet | omanet@oma.org.ar |
mensajes: webmaster@oma.org.ar |