{"id":2018,"date":"2019-07-10T18:53:38","date_gmt":"2019-07-10T16:53:38","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=2018"},"modified":"2019-09-02T17:57:12","modified_gmt":"2019-09-02T15:57:12","slug":"5-2-funciones","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/5-2-funciones\/","title":{"rendered":"5.2. Funciones"},"content":{"rendered":"<p>Las <strong>funciones<\/strong> nos permiten reaprovechar el c\u00f3digo que escribimos. A menudo nos encontraremos escribiendo un c\u00f3digo que habr\u00e1 que usar en diferentes lugares del mismo programa. Tener el c\u00f3digo \u00abencapsulado\u00bb dentro de una funci\u00f3n nos permitir\u00e1 volverlo a usar sin tenerlo que escribir de nuevo. Pero no solo en el programa que estamos haciendo nos ser\u00e1 \u00fatil, lo puede ser tambi\u00e9n en otros programas. Poner este c\u00f3digo en una funci\u00f3n nos permitir\u00e1 copiarlo y pegarlo para usarlo r\u00e1pidamente en otro programa que hagamos.<\/p>\n<p>Fij\u00e9monos, por ejemplo, en la instrucci\u00f3n\/funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">stroke()<\/span>. Cuando la llamamos, ponemos un valor entre los par\u00e9ntesis y la funci\u00f3n hace unas determinadas operaciones para que las l\u00edneas que pintamos a continuaci\u00f3n tengan un determinado color. Nosotros podemos definir nuestras propias funciones que hagan las operaciones que nosotros queramos.<\/p>\n<p>Pongamos un peque\u00f1o ejemplo.<\/p>\n<p>Hagamos un dibujo de un cuadrado con degradado, similar al que hemos visto en el apartado \u00ab2. Reto 2. Aut\u00f3matas\u00bb. Las instrucciones que har\u00edamos ser\u00edan estas:<\/p>\n<pre>for (var i=0; i&lt;=255; i=i+4 ) {\r\n  stroke(i);\r\n  line(xIni+i\/4,yIni,xIni+i\/4,yIni+64);\r\n}<\/pre>\n<p>Con esto haremos un cuadrado que es una cuarta parte m\u00e1s peque\u00f1o que el que ten\u00edamos antes. Ahora supongamos que queremos hacer esto:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-966\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_001.jpg\" alt=\"\" width=\"400\" height=\"400\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_001.jpg 400w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_001-150x150.jpg 150w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_5_001-300x300.jpg 300w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Es decir, dibujar 16 cuadros con degradado. Ahora mismo la \u00fanica soluci\u00f3n que se nos ocurre es escribir 16 veces el <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> con los cambios correspondientes a <span style=\"font-family: Courier, Arial;\">xIni<\/span> e <span style=\"font-family: Courier, Arial;\">yIni<\/span>. Sin embargo, hay una manera m\u00e1s f\u00e1cil de hacerlo: creando una funci\u00f3n:<\/p>\n<pre>function cuadradoDegradado (x,y){\r\n  for (var i=0; i&lt;=255; i=i+4 ) {\r\n\u00a0\u00a0\u00a0\u00a0 stroke(i);\r\n\u00a0\u00a0\u00a0\u00a0 line(x+i\/4,y,x+i\/4,y+64);\r\n  }\r\n}<\/pre>\n<p>Ahora, si en nuestro programa escribimos:<\/p>\n<pre>cuadradoDegradado(50,50);<\/pre>\n<p>Lo que estaremos haciendo es ejecutar la repetici\u00f3n, pero haciendo que las variables <strong>x<\/strong>\u00a0e <strong>y<\/strong>\u00a0tomen los valores de 50 y 50. Probadlo, este es el programa completo:<\/p>\n<pre>function setup() {\r\n createCanvas(480, 480);\r\n}\r\n\r\nfunction draw() {\r\n cuadradoDegradado(50,50);\r\n}\r\n\r\nfunction cuadradoDegradado(x,y){\r\n for (var i=0; i&lt;=255; i=i+4 ) {\r\n\u00a0\u00a0\u00a0\u00a0 stroke(i);\r\n\u00a0\u00a0\u00a0\u00a0 line(x+i\/4,y,x+i\/4,y+64);\r\n }\r\n}<\/pre>\n<p>Por lo tanto, para hacer 16 repeticiones en vez de hacer 16 instrucciones <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong>, llamaremos a la funci\u00f3n <span style=\"font-family: Courier, Arial;\">cuadradoDegradado()<\/span> 16 veces.<\/p>\n<p>El programa quedar\u00eda de la siguiente manera:<\/p>\n<pre>function setup() {\r\n createCanvas(480, 480);\r\n}\r\n\r\nfunction draw() {\r\n background(204);\r\n cuadradoDegradado(50,50);\r\n cuadradoDegradado(50,150);\r\n cuadradoDegradado(50,250);\r\n cuadradoDegradado(50,350);\r\n cuadradoDegradado(150,50);\r\n cuadradoDegradado(150,150);\r\n cuadradoDegradado(150,250);\r\n cuadradoDegradado(150,350);\r\n cuadradoDegradado(250,50);\r\n cuadradoDegradado(250,150);\r\n cuadradoDegradado(250,250);\r\n cuadradoDegradado(250,350);\r\n cuadradoDegradado(350,50);\r\n cuadradoDegradado(350,150);\r\n cuadradoDegradado(350,250);\r\n cuadradoDegradado(350,350);\r\n}\r\n\r\nfunction cuadradoDegradado(xIni,yIni){\r\n for (var i=0; i&lt;=255; i=i+4 ) {\r\n\u00a0\u00a0\u00a0\u00a0 stroke(i);\r\n\u00a0\u00a0\u00a0\u00a0 line(xIni+i\/4,yIni,xIni+i\/4,yIni+64);\r\n }\r\n}<\/pre>\n<p>Fijaos bien en este programa. Es f\u00e1cil ver que hay un mont\u00f3n de repeticiones. Tratemos de simplificar.<\/p>\n<pre>function draw() {\r\n background(204);\r\n for (var i = 50; i &lt;= 350; i = i +100){\r\n\u00a0\u00a0\u00a0 cuadradoDegradado(i,50);\r\n\u00a0\u00a0\u00a0 cuadradoDegradado(i,150);\r\n\u00a0\u00a0\u00a0 cuadradoDegradado(i,250);\r\n\u00a0\u00a0\u00a0 cuadradoDegradado(i,350);\r\n }\r\n}<\/pre>\n<p>Esto tambi\u00e9n funcionar\u00e1, y hemos simplificado bastante el programa. Todav\u00eda se podr\u00eda simplificar algo m\u00e1s. Pero ahora lo podemos dejar aqu\u00ed.<\/p>\n<p>Vamos al libro. Las funciones est\u00e1n explicadas en el cap\u00edtulo 9. Ah\u00ed tenemos unos cuantos ejemplos. En el ejemplo 9-1 se usan algunas instrucciones que a\u00fan no hemos usado:<\/p>\n<ul>\n<li><a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/print\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">print()<\/span><\/a> escribe un texto en la consola de JavaScript. En el reto anterior tenemos explicado c\u00f3mo acceder a la consola de nuestro navegador, pero en el editor en l\u00ednea, tambi\u00e9n la podemos ver, est\u00e1 en la parte de debajo del bloque de c\u00f3digo.<\/li>\n<li><a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/int\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">int()<\/span><\/a> se queda con la parte entera de un n\u00famero con decimales (de 4,25 nos deja solo el 4).<\/li>\n<li><a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/random\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">random()<\/span><\/a> nos devuelve un n\u00famero al azar que est\u00e1 entre 0 y el n\u00famero que ponemos dentro de los par\u00e9ntesis (<span style=\"font-family: Courier, Arial;\">random(25)<\/span> nos devolver\u00e1 un n\u00famero entre 0 y 24,999). <span style=\"font-family: Courier, Arial;\">random()<\/span> devuelve n\u00fameros con decimales. Tambi\u00e9n podemos usar dos par\u00e1metros, por ejemplo <span style=\"font-family: Courier, Arial;\">random(5,20)<\/span> y, en este caso, nos devolver\u00e1 un n\u00famero entre 5 y 19,99.<\/li>\n<\/ul>\n<p>En el ejemplo 9-1 se crea una funci\u00f3n a la que denomina\u00a0<span style=\"font-family: Courier, Arial;\">rollDice()<\/span>, y a la cual le pasa un valor que sirve como base para calcular un n\u00famero aleatorio. As\u00ed, si el n\u00famero que se pasa es un 5, se calcular\u00e1 un n\u00famero aleatorio entre 1 y 5. Pero analicemos mejor la instrucci\u00f3n:<\/p>\n<pre>var d = 1 + int(random(numSides));<\/pre>\n<p>En esta instrucci\u00f3n usamos dos funciones:<\/p>\n<ol>\n<li><span style=\"font-family: Courier, Arial;\">int()<\/span>\u00a0que, dado un n\u00famero con decimales, devuelve el mismo n\u00famero sin decimales. As\u00ed, si hacemos\u00a0<span style=\"font-family: Courier, Arial;\">x = int(25.3)<\/span> lo que haremos ser\u00e1 guardar en <strong>x<\/strong> un 25.<\/li>\n<li><span style=\"font-family: Courier, Arial;\">random()<\/span>\u00a0que, dado un n\u00famero, devuelve un valor aleatorio entre 0 y el n\u00famero. Bien, m\u00e1s o menos, en realidad\u00a0<span style=\"font-family: Courier, Arial;\">random(5)<\/span> devuelve un valor entre 0 y 4.9999. Como es un n\u00famero con decimales, necesitamos\u00a0<span style=\"font-family: Courier, Arial;\">int()<\/span> para sacar los decimales.<\/li>\n<\/ol>\n<p>As\u00ed, el ejemplo 9-1 lo que hace es calcular tres n\u00fameros aleatorios (dos entre 1 y 20 y uno entre 1 y 6) y escribir <em>Rolling\u2026<\/em> y el n\u00famero encontrado las tres veces.<\/p>\n<p>El ejemplo 9-2 es el mismo programa sin la funci\u00f3n, pero lo m\u00e1s interesante es que nos explica por qu\u00e9 las funciones son interesantes y muy \u00fatiles.<\/p>\n<p>Los ejemplos 9-3, 9-4, 9-5 y 9-6 se parecen mucho a lo que hemos visto en esta gu\u00eda con los cuadrados y el degradado.<\/p>\n<p>El ejemplo 9-7 es parecido a los anteriores, pero se ha modificado la funci\u00f3n para que le podamos decir no solo la posici\u00f3n donde pondremos el b\u00faho, sino tambi\u00e9n el color (en escalera de grises) y la escala.<\/p>\n<p>A estos valores que pasamos a la funci\u00f3n los llamamos <strong>par\u00e1metros<\/strong>. En este caso, la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">owl<\/span> recibe cuatro par\u00e1metros: posici\u00f3n horizontal (<strong>x<\/strong>), posici\u00f3n vertical (<strong>y<\/strong>), color (g) y escala (s).<\/p>\n<pre>function owl(x,y,g,s)<\/pre>\n<h2><span lang=\"es\">Devolver un valor<\/span><\/h2>\n<p>Las funciones, adem\u00e1s de recibir valores, tambi\u00e9n los pueden devolver. Pero a diferencia de los par\u00e1metros (una funci\u00f3n puede recibir m\u00e1s de un par\u00e1metro), solo pueden devolver un valor. El ejemplo 9-8 es f\u00e1cil de entender; tenemos una funci\u00f3n que recibe un par\u00e1metro, hace un c\u00e1lculo y devuelve el resultado.<\/p>\n<p>El cap\u00edtulo 9 del libro acaba con un ejemplo curioso. Vale la pena probar el c\u00f3digo y hacer cambios en \u00e9l.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las funciones nos permiten reaprovechar el c\u00f3digo que escribimos. A menudo nos encontraremos escribiendo un c\u00f3digo que habr\u00e1 que usar en diferentes lugares del mismo programa. Tener el c\u00f3digo \u00abencapsulado\u00bb dentro de una funci\u00f3n nos permitir\u00e1 volverlo a usar sin tenerlo que escribir de nuevo. Pero no solo en el programa que estamos haciendo nos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false},"acf":[],"_links":{"self":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2018"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/comments?post=2018"}],"version-history":[{"count":18,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2018\/revisions"}],"predecessor-version":[{"id":4207,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2018\/revisions\/4207"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/media?parent=2018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}