{"id":944,"date":"2019-07-07T20:42:38","date_gmt":"2019-07-07T18:42:38","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=944"},"modified":"2019-09-02T17:56:27","modified_gmt":"2019-09-02T15:56:27","slug":"5-2-funcions","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/5-2-funcions\/","title":{"rendered":"5.2. Funcions"},"content":{"rendered":"<p>Les <strong>funcions<\/strong> ens permeten reaprofitar el codi que escrivim. Sovint, ens trobarem escrivint un codi que caldr\u00e0 fer servir en diferents llocs del mateix programa. Tenir el codi \u00abencapsulat\u00bb dins d\u2019una funci\u00f3 ens permetr\u00e0 tornar-lo a fer servir sense haver-lo d\u2019escriure de nou. Per\u00f2 no solament ens ser\u00e0 \u00fatil en el programa que estem fent, tamb\u00e9 ho pot ser en altres programes. Posar aquest codi en una funci\u00f3 ens permetr\u00e0 copiar-lo i enganxar-lo per a fer-lo servir r\u00e0pidament en un altre programa que fem.<\/p>\n<p>Fixem-nos, per exemple, en la instrucci\u00f3\/funci\u00f3 <span style=\"font-family: Courier, Arial;\">stroke()<\/span>. Quan la cridem, posem un valor entre els par\u00e8ntesis i la funci\u00f3 fa unes determinades operacions per tal que les l\u00ednies que pintem a continuaci\u00f3 tinguin un determinat color. Nosaltres podem definir les nostres pr\u00f2pies funcions que facin les operacions que nosaltres vulguem.<\/p>\n<p>Fem un petit exemple.<\/p>\n<p>Fem un dibuix d\u2019un quadrat amb degradat, similar al que hem vist en l\u2019apartat \u00ab2. Repte 2. Aut\u00f2mats\u00bb. Les instruccions que donar\u00edem serien aquestes:<\/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>Amb aix\u00f2 farem un quadrat que \u00e9s una quarta part m\u00e9s petit que el que ten\u00edem abans. Ara suposem que volem fer aix\u00f2:<\/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>\u00c9s a dir, dibuixar 16 quadres amb degradat. Ara mateix l\u2019\u00fanica soluci\u00f3 que se\u2019ns acudeix \u00e9s escriure 16 cops el <strong><span style=\"font-family: Courier, Arial;\">for<\/span><\/strong> amb els canvis corresponents a <span style=\"font-family: Courier, Arial;\">xIni<\/span> i <span style=\"font-family: Courier, Arial;\">yIni<\/span>. Per\u00f2 hi ha una manera m\u00e9s f\u00e0cil de fer-ho, creant una funci\u00f3:<\/p>\n<pre>function quadratDegradat(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>Ara, si al nostre programa escrivim:<\/p>\n<pre>quadratDegradat(50,50);<\/pre>\n<p>El que estarem fent \u00e9s executar la repetici\u00f3, per\u00f2 fent que les variables <strong>x<\/strong> i <strong>y<\/strong> prenguin els valors de 50 i 50. Proveu-ho, aquest \u00e9s el programa complet:<\/p>\n<pre>function setup() {\r\n createCanvas(480, 480);\r\n}\r\n\r\nfunction draw() {\r\n quadratDegradat(50,50);\r\n}\r\n\r\nfunction quadratDegradat(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>Per tant, per a fer 16 repeticions en comptes de fer 16 instruccions <span style=\"font-family: Courier, Arial;\"><strong>for<\/strong><\/span>, cridarem a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">quadratDegradat()<\/span> 16 vegades.<\/p>\n<p>El programa quedaria de la manera seg\u00fcent:<\/p>\n<pre>function setup() {\r\n createCanvas(480, 480);\r\n}\r\n\r\nfunction draw() {\r\n background(204);\r\n quadratDegradat(50,50);\r\n quadratDegradat(50,150);\r\n quadratDegradat(50,250);\r\n quadratDegradat(50,350);\r\n quadratDegradat(150,50);\r\n quadratDegradat(150,150);\r\n quadratDegradat(150,250);\r\n quadratDegradat(150,350);\r\n quadratDegradat(250,50);\r\n quadratDegradat(250,150);\r\n quadratDegradat(250,250);\r\n quadratDegradat(250,350);\r\n quadratDegradat(350,50);\r\n quadratDegradat(350,150);\r\n quadratDegradat(350,250);\r\n quadratDegradat(350,350);\r\n}\r\n\r\nfunction quadratDegradat(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>Fixeu-vos b\u00e9 en aquest programa. \u00c9s f\u00e0cil de veure que hi ha un munt de repeticions. Intentem simplificar-ho.<\/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 quadratDegradat(i,50);\r\n\u00a0\u00a0\u00a0 quadratDegradat(i,150);\r\n\u00a0\u00a0\u00a0 quadratDegradat(i,250);\r\n\u00a0\u00a0\u00a0 quadratDegradat(i,350);\r\n }\r\n}<\/pre>\n<p>Aix\u00f2 tamb\u00e9 funcionar\u00e0 i hem simplificat for\u00e7a el programa. Encara es podria simplificar una mica m\u00e9s. Per\u00f2 ara ho podem deixar aqu\u00ed.<\/p>\n<p>Passem al llibre. Les funcions estan explicades en el cap\u00edtol 9. All\u00e0 hi tenim uns quants exemples. En l\u2019exemple 9-1, es fan servir algunes instruccions que encara no hem fet servir:<\/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> escriu un text a la consola de JavaScript. En el repte anterior, hem explicat com accedir a la consola del nostre navegador, per\u00f2 des de l\u2019editor <em>online<\/em>, tamb\u00e9 la podem veure, est\u00e0 a la part de sota del bloc de codi.<\/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> es queda amb la part entera d\u2019un nombre amb decimals (de 4,25 ens deixa nom\u00e9s 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> ens retorna un nombre a l\u2019atzar que est\u00e0 entre 0 i el nombre que posem dins el par\u00e8ntesi (<span style=\"font-family: Courier, Arial;\">random(25)<\/span> ens retornar\u00e0 un nombre entre 0 i 24,999). <span style=\"font-family: Courier, Arial;\">random()<\/span> retorna nombres amb decimals. Tamb\u00e9 podem fer servir dos par\u00e0metres, per exemple <span style=\"font-family: Courier, Arial;\">random(5,20)<\/span> i, en aquest cas, ens retornar\u00e0 un nombre entre 5 i 19,99.<\/li>\n<\/ul>\n<p>L\u2019exemple 9-1 crea una funci\u00f3 que anomena <span style=\"font-family: Courier, Arial;\">rollDice()<\/span>, a qu\u00e8 li indica un valor que serveix com a base per a calcular un nombre aleatori. Aix\u00ed, si el nombre que s\u2019indica \u00e9s un 5, es calcular\u00e0 un nombre aleatori entre 1 i 5. Per\u00f2, analitzem millor la instrucci\u00f3:<\/p>\n<pre>var d = 1 + int(random(numSides));<\/pre>\n<p>En aquesta instrucci\u00f3 fem servir dues funcions:<\/p>\n<ol>\n<li><span style=\"font-family: Courier, Arial;\">int()<\/span> at\u00e8s un nombre amb decimals retorna el mateix nombre sense decimals. Aix\u00ed si fem <span style=\"font-family: Courier, Arial;\">x = int(25.3)<\/span> el que farem ser\u00e0 guardar a <strong>x<\/strong> un 25.<\/li>\n<li><span style=\"font-family: Courier, Arial;\">random()<\/span> at\u00e8s un nombre, retorna un valor aleatori entre 0 i el nombre. B\u00e9, m\u00e9s o menys, en realitat <span style=\"font-family: Courier, Arial;\">random(5)<\/span> retorna un valor entre 0 i 4.9999. Com que \u00e9s un nombre amb decimals, necessitem <span style=\"font-family: Courier, Arial;\">int()<\/span> per a treure els decimals.<\/li>\n<\/ol>\n<p>Aix\u00ed, l\u2019exemple 9-1 el que fa es calcular tres nombres aleatoris (dos entre 1 i 20 i un altre entre 1 i 6) i escriu <em>Rolling\u2026<\/em> i el nombre trobat els tres cops.<\/p>\n<p>L\u2019exemple 9-2 \u00e9s el mateix programa sense la funci\u00f3, per\u00f2 el m\u00e9s interessant \u00e9s que ens explica perqu\u00e8 les funcions s\u00f3n interessants i molt \u00fatils.<\/p>\n<p>Els exemples 9-3, 9-4, 9-5 i 9-6 s\u2019assemblen molt al que hem vist en aquesta guia amb els quadrats i el degradat.<\/p>\n<p>L\u2019exemple 9-7, \u00e9s semblant als anteriors, per\u00f2 s\u2019ha modificat la funci\u00f3 per tal que li puguem dir no solament la posici\u00f3 on posarem el mussol, sin\u00f3 tamb\u00e9 el color (en escala de grisos) i l\u2019escala.<\/p>\n<p>Aquests valors que indiquem a la funci\u00f3 els anomenem <strong>par\u00e0metres<\/strong>. En aquest cas, la funci\u00f3 <span style=\"font-family: Courier, Arial;\">owl<\/span> rep quatre par\u00e0metres: posici\u00f3 horitzontal (<strong>x<\/strong>), posici\u00f3 vertical (<strong>y<\/strong>), color (g) i escala (s).<\/p>\n<pre>function owl(x,y,g,s)<\/pre>\n<h2>Retornar un valor<\/h2>\n<p>Les funcions, a m\u00e9s de rebre valors, tamb\u00e9 els poden retornar. Per\u00f2 a difer\u00e8ncia dels par\u00e0metres (una funci\u00f3 pot rebre m\u00e9s d\u2019un par\u00e0metre), nom\u00e9s poden retornar un valor. L\u2019exemple 9-8 \u00e9s f\u00e0cil d\u2019entendre, tenim una funci\u00f3 que rep un par\u00e0metre, fa un c\u00e0lcul i retorna el resultat.<\/p>\n<p>El cap\u00edtol 9 del llibre acaba amb un exemple curi\u00f3s. Val la pena provar el codi i fer canvis en aquest.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les funcions ens permeten reaprofitar el codi que escrivim. Sovint, ens trobarem escrivint un codi que caldr\u00e0 fer servir en diferents llocs del mateix programa. Tenir el codi \u00abencapsulat\u00bb dins d\u2019una funci\u00f3 ens permetr\u00e0 tornar-lo a fer servir sense haver-lo d\u2019escriure de nou. Per\u00f2 no solament ens ser\u00e0 \u00fatil en el programa que estem fent, [&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\/wp-json\/wp\/v2\/pages\/944"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/comments?post=944"}],"version-history":[{"count":13,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/944\/revisions"}],"predecessor-version":[{"id":4206,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/944\/revisions\/4206"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/media?parent=944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}