– PRE-Universitario Ciudad de San Felipe – Informática 6to Ingeniería Clase 5 - Bucles, Loops, repeticiones, o ciclos Los bucles o loops son varias secuencias que se ejecutan repetidas veces. Separamos en dos casos, cuando sabemos exactamente la cantidad de veces que se repite el bucle, o cuando no sabemso cuantas veces pero tenemos una condición que se debe cumplir para seguir trabajando. Para lo primero se usa el FOR, y para lo segundo el WHILE. Bucle FOR Hay ocasiones en las que es necesario repetir el mismo conjunto de instrucciones muchas veces, cambiando algunos detalles. Pongamos un caso. Sumar los primeros 20 naturales. Eso se puede hacer haciendo a=1+2+3+4+5+…..+18+19+20. Pero seria imposible pensar en hacer esto si queremos sumar los 500000 primeros naturales. O si bien no imposible, por lo menos demaisado laaaargo. Para este tipo de problemas se usa el bucle for, pues de antemano sabemos cuantas veces queremos repetir una operación. La sintaxis del for es for contador=inicio:paso:fin, sentencias end Las palabras claves son for y end. Este bucle pone en marcha una variable llamada contador que va desde inicio hasta fin de paso en paso. Cada vez que las sentencias se ejecutan, contador aumenta en un valor paso (que si se omite, se le asigna automáticamente el valor 1). Cuando contador llega al valor fin, el bucle se acaba y el programa continúa con las sentencias que haya más allá de end. Ejemplos La siguiente construcción ejecuta sentencias con valores de i de 1 a n, variando de uno en uno for i=1:n sentencias end Informática – PRE-Universitario Ciudad de San Felipe – 6to Ingeniería En el siguiente ejemplo se presenta el caso más general para la variable del bucle (valor_inicial: incremento: valor_final); el bucle se ejecuta por primera vez con i=n, y luego i se va reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el bucle se termina: for i=n:-0.2:1 sentencias end En el siguiente ejemplo se presenta una estructura correspondiente a dos bucles anidados. La variable j es la que varía más rápidamente (por cada valor de i, j toma todos sus posibles valores): for i=1:m for j=1:n sentencias end end Ahora un programa que le pida al usuario un natural y escriba en pantalla todos los naturales desde 1 a ese número. nro = input('Ingrese un número natural > que 1: '); for i=1:nro disp(i) end Calculemos 20 2i 420 i= 1 El código para esto es el siguiente: suma=0; for i=1:20 suma=suma+i; end suma Otro ejemplo de ciclo for es el cálculo del factorial de n: n=20 fact=1; for i=1:20 fact=fact*i; end fact Ahora podemos cambiar el programa para que pregunte el número del cual podemos calcular el factorial n=input(‘factorial de que numero?:’) fact=1; for i=1:n fact=fact*i; end fact Informática – PRE-Universitario Ciudad de San Felipe – 6to Ingeniería Es importante ver en los ejemplos las variables marcadas con rojo. Estas variables se usan para ir guardando resultados de las operaciones que se repiten. Es algo muy usado en programación tener este tipo de variables en bucles, pues todas las operaciones que se hacen deben quedar guardadas en alguna variable, que debe ser siempre la misma. Por eso se usa una “recursión” ya que la variable se usa a si misma. Es fundamental que dicha variable arranque con algún valor antes de entrar al ciclo sino da un error. Bucle While Si se pide calcular los primeros 20 naturales, uno piensa en usar un FOR de esta manera: suma=0; for i=1:20 suma=suma+i; end Un bucle como el indicado se implementa un número fijo de veces: desde inicio hasta fin de paso en paso. En este ejemplo se hace desde i=1 a i=20 y termina. En ocasiones, sin embargo, no se sabe de antemano cuántas veces habrá que ejecutar las sentencias del bucle. Por ejemplo: si es necesario repetir una serie de sentencias hasta que se cumpla una determinada condición, y no se sabe a priori cuántas veces será necesario realizar esas operaciones. En ese caso se emplea un bucle while: while (condición), sentencias end Este bucle ejecuta las sentencias mientras la condición sea verdadera. En el siguiente ejemplo usamos un ciclo while para hacer la misma suma que en el primer ejemplo del ciclo for. Informática – PRE-Universitario Ciudad de San Felipe – 6to Ingeniería i=1; suma=0; while i <= 20 suma=suma+i; i=i+1; end Este ejemplo va sumando i mientras que i sea menor o igual que 20, cuando se pasa de 20 no suma más. Diagrama de flujo de un bucle while Atención: es fácil caer en bucles infinitos. Si en las sentencias no se modifican el valor de alguna variable, la "condición" siempre será cierta (pues y el programa nunca saldrá del bucle: ejecutará una y otra vez las sentencias. El programa se "cuelga", y hay que interrumpirlo desde el teclado apretando las teclas Ctrl+C. Por ejemplo si quiero ir dividiendo a x entre 2 mientras que este sea mayor que 10 lo puedo hacer con este código. x=100 while x>10 x=x/2 end El renglón marcado en rojo es el que cambia a la variable principal, si esta línea no estuviera se entraría en un ciclo infinito. El programa se "cuelga", y hay que interrumpirlo desde el teclado apretando las teclas Ctrl+C. Es posible sustituir la condición por una variable. En efecto: una variable que toma el valor cero corresponde a una condición falsa. Si la variable toma un valor diferente de cero, es equivalente a una condición verdadera. Así, se puede escribir x=10; while(x) sentencias x=x-1; end Para x=10, la "condición" es verdadera puesto que x es diferente de cero. Nótese que el contador x hay que modificarlo manualmente (línea x=x-1) puesto que, al revés que lo que ocurre con el bucle for, este no gestiona ningún contador. En cuanto x tome el valor cero, la "condición" es falsa y el bucle acaba. En el ejemplo anterior, si falta la línea x=x-1 y las sentencias no modifican el valor de x, la "condición" siempre será cierta (pues x=10) y el programa nunca saldrá del bucle: ejecutará una y otra vez las sentencias. Este es otro ejemplo de un ciclo infinito. Otros ejemplos: Una sucesión numérica clásica: tome un entero. Si es par se divide entre 2, si es impar se multiplica por 3 y se suma uno y se repite. n= input('Un entero, por favor : ') ; while n > 1 if rem(n,2)==0, n = n/2, else n = 3*n+1, Informática – PRE-Universitario Ciudad de San Felipe – end end Algoritmo de Euclides para máximo común divisor m = input('insertar primer numero: ') n = input('insertar segundo numero: ') while (n>0) resto=mod(m,n); m=n; n=resto; end mcd=m Trancar la computadora x=0; while x~=10 x=x+0.1 end 6to Ingeniería