{"id":2744,"date":"2008-12-08T00:57:00","date_gmt":"2008-12-07T23:57:00","guid":{"rendered":"http:\/\/www.hyperbate.com\/dernier\/?p=2744"},"modified":"2008-12-08T00:57:00","modified_gmt":"2008-12-07T23:57:00","slug":"processing-douzieme-cours","status":"publish","type":"post","link":"https:\/\/hyperbate.fr\/dernier\/?p=2744","title":{"rendered":"Processing, douzi\u00e8me cours"},"content":{"rendered":"<p>Apr\u00e8s les variables, les tableaux, parfois appel\u00e9s listes. Ce sujet n&rsquo;est pas toujours le plus simple \u00e0 comprendre ou en tout cas \u00e0 faire comprendre (peut-\u00eatre est-ce juste moi qui l&rsquo;explique mal). Il faut dire que le tableau est un type de donn\u00e9e dont l&rsquo;usage est assez abstrait, rien \u00e0 voir avec les commandes de dessin g\u00e9om\u00e9trique de Processing dont l&rsquo;utilit\u00e9 est imm\u00e9diate et \u00e9vidente.<br \/>\nUn tableau est tout b\u00eatement un ensemble de variables (qui doivent imp\u00e9rativement \u00eatre du m\u00eame type, dans le cas de Processing). Cet exemple le montre de mani\u00e8re simple :<\/p>\n<div class=\"code\">\n<pre>String[] animaux = {\"chat\", \"chien\", \"cheval\", \"lapin\", \"souris\"};\nprint (animaux[2]);<\/pre>\n<\/div>\n<p>Si vous lancez ce programme, vous verrez ceci :<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2745\" src=\"\/dernier\/files\/2008\/12\/liste_animaux.png\" alt=\"\" width=\"530\" height=\"314\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/liste_animaux.png 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/liste_animaux-300x177.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Tout d&rsquo;abord, une fen\u00eatre d&rsquo;affichage de la taille et de la couleur par d\u00e9faut s&rsquo;ouvre, mais elle ne contient rien, puisque nous ne l&rsquo;utilisons pas.<br \/>\nDans la zone noire, qui est la zone dite \u00ab\u00a0de texte\u00a0\u00bb et qui permet \u00e0 Processing de nous adresser des messages sollicit\u00e9s (en gris) ou des messages d&rsquo;erreur (en orange), on peut voir \u00e9crit le mot \u00ab\u00a0cheval\u00a0\u00bb. La commande <strong>print()<\/strong> sert en effet \u00e0 afficher quelque chose dans la zone de texte \u2014 si j&rsquo;\u00e9cris <em>print(\u00ab\u00a0bonjour\u00a0\u00bb)<\/em> dans le programme, le mot <em>bonjour <\/em>s&rsquo;affichera dans la zone de texte.<br \/>\nIci nous avons demand\u00e9 \u00e0 Processing de nous donner le troisi\u00e8me \u00e9l\u00e9ment (la num\u00e9rotation commence \u00e0 z\u00e9ro) de la liste <em>animaux<\/em>, cr\u00e9\u00e9e sur la ligne du dessus.<br \/>\nRevenons un peu en arri\u00e8re.<br \/>\nEn \u00e9crivant <em>String[] animaux<\/em>, je d\u00e9clare un \u00ab\u00a0tableau\u00a0\u00bb de cha\u00eenes de caract\u00e8re dont le nom est \u00ab\u00a0animaux\u00a0\u00bb. Ce sont les deux crochets qui suivent le type qui signifient qu&rsquo;il s&rsquo;agit d&rsquo;un tableau et non d&rsquo;une variable isol\u00e9e. Tout en d\u00e9clarant ce tableau, je lui ai attribu\u00e9 un contenu entre accolades, contenu qui est une suite de cha\u00eenes de caract\u00e8res s\u00e9par\u00e9es par des virgules. Son premier \u00e9l\u00e9ment est le mot \u00ab\u00a0<em>chat<\/em>\u00ab\u00a0, le second est le mot \u00ab\u00a0<em>chien<\/em>\u00ab\u00a0, et ainsi de suite.<br \/>\nPour Processing (comme pour de nombreux langages), ma liste contient cinq \u00e9l\u00e9ments, num\u00e9rot\u00e9s 0, 1, 2, 3 et 4. Si je souhaite acc\u00e9der au premier \u00e9l\u00e9ment je demanderais <em>animaux[0]<\/em>.<br \/>\nSi je souhaite remplacer le mot \u00ab\u00a0<em>lapin<\/em>\u00a0\u00bb par le mot \u00ab\u00a0<em>li\u00e8vre<\/em>\u00a0\u00bb j&rsquo;\u00e9crirais <em>animaux[3]=\u00a0\u00bbli\u00e8vre\u00a0\u00bb<\/em>. Pour ajouter un sixi\u00e8me animal, par exemple l&rsquo;\u00e9l\u00e9phant, \u00e0 ma liste, c&rsquo;est un peu plus compliqu\u00e9, je dois \u00e9crire ceci :<\/p>\n<div class=\"code\">\n<pre>animaux = append (animaux, \"\u00e9l\u00e9phant\");<\/pre>\n<\/div>\n<p>(la commande <strong>append(tableau, valeur) <\/strong>signifie que l&rsquo;on ajoute une valeur \u00e0 la fin d&rsquo;un tableau).<br \/>\nPour ajouter une valeur \u00e0 un emplacement pr\u00e9cis du tableau on utilise la commande splice(liste, valeur, position). La ligne qui suit intercalera le mot \u00ab\u00a0toucan\u00a0\u00bb entre les mots \u00ab\u00a0chien\u00a0\u00bb et \u00ab\u00a0cheval\u00a0\u00bb, c&rsquo;est \u00e0 dire \u00e0 la place 2.<\/p>\n<div class=\"code\">\n<pre>animaux = splice(animaux , \"toucan\", 2);<\/pre>\n<\/div>\n<p>Pour enlever sa derni\u00e8re valeur \u00e0 un tableau, la commande est <strong>shorten(tableau)<\/strong>, comme ceci :<\/p>\n<div class=\"code\">\n<pre>animaux = shorten(animaux);<\/pre>\n<\/div>\n<p>La syntaxe que j&rsquo;ai utilis\u00e9 plus haut pour d\u00e9clarer mon tableau tout en lui donnant un contenu n&rsquo;est pas typique. G\u00e9n\u00e9ralement, on \u00e9crit plus laborieusement ceci :<\/p>\n<div class=\"code\">\n<pre>int[] maListeDeChiffres = new int[12];<\/pre>\n<\/div>\n<p>qui signifie que je d\u00e9clare un tableau de 12 chiffres entiers, auxquels je pourrais donner des valeurs par la suite, par exemple comme ceci :<\/p>\n<div class=\"code\">\n<pre>maListeDeChiffres[0] = 128;\nmaListeDeChiffres[1] = 256\nmaListeDeChiffres[2] = 64;<\/pre>\n<p><em>etc. <\/em><\/div>\n<p>ou pourquoi pas \u00e0 l&rsquo;aide d&rsquo;une boucle, de cette mani\u00e8re :<\/p>\n<div class=\"code\">\n<pre>for(int a=0;a&lt;12;a++){\n  maListeDeChiffres[a]=a*10;\n}<\/pre>\n<\/div>\n<p>&#8230; Dans ce cas, ma liste contiendra les valeurs {0,10,20,30,40,50,60,70,80,90,100,110}<\/p>\n<p>On peut, par ailleurs, cr\u00e9er des tableaux de tableaux, comme ceci :<\/p>\n<div class=\"code\">\n<pre>int[][] monTableauAdeuxDimensions = new int[4][2];\nmonTableauAdeuxDimensions[0][0]= 10;\nmonTableauAdeuxDimensions[0][1]= 20;\nmonTableauAdeuxDimensions[1][0]= 15;\nmonTableauAdeuxDimensions[1][1]= 25;\nmonTableauAdeuxDimensions[2][0]= 143;\nmonTableauAdeuxDimensions[2][1]= 321;\nmonTableauAdeuxDimensions[3][0]= -10;\nmonTableauAdeuxDimensions[3][1]= 28;<\/pre>\n<\/div>\n<p>Ici je dis que je cr\u00e9e un tableau de type entier nomm\u00e9 monTableauAdeuxDimensions qui contient quatre \u00e9l\u00e9ments dont chacun est un tableau de deux \u00e9l\u00e9ments. Si je demande \u00e0 savoir quel est l&rsquo;\u00e9l\u00e9ment <em>monTableauAdeuxDimensions[2][1]<\/em>, il me sera r\u00e9pondu 321. En revanche, contrairement \u00e0 Java, C++, Php ou Javascript, Processing ne g\u00e8re pas les tableaux dits \u00ab\u00a0associatifs\u00a0\u00bb (o\u00f9 chaque valeur du tableau est associ\u00e9e \u00e0 une cl\u00e9), sujet sur lequel je ne m&rsquo;\u00e9tendrais donc pas bien qu&rsquo;il \u00e9tait important que je le signale.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2843\" src=\"\/dernier\/files\/2008\/12\/trainsiffleratroisfois.png\" alt=\"\" width=\"530\" height=\"142\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/trainsiffleratroisfois.png 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/trainsiffleratroisfois-300x80.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Pour conna\u00eetre le nombre d&rsquo;\u00e9l\u00e9ments d&rsquo;un tableau, on utilise la propri\u00e9t\u00e9 <code><strong>length<\/strong><\/code>. Ainsi, dans l&rsquo;exemple qui se trouve ci-dessus,\u00a0<code><strong>monTableauAdeuxDimensions.length<\/strong><\/code> a la valeur de 4 (il y a quatre \u00e9l\u00e9ments dans\u00a0<code><strong>monTableauAdeuxDimensions<\/strong><\/code>) et\u00a0<code><strong>monTableauAdeuxDimensions[0].length<\/strong><\/code> a la valeur de 2 car il y a deux \u00e9l\u00e9ments dans le premier \u00e9l\u00e9m\u00e9nt (num\u00e9rot\u00e9 z\u00e9ro) de\u00a0<code><strong>monTableauAdeuxDimensions<\/strong><\/code>.<br \/>\nUn exemple pratique.:<\/p>\n<div class=\"code\">\n<pre>int[] mesPositions = {1,3,6,11,17,24,32,41,51,62,73,84,95};\nfor(int i=0;i&lt;mesPositions.length;i++){\n\u00a0\u00a0line (0, mesPositions[i],100,mesPositions[i]);\n}<\/pre>\n<\/div>\n<p><img decoding=\"async\" class=\"imageadroite\" src=\"\/dernier\/files\/2008\/12\/lignes_liste_processing.png\" alt=\"\" width=\"100\" height=\"100\" align=\"right\" \/>Avec ces quelques lignes, nous commen\u00e7ons par d\u00e9clarer une liste de type entier (<code>int[]<\/code>), nomm\u00e9e <code>mesPositions<\/code> et contenant treize \u00e9l\u00e9ments num\u00e9riques : 1, 3, 6, 11, 17, etc.<br \/>\nNous ex\u00e9cutons ensuite une boucle qui utilise une variable nomm\u00e9e <code><strong>i<\/strong><\/code> dont la valeur va passer de <code><strong>0<\/strong><\/code> (z\u00e9ro) \u00e0 <code><strong>mesPositions.length<\/strong><\/code>, c&rsquo;est \u00e0 dire 13, puisque la liste mesPositions contient treize \u00e9l\u00e9ments.<br \/>\n\u00c0 chaque passe de cette boucle, une ligne est trac\u00e9e entre les points (0, mesPositions[i]) et (100, mesPositions[i]). Lors du premier passage, i sera \u00e9gal \u00e0 0, donc mesPositions[i] aura la valeur de mesPositions[0] c&rsquo;est \u00e0 dire 1. Ma premi\u00e8re ligne sera donc trac\u00e9e entre (0, 1) et (100,1). Au second passage, mesPositions[i] aura la valeur 3, donc la ligne sera trac\u00e9e entre (0,3) et (100,3). Et ainsi de suite. On peut le voir avec l&rsquo;illustration qui se trouve \u00e0 droite et qui est le produit ce programme : treize lignes sont trac\u00e9es, chacune commence \u00e0 gauche (abscisse : 0) et se termine \u00e0 droite (abscisse : 100) et a pour ordonn\u00e9e les chiffres contenus dans notre liste, \u00e0 savoir 1, 3, 6, 11, 17, etc.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2840\" src=\"\/dernier\/files\/2008\/12\/highnoon.png\" alt=\"\" width=\"530\" height=\"210\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/highnoon.png 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/highnoon-300x118.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Tr\u00e8s rapidement et \u00e0 l&rsquo;attention des programmeurs habitu\u00e9s \u00e0 manipuler des listes, quelques commandes utiles (cliquer sur leur nom pour obtenir la page correspondante dans la documentation de processing) :<\/p>\n<ul>\n<li><a href=\"http:\/\/www.processing.org\/reference\/arrayCopy_.html\" target=\"_blank\">arrayCopy()<\/a> permet de copier un tableau dans un autre ou de copier une partie d&rsquo;un tableau dans un autre tableau, \u00e9ventuellement \u00e0 une position pr\u00e9cise.<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/concat_.html\" target=\"_blank\">concat()<\/a> permet de concat\u00e9ner (d&rsquo;amalgamer) \u00a0deux tableaux.<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/reverse_.html\" target=\"_blank\">reverse()<\/a> permet d&rsquo;inverser l&rsquo;ordre des \u00e9l\u00e9ments d&rsquo;une liste.<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/sort_.html\" target=\"_blank\">sort()<\/a> permet de classer les \u00e9l\u00e9ments d&rsquo;une liste (par ordre num\u00e9rique ou alphab\u00e9tique).<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/splice_.html\" target=\"_blank\">splice()<\/a>, montr\u00e9 plus haut, permet d&rsquo;ajouter un ou plusieurs \u00e9l\u00e9ments \u00e0 un emplacement pr\u00e9cis d&rsquo;une liste.<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/subset_.html\" target=\"_blank\">subset()<\/a> permet d&rsquo;enlever un ou plusieurs \u00e9l\u00e9ments \u00e0 un emplacement pr\u00e9cis d&rsquo;une liste.<\/li>\n<li><a href=\"http:\/\/www.processing.org\/reference\/println_.html\" target=\"_blank\">println()<\/a> permet d&rsquo;afficher le contenu d&rsquo;une liste dans la zone de texte de processing.<\/li>\n<\/ul>\n<p>Signalons \u00e0 toutes fins utiles qu&rsquo;il existe une mani\u00e8re alternative pour cr\u00e9er et manipuler des tableaux qui est de recourir directement \u00e0 la classe Java <code>ArrayList<\/code>. Cette m\u00e9thode est assez souple, la classe ArrayList permettant d&rsquo;utiliser des commandes telles que <code>contains()<\/code> (pour v\u00e9rifier si un \u00e9l\u00e9ment se trouve dans la liste) ou <code>indexOf()<\/code> pour v\u00e9rifier \u00e0 quelle position dans la liste se trouve un \u00e9l\u00e9ment connu.\u00a0Le mode d&#8217;emploi de ArrayList se trouve <a href=\"http:\/\/java.sun.com\/j2se\/1.4.2\/docs\/api\/java\/util\/ArrayList.html\" target=\"_blank\">dans les pages de documentation de Java<\/a>.<\/p>\n<p>Dans la programmation orient\u00e9e objet, la syntaxe des commandes relatives aux listes est la m\u00eame mais impose une syntaxe redondante. Ainsi, si je veux cr\u00e9er un tableau de valeurs enti\u00e8res nomm\u00e9 liste et contenant les valeurs 0, 1, 2, 3 puis y ajouter la valeur 4, je dois \u00e9crire :<\/p>\n<div class=\"code\">\n<pre>int[] liste = {0,1,2,3};\nliste = append(liste, 4);<\/pre>\n<\/div>\n<p>En revanche, si j&rsquo;utilise une classe d&rsquo;objet invent\u00e9e par moi-m\u00eame, par exemple la classe \u00ab\u00a0bille\u00a0\u00bb, je devrais utiliser la commande <code>append()<\/code> comme suit :<\/p>\n<div class=\"code\">\n<pre>mesBilles = (bille[]) append (mesBilles, new bille());<\/pre>\n<\/div>\n<p>&#8230;Mais nous verrons cela dans le prochain article qui est justement consacr\u00e9 \u00e0 la programmation orient\u00e9e objet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s les variables, les tableaux, parfois appel\u00e9s listes. Ce sujet n&rsquo;est pas toujours le plus simple \u00e0 comprendre ou en tout cas \u00e0 faire comprendre (peut-\u00eatre est-ce juste moi qui l&rsquo;explique mal). Il faut dire que le tableau est un type de donn\u00e9e dont l&rsquo;usage est assez abstrait, rien \u00e0 voir avec les commandes de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40],"tags":[],"class_list":["post-2744","post","type-post","status-publish","format-standard","hentry","category-processing"],"_links":{"self":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2744"}],"version-history":[{"count":0,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2744\/revisions"}],"wp:attachment":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}