{"id":390,"date":"2022-10-04T16:05:50","date_gmt":"2022-10-04T14:05:50","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=390"},"modified":"2022-10-07T13:05:58","modified_gmt":"2022-10-07T11:05:58","slug":"4-3-bucles-for","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/4-3-bucles-for\/","title":{"rendered":"4.3. Bucles for"},"content":{"rendered":"<p>Veamos c\u00f3mo podr\u00edamos resolver el problema planteado en el dibujo anterior:<\/p>\n<p><figure id=\"attachment_120\" aria-describedby=\"caption-attachment-120\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-120\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_043.jpg\" alt=\"\" width=\"800\" height=\"343\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_043.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_043-300x129.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_043-768x329.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-120\" class=\"wp-caption-text\">Figura 44. Bucle <span class=\"courier\">for<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Como pod\u00e9is observar, con un par de l\u00edneas de c\u00f3digo se puede resolver lo que antes hac\u00edamos con m\u00e1s de veinte. Exploremos con detalle la estructura de un bucle <span class=\"courier\">for<\/span>:<\/p>\n<pre>\/\/ Un bucle for siempre tendr\u00e1 \r\n\/\/ la siguiente estructura:\r\n\r\n\/*\r\nfor (estado inicial; test; actualizaci\u00f3n) {\r\n    Aqu\u00ed el c\u00f3digo a ejecutar\r\n}\t\r\n*\/<\/pre>\n<p>Siempre empezaremos utilizando la palabra clave <span class=\"courier\">for<\/span>; a continuaci\u00f3n y entre par\u00e9ntesis, escribiremos las siguientes instrucciones, separadas por punto y coma:<\/p>\n<ul>\n<li><strong>Estado inicial<\/strong>: aqu\u00ed declaramos y asignamos un valor inicial a una variable que nos va a servir de contador para el n\u00famero de repeticiones que queramos realizar. Por ejemplo, podemos definir el estado inicial con <span class=\"courier\">let i = 0;<\/span>, aunque puede ser cualquier otro valor.<\/li>\n<li><strong>Test<\/strong>: aqu\u00ed definiremos la condici\u00f3n que se tiene que cumplir para que el bucle contin\u00fae ejecut\u00e1ndose o termine. Para ello, compararemos el valor de la variable que hemos declarado en el estado inicial con otro valor a trav\u00e9s de los <strong>operadores de comparaci\u00f3n<\/strong>.<\/li>\n<li><strong>Actualizaci\u00f3n<\/strong>: cuando el bucle haya completado una iteraci\u00f3n, actualizaremos el valor de nuestra variable de inicio.<\/li>\n<\/ul>\n<p>Si la condici\u00f3n que hemos definido en <em>test<\/em> se cumple, pasaremos a ejecutar el c\u00f3digo que tengamos en el cuerpo del bucle <span class=\"courier\">for<\/span>, entre las llaves. Si no se cumple, el bucle termina.<\/p>\n<figure id=\"attachment_122\" aria-describedby=\"caption-attachment-122\" style=\"width: 283px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-122\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_044.jpg\" alt=\"\" width=\"283\" height=\"375\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_044.jpg 283w, \/wp-content\/uploads\/2022\/10\/PID_00290094_044-226x300.jpg 226w\" sizes=\"(max-width: 283px) 100vw, 283px\" \/><figcaption id=\"caption-attachment-122\" class=\"wp-caption-text\">Figura 45. Diagrama de flujo de un bucle for<br \/>Fuente: adaptaci\u00f3n de L. McCarthy; A. P. C. Reas; B. Fry (2015). <em>Getting Started with P5.Js: Making Interactive Graphics in JavaScript and Processing<\/em>. Make Community, LLC.<\/figcaption><\/figure>\n<p>Veamos un ejemplo pr\u00e1ctico:<\/p>\n<pre>console.log(\"Comienza el bucle\");\r\nfor (let i = 0; i &lt; 5; i ++) {\r\n    console.log(\"La variable i vale: \" + i);\r\n}\r\nconsole.log(\"Termina el bucle\");<\/pre>\n<p>Como <strong>estado inicial<\/strong> estamos declarando la variable <span class=\"courier\">i<\/span> y asign\u00e1ndole el valor 0. Pod\u00e9is usar cualquier nombre para esta variable, pero es bastante com\u00fan utilizar <span class=\"courier\">i<\/span> cuando estamos iterando en un bucle (<span class=\"courier\">i<\/span> de <em>index<\/em> o \u00edndice para llevar la cuenta).<\/p>\n<p>A continuaci\u00f3n, la <strong>condici\u00f3n<\/strong> que establecemos es <span class=\"courier\">i &lt; 5<\/span>, lo que traducido a lenguaje natural ser\u00eda: mientras <span class=\"courier\">i<\/span> sea menor que 5. Para definir la condici\u00f3n, utilizamos los denominados operadores de comparaci\u00f3n. Los m\u00e1s usados son los siguientes:<\/p>\n<div class=\"tabletitle\"><p>Tabla 1. Principales operadores de comparaci\u00f3n<\/p>\n<\/div>\n<table width=\"546\">\n<tbody>\n<tr class=\"table-header\">\n<td width=\"123\"><strong>Operador<\/strong><\/td>\n<td width=\"170\"><strong>Descripci\u00f3n<\/strong><\/td>\n<td width=\"253\"><strong>Ejemplo<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>&gt;<\/strong><strong>\u00a0<\/strong><\/td>\n<td width=\"170\">Mayor que<\/td>\n<td width=\"253\">5 &gt; 2 Verdadero<\/p>\n<p>5 &gt; 5 Falso<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>&lt;<\/strong><strong>\u00a0<\/strong><\/td>\n<td width=\"170\">Menor que<\/td>\n<td width=\"253\">0 &lt; 5 Verdadero<\/p>\n<p>7 &lt; 5 Falso<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>&gt;=<\/strong><\/td>\n<td width=\"170\">Mayor o igual que<\/td>\n<td width=\"253\">5 &gt;= 5 Verdadero<\/p>\n<p>0 &gt;= 5 Falso<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>&lt;=<\/strong><\/td>\n<td width=\"170\">Menor o igual que<\/td>\n<td width=\"253\">10 &lt;= 10 Verdadero<\/p>\n<p>11 &lt;= 10 Falso<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>==<\/strong><\/td>\n<td width=\"170\">Igual que<\/td>\n<td width=\"253\">5 == 5 Verdadero<\/p>\n<p>0 == 5 Falso<\/td>\n<\/tr>\n<tr>\n<td width=\"123\"><strong>!=<\/strong><\/td>\n<td width=\"170\">Distinto que<\/td>\n<td width=\"253\">0 != 5 Verdadero<\/p>\n<p>3 != 3 Falso<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Fuente: elaboraci\u00f3n propia.<\/p>\n<\/div>\n<p>Por lo tanto, el c\u00f3digo del cuerpo de nuestro bucle se ejecutar\u00e1 mientras nuestra variable <span class=\"courier\">i<\/span> sea menor que 5.<\/p>\n<p>Por \u00faltimo, debemos definir cu\u00e1l va a ser el <strong>incremento<\/strong> de nuestra variable cada vez que se ejecute el bucle. En el ejemplo hemos establecido <span class=\"courier\">i ++<\/span>, lo que \u2013si recordamos del tema anterior\u2013 es un atajo equivalente a si escribi\u00e9semos <span class=\"courier\">i = i + 1<\/span>, o lo que es lo mismo: la variable i aumentar\u00e1 de uno en uno cada vez que se ejecute el bucle. Si volvemos a nuestro ejemplo, al ejecutarlo ver\u00edamos en la consola lo siguiente:<\/p>\n<pre>Comienza el bucle\r\nLa variable i vale: 0\r\nLa variable i vale: 1\r\nLa variable i vale: 2\r\nLa variable i vale: 3\r\nLa variable i vale: 4\r\nTermina el bucle<\/pre>\n<p>La primera vez que se entra en el bucle la variable <span class=\"courier\">i<\/span> vale 0, por lo que se cumple la condici\u00f3n <span class=\"courier\">i &lt; 5<\/span> y se ejecuta el c\u00f3digo dentro de las llaves (que imprime en la consola el valor de <span class=\"courier\">i<\/span>). Una vez que ha terminado de ejecutar este c\u00f3digo, pasa a la fase del incremento, suma 1 a la variable <span class=\"courier\">i<\/span> y vuelve a hacer la comprobaci\u00f3n de la condici\u00f3n; ahora <span class=\"courier\">i<\/span> vale 1 (0 + 1) y se sigue cumpliendo la condici\u00f3n. As\u00ed hasta que llegamos a la quinta ejecuci\u00f3n del bucle, en la que <span class=\"courier\">i<\/span> vale 4. Cuando termina de imprimir en la consola el valor de <span class=\"courier\">i<\/span>, pasa de nuevo a la fase de incremento, <span class=\"courier\">i<\/span> pasa a valer 5 y la condici\u00f3n ya no se cumple porque <span class=\"courier\">5 &lt; 5<\/span> es <strong>falso<\/strong>. Al no cumplirse la condici\u00f3n, sale del bucle y ejecuta el c\u00f3digo que tiene a continuaci\u00f3n, que imprime en la consola que el bucle ya ha terminado.<\/p>\n<p>Si volvemos al bucle que nos dibujaba los c\u00edrculos de la figura 44, nos encontramos el siguiente c\u00f3digo:<\/p>\n<pre>for(let i = 0; i &lt;= width; i += 20) {\r\n    circle(i, height * 0.5, 15);\r\n}<\/pre>\n<p>Aqu\u00ed estamos iniciando el bucle tambi\u00e9n asignando a la variable <span class=\"courier\">i<\/span> el valor de 0. Variamos la condici\u00f3n que se debe cumplir porque ahora para que se ejecute el c\u00f3digo del cuerpo del bucle, el valor de <span class=\"courier\">i<\/span> deber\u00e1 ser menor o igual que el ancho de nuestro c<em>anvas <\/em>y el incremento esta vez en lugar de ir aumentando de uno en uno aumenta de veinte en veinte.<\/p>\n<p>En el cuerpo del bucle utilizamos la variable <span class=\"courier\">i<\/span> para determinar la posici\u00f3n horizontal de los c\u00edrculos, mientras que la posici\u00f3n vertical es fija, por lo que esta ir\u00e1 aumentando de veinte en veinte hasta llegar al final del <em>canvas<\/em>. El primer c\u00edrculo se dibujar\u00e1 en las coordenadas (0, 200), el segundo en (20, 200), el tercero en (40, 200) y as\u00ed sucesivamente hasta llegar a la coordenada (200, 200), en la que se dibujar\u00e1 el \u00faltimo c\u00edrculo.<\/p>\n<p>Para observar mejor el funcionamiento del bucle, podemos cambiar la condici\u00f3n que cumplir introduciendo una variable que nos permita cambiar hasta qu\u00e9 valor en horizontal queremos dibujar los c\u00edrculos:<\/p>\n<pre>let limit = 100;\r\nfor(let i = 0; i &lt;= limit; i += 20) {\r\n    circle(i, height * 0.5, 15);\r\n}<\/pre>\n<figure id=\"attachment_124\" aria-describedby=\"caption-attachment-124\" style=\"width: 400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-124\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_045.jpg\" alt=\"\" width=\"400\" height=\"407\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_045.jpg 400w, \/wp-content\/uploads\/2022\/10\/PID_00290094_045-295x300.jpg 295w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><figcaption id=\"caption-attachment-124\" class=\"wp-caption-text\">Figura 46. Bucle for con el l\u00edmite en 100<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Dentro del cuerpo de los bucles, podemos insertar el c\u00f3digo que queramos. Podr\u00edamos por ejemplo usar la funci\u00f3n <span class=\"courier\">eye()<\/span> del tema anterior para dibujar una sucesi\u00f3n de ojos:<\/p>\n<p><figure id=\"attachment_126\" aria-describedby=\"caption-attachment-126\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-126\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_046.jpg\" alt=\"\" width=\"800\" height=\"488\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_046.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_046-300x183.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_046-768x468.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-126\" class=\"wp-caption-text\">Figura 47. La funci\u00f3n <span class=\"courier\">eye()<\/span> utilizada dentro de un bucle<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En este ejemplo, antes del bucle hemos creado una variable para determinar el n\u00famero de ojos que queremos dibujar. Esa variable es usada a continuaci\u00f3n en el <em>test<\/em> del bucle. Dentro del bucle creamos tambi\u00e9n un par de variables que nos sirven para espaciar los ojos entre s\u00ed y determinar su tama\u00f1o en funci\u00f3n de esta separaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veamos c\u00f3mo podr\u00edamos resolver el problema planteado en el dibujo anterior: Como pod\u00e9is observar, con un par de l\u00edneas de c\u00f3digo se puede resolver lo que antes hac\u00edamos con m\u00e1s de veinte. Exploremos con detalle la estructura de un bucle : \/\/ Un bucle for siempre tendr\u00e1 \/\/ la siguiente estructura: \/* for (estado inicial; [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/390"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=390"}],"version-history":[{"count":2,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/390\/revisions"}],"predecessor-version":[{"id":560,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/390\/revisions\/560"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}