14 nov 2011

Repetitivas/Ciclicas/Bucles Parte I

Estructuras Repetitivas:
Bueno, ahora llegamos a la recta final para saber lo básico de la programación, que es algoritmos, si bien no es absolutamente TODO lo que se debe saber, es lo mínimo necesario, y si se exprime todo, se pueden lograr muchas cosas. Empecemos!

¿A que se puede referir algo repetitivo/cíclico? ya te imaginas ¿no? espero que si -_-
Me refiero a estructuras que tienen como función, realizar ciclos de una serie de sentencias. Osea, repetir esas sentencias, cuantas veces sea necesario. Estas estructuras son tres: Mientras, Repetir y Para. A estas estructuras, también le tenemos que poner una condición que indique cuando termina el ciclo, por que si no formaríamos un "ciclo infinito", créanme, deben conocer muy bien lo que es un ciclo infinito, vieron cuando se les traba un programa y le aparece una misma ventana mil veces y no se cierra, y no se cierra, eso es por que por alguna razón, la condición del ciclo de ese programa no se cumple nunca, entonces se repite y se repite y se repite y se repite y se repite y se repite................................................ (si no entendés anda al psicólogo).
Bueno, ¿con cual podemos comenzar? las tres son parecidas, pero empecemos con el Mientras, que es uno de los mas usados. Se usa así:

Mientras condición Hacer //Comienzo
//sentencias
FinMientras //Fin

Y acá, el machete para que lo entiendan de una:
Mientras esto se cumpla Hacer
//todo esto
FinMientras

Bueno, pero si hiciéramos esto, nuestro Mientras seria infinito, imagínate que si la condición se cumple, empieza el ciclo del Mientras, después de eso, realiza todas las sentencias, cuando llega al FinMientras, si la condición se sigue cumpliendo, vuelve a ejecutar las sentencias, y así de nuevo, y de nuevo, y... -_- Miren:

Proceso ejemplo
variable<-1; //inicializamos la variable en 1

        Mientras variable=Hacer //cuando llega a esta linea, la variable vale 1, entonces entra al mientras
                 Escribir "ciclo"; //como se cumple la condición, ejecuta esta sentencia, muestra "ciclo"
        FinMientras //acá finaliza, pero ¿que pasa? la variable sigue valiendo 1, entonces vuelve a empezar

FinProceso //como la variable no cambia en ninguna instancia, el mientras se repite infinitamente, y nunca termina el proceso

Entende'? entonces hay que hacer algo, ponerle un stop! al Mientras,¿como?, ¿vos que harias? si dentro del mientras pones: variable<-0(o cualquier otro numero diferente a 1) cuando llega al FinMientras la condición (que sea igual a 1) no se cumple, y ahí si llega al Fin del proceso, pero si hiciéramos esto no tendría sentido, por que el mientras se ejecutaría una sola vez, y para que sea un ciclo se debe ejecutar mas veces. Hay dos formas clásicas de terminar el mientras, una es que el usuario la termine, y otra es que sepamos la cantidad de veces que queremos que se ejecute el Mientras. Pero ahora, antes de seguir, les pido que se hagan una pregunta: ¿Para qué demonios sirve hacer un ciclo o bucle en un programa?, Bueno, imaginense que les piden hacer un algoritmo, de un programa que te lea 5 sueldos de operarios de X empresa, harían esto:

Proceso legajo
   Escribir "ingrese sueldos";
   Leer sue1;
   Leer sue2;
   Leer sue3;
   Leer sue4;
   Leer sue5;
FinProceso

Perfecto!, pero ¿si te piden que ingreses el sueldo de 1000 operarios? ¿escribirias 1000 veces Leer? dale, te espero sentado ja! y si sos un poco inteligente ya t das cuenta para que sirve un ciclo repetitivo, si no, es facil, en vez de poner Leer mil veces, pones un Mientras(una condición que se cumpla 1000 veces) y adentro le pones un solo Leer, como la condición se cumplirá mil veces, el Leer aparecerá mil veces:

Escribir"Ingrese sueldos";
Mientras condición que se cumpla solo 1000 veces Hacer
        Leer sueldos;
FinMientras //la condición que se cumple mil veces, hará que el Mientras se ejecute mil veces, entonces las sentencias del mientras (Leer) aparecerán mil veces, genial!, pero ahora tenemos que pensar, que condición poner para que el mientras se cumpla mil veces...

¿Qué condición y como?
¿Qué les parece contando? si contamos cada vez que pasa un ciclo 1, después 2, después 3, y así hasta llegar a 1000, y cuando llega a mil, cortamos el ciclo. Para esto, necesitamos un contador, ¿que es esto? una variable que por cada Mientras, se le sume 1, y que la condición sea que el Mientras, siga funcionando, solamente si la variable es menor a mil, entonces cuando la variable contador llegue a sumar 1000 veces, quiere decir que el ciclo se cumplió 1000 veces y como la condición dice que debe ser menor a 1000, el Mientras no se va a volver a ejecutar. Con este ejemplo, lo van a entender mejor:

Proceso ejemplo_ciclo
contador<-0; //esta variable va a ser la que cuente cada ciclo, SI O SI es necesario INICIALIZARLA
      Escribir "Ingrese sueldos";
      Mientras contador<1000 Hacer //el contador en el primer ciclo, vale 0, es menor a mil, entonces el Mientras se ejecuta
              Leer sueldo; //pide ingreso del sueldo al usuario
              contador<-contador+1; //Acá, el contador se le suma 1, en el primer ciclo vale 0, mas 1, 1. Entonces, a partir de acá, contador vale 1, cuando llega al FinMientras, la condicion dice que si contador es menor a 1000, y como 1 es menor a 1000, se vuelve a ejecutar, lee denuevo el sueldo, y vuelve a sumarle 1 al contador, en ese momento vale 2, termina el mientras y 2 es menor a 1000, entonces se vuelve a ejecutar, así, sucesivamente hasta que el contador valga 1000, cuando sucede esto, la condición dice que sea menor a 1000, y como es igual (no menor), el mientras no se ejecuta mas, y ahí si llegara al FinProceso.
      FinMientras
FinProceso

Es necesario inicializar el contador en 0, por que cuando le asignamos la suma (contador<-contador+1;) en el Mientras, si no tiene valor previo, esa asignación no funcionara. Cada variable que no inicializamos, tiene un valor nulo, cuando le pedimos al usuario que la ingrese, no es necesario inicializarla por que en ese momento, es el usuario quien le da el valor, pero al usarla directamente así: contador<-contador+1; sin inicializarla, la compu leería esto: nulo<-nulo+1; entonces no podría realizar esta operación :) al ponerle cero, hace: 0<-0+1; y esto si puede realizarlo.
También es necesario inicializarlo porque el Mientras tiene una condición que dice que para que el mismo se inicie, la variable contador debe ser menor a 1000, supongamos que al contador le asignamos 1100, cuando llega al Mientras el programa se pregunta: ¿1100 es menor a 1000? NO, entonces no ejecuta el Mientras ni una vez.
---------------------------------------------------------------------------------------------------------------
LEAN ESTO SI TODAVÍA NO ENTIENDEN:
Un ejemplo, imaginate que vos sos entrenador de un chavoncito de esos que corren en las olimpiadas. Estas en una de esas pistas que corren de tierra naranja, y a tu corredor le decís que en su entrenamiento, tiene que correr, supongamos, 20 vueltas. Entonces los dos se paran en el punto de largada. Vos tenes un aparatito para contar cuantas vueltas va (contador), obviamente empieza en 0, entonces le decís: "pibe, empezá a correr hasta que esto llegue a 20", y el pibe le da duro y parejo, da la primer vuelta, vos apretás el aparatito y le suma 1 vuelta, da otra, le sumas de nuevo va 2 vueltas, y otra, va 3... así hasta que llega a 20 vueltas, cuando vos tocas el aparatito y dice 20, agarras y le decís: "pibe, vení que ya llegaste a 20, anda para tu casa ahora"... En este ejemplo, el Mientras, es el corredor, las Sentencias son todo el camino que cruza el corredor (esto lo obvie) y vos, sos el Contador. Es fácil, espero se halla entendido.
---------------------------------------------------------------------------------------------------------------

Entonces, en pocas palabras, el mientras repite todo lo que esta dentro del mismo, si solo si la condición se cumple y hasta que la misma se deje de cumplir.
Ahora y por último, les voy a mostrar otra forma de frenar un Mientras, en el ejemplo anterior, sabíamos que el Mientras, debía ejecutarse 1000 veces, pero ¿que pasaría si no supiéramos la cantidad de veces que se tiene que ejecutar?
Ejemplo: Una empresa tiene una indefinida cantidad de empleados, de la cual se pide un algortimo de un programa que lea los sueldos de todos los empleados.
Entonces, si no sabemos cuantos empleados son, ¿que podemos hacer? la respuesta es, preguntarle al usuario si quiere seguir ingresando datos! :) para esto, vamos a ver una variable del tipo carácter:

Proceso desea_continuar

respuesta<-'s';//inicializo la respuesta en 's' para que el Mientras pueda empezar
     Escribir "Ingrese Sueldos";
     Mientras respuesta='s' Hacer //si la respuesta del usuario es 's', el mientras se vuelve a ejecutar, si no, se frena.
           Leer sueldo;
           Escribir "¿Desea continuar ingresando? (s) o (n)"; //Le preguntamos al user si quiere seguir ingresando datos, de manera que sera el quien decida si el Mientras se vuelve a ejecutar o no
           Leer respuesta; //leemos la respuesta, si el usuario toca la letra 's', el mientras vuelve a ejecutarse, si toca la letra 'n' (o cualquier otra letra) el mientras no se ejecuta, por que la variable respuesta no es mas igual a 's'
     FinMientras

FinProceso

Si se ponen a pensar, hay muchas cosas locas, por ejemplo, y ¿que pasa si el usuario ingresa una letra en vez de un numero o viceversa?, y tira un error, y ¿que pasa si el usuario ingresa letra mayúscula en vez de minúscula? creo que el pseint si distingue entre mayúsculas y minúsculas(así como C), así que tiraría un error, o al tocar S mayúscula el mientras no se cumpliría, pero esas son cosas que al programar se pueden solucionar, tienen su solución en algoritmos, que si se ponen a pensar, la sacan, ya lo veremos, no se desesperen jeje

Bueno, me canse y me tengo que ir a trabajar, creo que finalizamos con el Mientras, si me falta algo después agrego, si un día alguien llega a leer esto, créanme que me siento como un loco escribiendo todo esto, prácticamente a nadie, por que no tengo la certeza de que alguien siga esto, pero espero que algún día, cuando toque temas mas avanzados, alguien comente jaja nos vemos!!

No hay comentarios:

Publicar un comentario